content: 
  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)
  
  