clash-lib-1.8.1: Clash: a functional hardware description language - As a library

Copyright | (C) 2021 QBayLogic B.V.
License | BSD2 (see the file LICENSE)
Maintainer | QBayLogic B.V. <devops@qbaylogic.com>
Safe Haskell | Safe-Inferred
Language | Haskell2010

Clash.Core.EqSolver

Description

Synopsis

- data TypeEqSolution
  - = Solution (TyVar, Type)
  - | AbsurdSolution
  - | NoSolution
- catSolutions :: [TypeEqSolution] -> [(TyVar, Type)]
- solveNonAbsurds :: TyConMap -> VarSet -> [(Type, Type)] -> [(TyVar, Type)]
- solveEq :: TyConMap -> VarSet -> (Type, Type) -> [TypeEqSolution]
- solveAdd :: VarSet -> (Type, Type) -> TypeEqSolution
- normalizeAdd :: (Type, Type) -> Maybe (Integer, Integer, Type)
- isAbsurdPat :: TyConMap -> Pat -> Bool
- isAbsurdEq :: TyConMap -> VarSet -> (Type, Type) -> Bool
- patEqs :: TyConMap -> Pat -> [(Type, Type)]
- typeEq :: TyConMap -> Type -> Maybe (Type, Type)

# 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

Show TypeEqSolution Source # |
Instance details Defined in Clash.Core.EqSolver Methods showsPrec :: Int -> TypeEqSolution -> ShowS Source # show :: TypeEqSolution -> String Source # showList :: [TypeEqSolution] -> ShowS Source #
Eq TypeEqSolution Source # |
Instance details Defined in Clash.Core.EqSolver Methods (==) :: TypeEqSolution -> TypeEqSolution -> Bool Source # (/=) :: TypeEqSolution -> TypeEqSolution -> Bool Source #

catSolutions :: [TypeEqSolution] -> [(TyVar, Type)] Source #

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.