Safe Haskell | None |
---|
Names used in the Disciple Core Salt language profile.
- data Name
- = NameVar String
- | NameCon String
- | NameObjTyCon
- | NamePrimTyCon PrimTyCon
- | NamePrimOp PrimOp
- | NameLitVoid
- | NameLitBool Bool
- | NameLitNat Integer
- | NameLitInt Integer
- | NameLitTag Integer
- | NameLitWord Integer Int
- data PrimTyCon
- = PrimTyConVoid
- | PrimTyConBool
- | PrimTyConNat
- | PrimTyConInt
- | PrimTyConWord Int
- | PrimTyConFloat Int
- | PrimTyConVec Int
- | PrimTyConAddr
- | PrimTyConPtr
- | PrimTyConTag
- | PrimTyConString
- readPrimTyCon :: String -> Maybe PrimTyCon
- primTyConIsIntegral :: PrimTyCon -> Bool
- primTyConIsFloating :: PrimTyCon -> Bool
- primTyConIsUnsigned :: PrimTyCon -> Bool
- primTyConIsSigned :: PrimTyCon -> Bool
- primTyConWidth :: Platform -> PrimTyCon -> Maybe Integer
- data PrimOp
- data PrimArith
- = PrimArithNeg
- | PrimArithAdd
- | PrimArithSub
- | PrimArithMul
- | PrimArithDiv
- | PrimArithMod
- | PrimArithRem
- | PrimArithEq
- | PrimArithNeq
- | PrimArithGt
- | PrimArithGe
- | PrimArithLt
- | PrimArithLe
- | PrimArithAnd
- | PrimArithOr
- | PrimArithShl
- | PrimArithShr
- | PrimArithBAnd
- | PrimArithBOr
- | PrimArithBXOr
- readPrimArith :: String -> Maybe PrimArith
- data PrimCall = PrimCallTail Int
- readPrimCall :: String -> Maybe PrimCall
- data PrimCast
- readPrimCast :: String -> Maybe PrimCast
- primCastPromoteIsValid :: Platform -> PrimTyCon -> PrimTyCon -> Bool
- primCastTruncateIsValid :: Platform -> PrimTyCon -> PrimTyCon -> Bool
- data PrimControl
- readPrimControl :: String -> Maybe PrimControl
- data PrimStore
- = PrimStoreSize
- | PrimStoreSize2
- | PrimStoreCreate
- | PrimStoreCheck
- | PrimStoreRecover
- | PrimStoreAlloc
- | PrimStoreRead
- | PrimStoreWrite
- | PrimStorePlusAddr
- | PrimStoreMinusAddr
- | PrimStorePeek
- | PrimStorePoke
- | PrimStorePlusPtr
- | PrimStoreMinusPtr
- | PrimStoreMakePtr
- | PrimStoreTakePtr
- | PrimStoreCastPtr
- readPrimStore :: String -> Maybe PrimStore
- data PrimVec
- = PrimVecNeg {
- primVecMulti :: Int
- | PrimVecAdd {
- primVecMulti :: Int
- | PrimVecSub {
- primVecMulti :: Int
- | PrimVecMul {
- primVecMulti :: Int
- | PrimVecDiv {
- primVecMulti :: Int
- | PrimVecRep {
- primVecMulti :: Int
- | PrimVecPack {
- primVecMulti :: Int
- | PrimVecProj {
- primVecMulti :: Int
- primVecIndex :: Int
- | PrimVecGather {
- primVecMulti :: Int
- | PrimVecScatter {
- primVecMulti :: Int
- = PrimVecNeg {
- readPrimVec :: String -> Maybe PrimVec
- multiOfPrimVec :: PrimVec -> Maybe Int
- liftPrimArithToVec :: Int -> PrimArith -> Maybe PrimVec
- lowerPrimVecToArith :: PrimVec -> Maybe PrimArith
- readLitInteger :: String -> Maybe Integer
- readLitPrimNat :: String -> Maybe Integer
- readLitPrimInt :: String -> Maybe Integer
- readLitPrimWordOfBits :: String -> Maybe (Integer, Int)
- readLitPrimFloatOfBits :: String -> Maybe (Double, Int)
- readName :: String -> Maybe Name
Documentation
Names of things used in Disciple Core Salt.
NameVar String | A type or value variable. |
NameCon String | Constructor names. |
NameObjTyCon | The abstract heap object type constructor. |
NamePrimTyCon PrimTyCon | A primitive type constructor. |
NamePrimOp PrimOp | A primitive operator. |
NameLitVoid | The void literal. |
NameLitBool Bool | A boolean literal. |
NameLitNat Integer | A natural number literal. |
NameLitInt Integer | An integer number literal. |
NameLitTag Integer | A constructor tag literal. |
NameLitWord Integer Int | A |
Primitive Type Constructors
Primitive type constructors.
PrimTyConVoid |
|
PrimTyConBool |
|
PrimTyConNat |
|
PrimTyConInt |
|
PrimTyConWord Int |
|
PrimTyConFloat Int |
|
PrimTyConVec Int |
|
PrimTyConAddr |
|
PrimTyConPtr |
|
PrimTyConTag |
|
PrimTyConString |
These are primitive until we can define our own unboxed types. |
readPrimTyCon :: String -> Maybe PrimTyConSource
Read a primitive type constructor.
Words are limited to 8, 16, 32, or 64 bits.
Floats are limited to 32 or 64 bits.
primTyConIsIntegral :: PrimTyCon -> BoolSource
primTyConIsFloating :: PrimTyCon -> BoolSource
Floating point constructors.
These are FloatN
.
primTyConIsUnsigned :: PrimTyCon -> BoolSource
Unsigned integral constructors.
These are Bool
Nat
WordN
Tag
.
primTyConIsSigned :: PrimTyCon -> BoolSource
Signed integral constructors.
This is just Int
.
primTyConWidth :: Platform -> PrimTyCon -> Maybe IntegerSource
Get the representation width of a primitive type constructor, in bits. This is how much space it takes up in an object payload.
Bools are representable with a single bit, but we unpack them into a whole word.
The constructors Void
and VecN#
and String
have no width.
Primitive Operators
Primitive operators implemented directly by the machine or runtime system.
PrimArith PrimArith | Arithmetic, logic, comparison and bit-wise operators. |
PrimCast PrimCast | Casting between numeric types. |
PrimStore PrimStore | Raw store access. |
PrimCall PrimCall | Special function calling conventions. |
PrimControl PrimControl | Non-functional control flow. |
Primative Arithmetic
Primitive arithmetic, logic, and comparison opretors. We expect the backend/machine to be able to implement these directly.
For the Shift Right operator, the type that it is used at determines whether it is an arithmetic (with sign-extension) or logical (no sign-extension) shift.
PrimArithNeg | Negation |
PrimArithAdd | Addition |
PrimArithSub | Subtraction |
PrimArithMul | Multiplication |
PrimArithDiv | Division |
PrimArithMod | Modulus |
PrimArithRem | Remainder |
PrimArithEq | Equality |
PrimArithNeq | Negated Equality |
PrimArithGt | Greater Than |
PrimArithGe | Greater Than or Equal |
PrimArithLt | Less Than |
PrimArithLe | Less Than or Equal |
PrimArithAnd | Boolean And |
PrimArithOr | Boolean Or |
PrimArithShl | Shift Left |
PrimArithShr | Shift Right |
PrimArithBAnd | Bit-wise And |
PrimArithBOr | Bit-wise Or |
PrimArithBXOr | Bit-wise eXclusive Or |
readPrimArith :: String -> Maybe PrimArithSource
Read a primitive operator.
Primitive Calls
Primitive ways of invoking a function, where control flow returns back to the caller.
PrimCallTail Int | Tailcall a function |
readPrimCall :: String -> Maybe PrimCallSource
Primitive Casts
Primitive cast between two types.
The exact set of available casts is determined by the target platform.
For example, you can only promote a Nat#
to a Word32#
on a 32-bit
system. On a 64-bit system the Nat#
type is 64-bits wide, so casting it
to a Word32#
would be a truncation.
PrimCastConvert | Convert a value to a new representation with the same precision. |
PrimCastPromote | Promote a value to one of similar or larger width, without loss of precision. |
PrimCastTruncate | Truncate a value to a new width, possibly losing precision. |
readPrimCast :: String -> Maybe PrimCastSource
Check for a valid promotion primop.
Check for valid truncation primop.
Primitive Control
data PrimControl Source
Primitive non-returning control flow.
PrimControlFail | Ungraceful failure -- just abort the program. This is called on internal errors in the runtime system. There is no further debugging info provided, so you'll need to look at the stack trace to debug it. |
PrimControlReturn | Return from the enclosing function with the given value. |
Eq PrimControl | |
Ord PrimControl | |
Show PrimControl | |
Pretty PrimControl | |
NFData PrimControl |
readPrimControl :: String -> Maybe PrimControlSource
Primitive Store
Raw access to the store.
PrimStoreSize | Number of bytes needed to store a value of a primitive type. |
PrimStoreSize2 | Log2 of number of bytes need to store a value of a primitive type. |
PrimStoreCreate | Create a heap of the given size.
This must be called before |
PrimStoreCheck | Check whether there are at least this many bytes still available on the heap. |
PrimStoreRecover | Force a garbage collection to recover at least this many bytes. |
PrimStoreAlloc | Allocate some space on the heap. There must be enough space available, else undefined. |
PrimStoreRead | Read a value from the store at the given address and offset. |
PrimStoreWrite | Write a value to the store at the given address and offset. |
PrimStorePlusAddr | Add an offset in bytes to an address. |
PrimStoreMinusAddr | Subtract an offset in bytes from an address. |
PrimStorePeek | Read a value from a pointer plus the given offset. |
PrimStorePoke | Write a value to a pointer plus the given offset. |
PrimStorePlusPtr | Add an offset in bytes to a pointer. |
PrimStoreMinusPtr | Subtract an offset in bytes from a pointer. |
PrimStoreMakePtr | Convert an raw address to a pointer. |
PrimStoreTakePtr | Convert a pointer to a raw address. |
PrimStoreCastPtr | Cast between pointer types. |
readPrimStore :: String -> Maybe PrimStoreSource
Primitive Vector
Primitive vector operators.
PrimVecNeg | Negate elements of a vector. |
| |
PrimVecAdd | Add elements of a vector. |
| |
PrimVecSub | Subtract elements of a vector. |
| |
PrimVecMul | Multiply elements of a vector. |
| |
PrimVecDiv | Divide elements of a vector. |
| |
PrimVecRep | Replicate a scalar into a vector. |
| |
PrimVecPack | Pack multiple scalars into a vector |
| |
PrimVecProj | Extract a single element from a vector. |
| |
PrimVecGather | Read multiple elements from memory. |
| |
PrimVecScatter | Write multiple elements to memory. |
|
readPrimVec :: String -> Maybe PrimVecSource
Read a primitive vector operator.
multiOfPrimVec :: PrimVec -> Maybe IntSource
Yield the multiplicity of a vector operator.
liftPrimArithToVec :: Int -> PrimArith -> Maybe PrimVecSource
Yield the PrimVector
that corresponds to a PrimArith
of the
given multiplicity, if any.
lowerPrimVecToArith :: PrimVec -> Maybe PrimArithSource
Yield the PrimArith
that corresponds to a PrimVector
, if any.
Primitive Literals
readLitInteger :: String -> Maybe IntegerSource
Read a signed integer.
readLitPrimNat :: String -> Maybe IntegerSource
Read an integer with an explicit format specifier like 1234i#
.
readLitPrimInt :: String -> Maybe IntegerSource
Read an integer literal with an explicit format specifier like 1234i#
.
readLitPrimWordOfBits :: String -> Maybe (Integer, Int)Source
Read a word with an explicit format speficier.
readLitPrimFloatOfBits :: String -> Maybe (Double, Int)Source
Read a float literal with an explicit format specifier like 123.00f32#
.