ddc-core-flow-0.4.2.1: DDC/Core/Flow/Prim/Base.hs
module DDC.Core.Flow.Prim.Base
( Name (..)
, KiConFlow (..)
, TyConFlow (..)
, DaConFlow (..)
, OpConcrete (..)
, OpControl (..)
, OpSeries (..)
, OpStore (..)
, OpVector (..)
, PrimTyCon (..)
, PrimArith (..)
, PrimVec (..)
, PrimCast (..))
where
import Data.Typeable
import DDC.Core.Salt.Name
( PrimTyCon (..)
, PrimArith (..)
, PrimVec (..)
, PrimCast (..))
-- | Names of things used in Disciple Core Flow.
data Name
-- | User defined variables.
= NameVar String
-- | A name generated by modifying some other name `name$mod`
| NameVarMod Name String
-- | A user defined constructor.
| NameCon String
-- Fragment specific primops -----------
-- | Fragment specific kind constructors.
| NameKiConFlow KiConFlow
-- | Fragment specific type constructors.
| NameTyConFlow TyConFlow
-- | Fragment specific data constructors.
| NameDaConFlow DaConFlow
-- | Concrete series operators.
| NameOpConcrete OpConcrete
-- | Control operators.
| NameOpControl OpControl
-- | Series operators.
| NameOpSeries OpSeries
-- | Store operators.
| NameOpStore OpStore
-- | Vector operators.
| NameOpVector OpVector
-- Machine primitives ------------------
-- | A primitive type constructor.
| NamePrimTyCon PrimTyCon
-- | Primitive arithmetic, logic, comparison and bit-wise operators.
| NamePrimArith PrimArith
-- | Primitive casting between numeric types.
| NamePrimCast PrimCast
-- | Primitive vector operators.
| NamePrimVec PrimVec
-- Literals -----------------------------
-- | A boolean literal.
| NameLitBool Bool
-- | A natural literal.
| NameLitNat Integer
-- | An integer literal.
| NameLitInt Integer
-- | A word literal, with the given number of bits precision.
| NameLitWord Integer Int
-- | A float literal, with the given number of bits precision.
| NameLitFloat Rational Int
deriving (Eq, Ord, Show, Typeable)
-- | Fragment specific kind constructors.
data KiConFlow
= KiConFlowRate
| KiConFlowProc
deriving (Eq, Ord, Show)
-- | Fragment specific type constructors.
data TyConFlow
-- | @TupleN#@ constructor. Tuples.
= TyConFlowTuple Int
-- | @Vector#@ constructor. Vector is a pair of mutable length and mutable data
| TyConFlowVector
-- | @Buffer#@ constructor. Mutable Buffer with no associated length
| TyConFlowBuffer
-- | @RateVec#@ constructor. Vector is a pair of mutable length and mutable data
| TyConFlowRateVec
-- | @Series#@ constructor. Series types.
| TyConFlowSeries
-- | @Segd#@ constructor. Segment Descriptors.
| TyConFlowSegd
-- | @SelN#@ constructor. Selectors.
| TyConFlowSel Int
-- | @Ref#@ constructor. References.
| TyConFlowRef
-- | @World#@ constructor. State token used when converting to GHC core.
| TyConFlowWorld
-- | @RateNat#@ constructor. Naturals witnessing a type-level Rate.
| TyConFlowRateNat
-- | Multiply two @Rate@s together
| TyConFlowRateCross
-- | Add two @Rate@s together
| TyConFlowRateAppend
-- | @DownN#@ constructor. Rate decimation.
| TyConFlowDown Int
-- | @TailN#@ constructor. Rate tail after decimation.
| TyConFlowTail Int
-- | @Process@ constructor.
| TyConFlowProcess
-- | @Resize p j k@ is a witness that @Process p j@ can be resized to @Process p k@
| TyConFlowResize
deriving (Eq, Ord, Show)
-- | Primitive data constructors.
data DaConFlow
-- | @TN@ data constructor.
= DaConFlowTuple Int
deriving (Eq, Ord, Show)
-- | Fusable Flow operators that work on Series.
data OpSeries
-- | Replicate a single element into a series.
= OpSeriesRep
-- | Segmented replicate.
| OpSeriesReps
-- | Segmented indices
| OpSeriesIndices
-- | Fill an existing vector from a series.
| OpSeriesFill
-- | Gather (read) elements from a vector.
| OpSeriesGather
-- | Scatter (write) elements into a vector.
| OpSeriesScatter
-- | Make a selector.
| OpSeriesMkSel Int
-- | Make a segment descriptor.
| OpSeriesMkSegd
-- | Apply a worker to corresponding elements of some series.
| OpSeriesMap Int
-- | Pack a series according to a flags vector.
| OpSeriesPack
-- | Generate a new series with size based on klok/rate
| OpSeriesGenerate
-- | Reduce a series with an associative operator,
-- updating an existing accumulator.
| OpSeriesReduce
-- | Segmented fold.
| OpSeriesFolds
-- | Execute a process
| OpSeriesRunProcess
-- | Introduce a Proc type, but argument returns unit instead of process
-- Has exact same type as RunProcess except for that,
-- so that they can easily be swapped during lowering
| OpSeriesRunProcessUnit
-- | Convert vector(s) into manifests, all with same length with runtime check.
| OpSeriesRateVecsOfVectors Int
-- | Convert manifest into series
| OpSeriesSeriesOfRateVec
-- | Append two series
| OpSeriesAppend
-- | Cross a series and a vector
| OpSeriesCross
-- | Resize a process
| OpSeriesResizeProc
-- | Resize a process
| OpSeriesResizeId
-- | Inject a series into the left side of an append
| OpSeriesResizeAppL
-- | Inject a series into the right side of an append
| OpSeriesResizeAppR
-- | Map over the contents of an append
| OpSeriesResizeApp
-- | Move from filtered to filtee
| OpSeriesResizeSel1
-- | Move from segment data to segment lens
| OpSeriesResizeSegd
-- | Move from (cross a b) to a
| OpSeriesResizeCross
-- | Join two series processes.
| OpSeriesJoin
deriving (Eq, Ord, Show)
-- | Series related operators.
-- These operators work on series after the code has been fused.
-- They do not appear in the source program.
data OpConcrete
-- | Project out a component of a tuple,
-- given the tuple arity and index of the desired component.
= OpConcreteProj Int Int
-- | Take the rate of a series.
| OpConcreteRateOfSeries
-- | Take the underlying @Nat@ of a @RateNat@.
| OpConcreteNatOfRateNat
-- | Take some elements from a series.
| OpConcreteNext Int
-- | Decimate the rate of a series.
| OpConcreteDown Int
-- | Take the tail rate of a decimated series.
| OpConcreteTail Int
deriving (Eq, Ord, Show)
-- | Control operators.
data OpControl
-- Top level loop, indexed by a rate type.
= OpControlLoop
-- Top level loop, taking a RateNat.
| OpControlLoopN
-- Evaluate some function when a flag is true.
| OpControlGuard
-- Evaluate some function a given number of times.
| OpControlSegment
-- Used for producing SIMD code.
| OpControlSplit Int
deriving (Eq, Ord, Show)
-- | Store operators.
data OpStore
-- Assignables ----------------
-- | Allocate a new reference.
= OpStoreNew
-- | Read from a reference.
| OpStoreRead
-- | Write to a reference.
| OpStoreWrite
-- Vectors --------------------
-- | Allocate a new vector (taking a @Nat@ for the length)
| OpStoreNewVector
-- | Allocate a new vector (taking a @Rate@ for the length)
| OpStoreNewVectorR
-- | Allocate a new vector (taking a @RateNat@ for the length)
| OpStoreNewVectorN
-- | Read a packed Vec of values from a Vector buffer.
| OpStoreReadVector Int
-- | Write a packed Vec of values to a Vector buffer.
| OpStoreWriteVector Int
-- | Window a target vector to the tail of some rate.
| OpStoreTailVector Int
-- | Truncate a vector to a smaller length.
| OpStoreTruncVector
-- | Get a vector's data buffer
| OpStoreBufOfVector
-- | Get a vector's data buffer
| OpStoreBufOfRateVec
deriving (Eq, Ord, Show)
-- | Fusable flow operators that work on Vectors.
data OpVector
-- | Apply worker function to @n@ vectors zipped.
= OpVectorMap Int
-- | Filter a vector according to a predicate.
| OpVectorFilter
-- | Associative fold.
| OpVectorReduce
-- | Create a new vector from an index function.
| OpVectorGenerate
-- | Get a vector's length.
| OpVectorLength
-- | Gather (read) elements from a vector:
--
-- > gather v ix = map (v!) ix
--
| OpVectorGather
deriving (Eq, Ord, Show)