- data E a where
- VRef :: V a -> E a
- Const :: a -> E a
- Cast :: (NumE a, NumE b) => E a -> E b
- Add :: NumE a => E a -> E a -> E a
- Sub :: NumE a => E a -> E a -> E a
- Mul :: NumE a => E a -> E a -> E a
- Div :: NumE a => E a -> E a -> E a
- Mod :: IntegralE a => E a -> E a -> E a
- Not :: E Bool -> E Bool
- And :: E Bool -> E Bool -> E Bool
- BWNot :: IntegralE a => E a -> E a
- BWAnd :: IntegralE a => E a -> E a -> E a
- BWOr :: IntegralE a => E a -> E a -> E a
- Shift :: IntegralE a => E a -> Int -> E a
- Eq :: EqE a => E a -> E a -> E Bool
- Lt :: OrdE a => E a -> E a -> E Bool
- Mux :: E Bool -> E a -> E a -> E a
- F2B :: E Float -> E Word32
- D2B :: E Double -> E Word64
- B2F :: E Word32 -> E Float
- B2D :: E Word64 -> E Double
- Retype :: UE -> E a
- Pi :: FloatingE a => E a
- Exp :: FloatingE a => E a -> E a
- Log :: FloatingE a => E a -> E a
- Sqrt :: FloatingE a => E a -> E a
- Pow :: FloatingE a => E a -> E a -> E a
- Sin :: FloatingE a => E a -> E a
- Asin :: FloatingE a => E a -> E a
- Cos :: FloatingE a => E a -> E a
- Acos :: FloatingE a => E a -> E a
- Sinh :: FloatingE a => E a -> E a
- Cosh :: FloatingE a => E a -> E a
- Asinh :: FloatingE a => E a -> E a
- Acosh :: FloatingE a => E a -> E a
- Atan :: FloatingE a => E a -> E a
- Atanh :: FloatingE a => E a -> E a
- data V a = V UV
- data UE
- = UVRef UV
- | UConst Const
- | UCast Type UE
- | UAdd UE UE
- | USub UE UE
- | UMul UE UE
- | UDiv UE UE
- | UMod UE UE
- | UNot UE
- | UAnd [UE]
- | UBWNot UE
- | UBWAnd UE UE
- | UBWOr UE UE
- | UShift UE Int
- | UEq UE UE
- | ULt UE UE
- | UMux UE UE UE
- | UF2B UE
- | UD2B UE
- | UB2F UE
- | UB2D UE
- | UPi
- | UExp UE
- | ULog UE
- | USqrt UE
- | UPow UE UE
- | USin UE
- | UAsin UE
- | UCos UE
- | UAcos UE
- | USinh UE
- | UCosh UE
- | UAsinh UE
- | UAcosh UE
- | UAtan UE
- | UAtanh UE
- data UV
- data A a = A UA
- data UA
- class Eq a => Expr a where
- data Expression
- data Variable
- data Type
- data Const
- class Width a where
- class TypeOf a where
- bytes :: Width a => a -> Int
- ue :: Expr a => E a -> UE
- uv :: V a -> UV
- ueUpstream :: UE -> [UE]
- nearestUVs :: UE -> [UV]
- arrayIndices :: UE -> [(UA, UE)]
- class (Num a, Expr a, EqE a, OrdE a) => NumE a
- class (NumE a, Integral a) => IntegralE a
- class (RealFloat a, NumE a, OrdE a) => FloatingE a
- class (Eq a, Expr a) => EqE a
- class (Eq a, Ord a, EqE a) => OrdE a
- true :: E Bool
- false :: E Bool
- value :: V a -> E a
- not_ :: E Bool -> E Bool
- (&&.) :: E Bool -> E Bool -> E Bool
- (||.) :: E Bool -> E Bool -> E Bool
- and_ :: [E Bool] -> E Bool
- or_ :: [E Bool] -> E Bool
- any_ :: (a -> E Bool) -> [a] -> E Bool
- all_ :: (a -> E Bool) -> [a] -> E Bool
- imply :: E Bool -> E Bool -> E Bool
- (==.) :: EqE a => E a -> E a -> E Bool
- (/=.) :: EqE a => E a -> E a -> E Bool
- (<.) :: OrdE a => E a -> E a -> E Bool
- (<=.) :: OrdE a => E a -> E a -> E Bool
- (>.) :: OrdE a => E a -> E a -> E Bool
- (>=.) :: OrdE a => E a -> E a -> E Bool
- min_ :: OrdE a => E a -> E a -> E a
- minimum_ :: OrdE a => [E a] -> E a
- max_ :: OrdE a => E a -> E a -> E a
- maximum_ :: OrdE a => [E a] -> E a
- limit :: OrdE a => E a -> E a -> E a -> E a
- div_ :: IntegralE a => E a -> E a -> E a
- div0_ :: IntegralE a => E a -> E a -> a -> E a
- mod_ :: IntegralE a => E a -> E a -> E a
- mod0_ :: IntegralE a => E a -> E a -> a -> E a
- mux :: Expr a => E Bool -> E a -> E a -> E a
- (!) :: (Expr a, IntegralE b) => A a -> E b -> V a
- (!.) :: (Expr a, IntegralE b) => A a -> E b -> E a
- ubool :: Bool -> UE
- unot :: UE -> UE
- uand :: UE -> UE -> UE
- uor :: UE -> UE -> UE
- ueq :: UE -> UE -> UE
- umux :: UE -> UE -> UE -> UE
Types
A typed expression.
VRef :: V a -> E a | |
Const :: a -> E a | |
Cast :: (NumE a, NumE b) => E a -> E b | |
Add :: NumE a => E a -> E a -> E a | |
Sub :: NumE a => E a -> E a -> E a | |
Mul :: NumE a => E a -> E a -> E a | |
Div :: NumE a => E a -> E a -> E a | |
Mod :: IntegralE a => E a -> E a -> E a | |
Not :: E Bool -> E Bool | |
And :: E Bool -> E Bool -> E Bool | |
BWNot :: IntegralE a => E a -> E a | |
BWAnd :: IntegralE a => E a -> E a -> E a | |
BWOr :: IntegralE a => E a -> E a -> E a | |
Shift :: IntegralE a => E a -> Int -> E a | |
Eq :: EqE a => E a -> E a -> E Bool | |
Lt :: OrdE a => E a -> E a -> E Bool | |
Mux :: E Bool -> E a -> E a -> E a | |
F2B :: E Float -> E Word32 | |
D2B :: E Double -> E Word64 | |
B2F :: E Word32 -> E Float | |
B2D :: E Word64 -> E Double | |
Retype :: UE -> E a | |
Pi :: FloatingE a => E a | |
Exp :: FloatingE a => E a -> E a | |
Log :: FloatingE a => E a -> E a | |
Sqrt :: FloatingE a => E a -> E a | |
Pow :: FloatingE a => E a -> E a -> E a | |
Sin :: FloatingE a => E a -> E a | |
Asin :: FloatingE a => E a -> E a | |
Cos :: FloatingE a => E a -> E a | |
Acos :: FloatingE a => E a -> E a | |
Sinh :: FloatingE a => E a -> E a | |
Cosh :: FloatingE a => E a -> E a | |
Asinh :: FloatingE a => E a -> E a | |
Acosh :: FloatingE a => E a -> E a | |
Atan :: FloatingE a => E a -> E a | |
Atanh :: FloatingE a => E a -> E a |
Variables updated by state transition rules.
An untyped term.
UVRef UV | |
UConst Const | |
UCast Type UE | |
UAdd UE UE | |
USub UE UE | |
UMul UE UE | |
UDiv UE UE | |
UMod UE UE | |
UNot UE | |
UAnd [UE] | |
UBWNot UE | |
UBWAnd UE UE | |
UBWOr UE UE | |
UShift UE Int | |
UEq UE UE | |
ULt UE UE | |
UMux UE UE UE | |
UF2B UE | |
UD2B UE | |
UB2F UE | |
UB2D UE | |
UPi | |
UExp UE | |
ULog UE | |
USqrt UE | |
UPow UE UE | |
USin UE | |
UAsin UE | |
UCos UE | |
UAcos UE | |
USinh UE | |
UCosh UE | |
UAsinh UE | |
UAcosh UE | |
UAtan UE | |
UAtanh UE |
Untyped variables.
An untyped array.
class Eq a => Expr a whereSource
expression :: E a -> ExpressionSource
data Expression Source
The type of a E
.
ueUpstream :: UE -> [UE]Source
The list of UEs adjacent upstream of a UE.
nearestUVs :: UE -> [UV]Source
The list of all UVs that directly control the value of an expression.
arrayIndices :: UE -> [(UA, UE)]Source
All array indexing subexpressions.
Constants
Variable Reference and Assignment
Logical Operations
Equality and Comparison
Arithmetic Operations
div_ :: IntegralE a => E a -> E a -> E aSource
Division. If both the dividend and divisor are constants, a compile-time
check is made for divide-by-zero. Otherwise, if the divisor ever evaluates
to 0
, a runtime exception will occur, even if the division occurs within
the scope of a cond
or mux
that tests for 0
(because Atom generates
deterministic-time code, every branch of a cond
or mux
is executed).
div0_ :: IntegralE a => E a -> E a -> a -> E aSource
Division, where the C code is instrumented with a runtime check to ensure
the divisor does not equal 0
. If it is equal to 0
, the 3rd argument is a
user-supplied non-zero divsor.
mod_ :: IntegralE a => E a -> E a -> E aSource
Modulo. If both the dividend and modulus are constants, a compile-time
check is made for divide-by-zero. Otherwise, if the modulus ever evaluates
to 0
, a runtime exception will occur, even if the division occurs within
the scope of a cond
or mux
that tests for 0
(because Atom generates
deterministic-time code, every branch of a cond
or mux
is executed).
mod0_ :: IntegralE a => E a -> E a -> a -> E aSource
Modulus, where the C code is instrumented with a runtime check to ensure
the modulus does not equal 0
. If it is equal to 0
, the 3rd argument is
a user-supplied non-zero divsor.
Conditional Operator
mux :: Expr a => E Bool -> E a -> E a -> E aSource
Conditional expression. Note, both branches are evaluated!
mux test onTrue onFalse