clash-lib-1.5.0: Clash: a functional hardware description language - As a library
Copyright(C) 2021 QBayLogic B.V.
LicenseBSD2 (see the file LICENSE)
MaintainerQBayLogic B.V. <devops@qbaylogic.com>
Safe HaskellNone
LanguageHaskell2010

Clash.Core.EqSolver

Description

 
Synopsis

Documentation

data TypeEqSolution Source #

Data type that indicates what kind of solution (if any) was found

Constructors

Solution (TyVar, Type)

Solution was found. Variable equals some integer.

AbsurdSolution

A solution was found, but it involved negative naturals.

NoSolution

Given type wasn't an equation, or it was unsolvable.

Instances

Instances details
Eq TypeEqSolution Source # 
Instance details

Defined in Clash.Core.EqSolver

Show TypeEqSolution Source # 
Instance details

Defined in Clash.Core.EqSolver

solveNonAbsurds :: TyConMap -> VarSet -> [(Type, Type)] -> [(TyVar, Type)] Source #

Solve given equations and return all non-absurd solutions

solveEq :: TyConMap -> VarSet -> (Type, Type) -> [TypeEqSolution] Source #

Solve simple equalities such as:

  • a ~ 3
  • 3 ~ a
  • SomeType a b ~ SomeType 3 5
  • SomeType 3 5 ~ SomeType a b
  • SomeType a 5 ~ SomeType 3 b

solveAdd :: VarSet -> (Type, Type) -> TypeEqSolution Source #

Solve equations supported by normalizeAdd. See documentation of TypeEqSolution to understand the return value.

normalizeAdd :: (Type, Type) -> Maybe (Integer, Integer, Type) Source #

Given the left and right side of an equation, normalize it such that equations of the following forms:

  • 5 ~ n + 2
  • 5 ~ 2 + n
  • n + 2 ~ 5
  • 2 + n ~ 5

are returned as (5, 2, n)

isAbsurdPat :: TyConMap -> Pat -> Bool Source #

Tests for nonsencical patterns due to types being "absurd". See isAbsurdEq for more info.

isAbsurdEq Source #

Arguments

:: TyConMap 
-> VarSet

existential tvs

-> (Type, Type) 
-> Bool 

Determines if an "equation" obtained through patEqs or typeEq is absurd. That is, it tests if two types that are definitely not equal are asserted to be equal OR if the computation of the types yield some absurd (intermediate) result such as -1.

patEqs :: TyConMap -> Pat -> [(Type, Type)] Source #

Get constraint equations

typeEq :: TyConMap -> Type -> Maybe (Type, Type) Source #

If type is an equation, return LHS and RHS.