-mAX_NDP_PROD :: Int
-mAX_NDP_PROD = 3
-
-mAX_NDP_SUM :: Int
-mAX_NDP_SUM = 3
-
-mAX_NDP_COMBINE :: Int
-mAX_NDP_COMBINE = 2
-
-mkNDPModule :: FastString -> Module
-mkNDPModule m = mkModule ndpPackageId (mkModuleNameFS m)
-
-nDP_PARRAY = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.PArray")
-nDP_REPR = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Repr")
-nDP_CLOSURE = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Closure")
-nDP_PRIM = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Prim")
-nDP_INSTANCES = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Instances")
-nDP_COMBINATORS = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Combinators")
-
-nDP_PRELUDE_PARR = mkNDPModule FSLIT("Data.Array.Parallel.Prelude.Base.PArr")
-nDP_PRELUDE_INT = mkNDPModule FSLIT("Data.Array.Parallel.Prelude.Base.Int")
-nDP_PRELUDE_DOUBLE = mkNDPModule FSLIT("Data.Array.Parallel.Prelude.Base.Double")
-
-data Builtins = Builtins {
- parrayTyCon :: TyCon
- , paTyCon :: TyCon
- , paDataCon :: DataCon
- , preprTyCon :: TyCon
- , prTyCon :: TyCon
- , prDataCon :: DataCon
- , parrayIntPrimTyCon :: TyCon
- , parrayBoolPrimTyCon :: TyCon
- , voidTyCon :: TyCon
- , wrapTyCon :: TyCon
- , enumerationTyCon :: TyCon
- , sumTyCons :: Array Int TyCon
- , closureTyCon :: TyCon
- , voidVar :: Var
- , mkPRVar :: Var
- , mkClosureVar :: Var
- , applyClosureVar :: Var
- , mkClosurePVar :: Var
- , applyClosurePVar :: Var
- , replicatePAIntPrimVar :: Var
- , upToPAIntPrimVar :: Var
- , selectPAIntPrimVar :: Var
- , truesPABoolPrimVar :: Var
- , lengthPAVar :: Var
- , replicatePAVar :: Var
- , emptyPAVar :: Var
- , packPAVar :: Var
- , combinePAVars :: Array Int Var
- , liftingContext :: Var
- }
+
+-- Numbers of things exported by the DPH library.
+mAX_DPH_PROD :: Int
+mAX_DPH_PROD = 5
+
+mAX_DPH_SUM :: Int
+mAX_DPH_SUM = 2
+
+mAX_DPH_COMBINE :: Int
+mAX_DPH_COMBINE = 2
+
+mAX_DPH_SCALAR_ARGS :: Int
+mAX_DPH_SCALAR_ARGS = 3
+
+
+-- | Ids of the modules that contain our DPH builtins.
+data Modules
+ = Modules
+ { dph_PArray :: Module
+ , dph_Repr :: Module
+ , dph_Closure :: Module
+ , dph_Unboxed :: Module
+ , dph_Instances :: Module
+ , dph_Combinators :: Module
+ , dph_Scalar :: Module
+ , dph_Prelude_PArr :: Module
+ , dph_Prelude_Int :: Module
+ , dph_Prelude_Word8 :: Module
+ , dph_Prelude_Double :: Module
+ , dph_Prelude_Bool :: Module
+ , dph_Prelude_Tuple :: Module
+ }
+
+
+-- | The locations of builtins in the current DPH library.
+dph_Modules :: PackageId -> Modules
+dph_Modules pkg
+ = Modules
+ { dph_PArray = mk (fsLit "Data.Array.Parallel.Lifted.PArray")
+ , dph_Repr = mk (fsLit "Data.Array.Parallel.Lifted.Repr")
+ , dph_Closure = mk (fsLit "Data.Array.Parallel.Lifted.Closure")
+ , dph_Unboxed = mk (fsLit "Data.Array.Parallel.Lifted.Unboxed")
+ , dph_Instances = mk (fsLit "Data.Array.Parallel.Lifted.Instances")
+ , dph_Combinators = mk (fsLit "Data.Array.Parallel.Lifted.Combinators")
+ , dph_Scalar = mk (fsLit "Data.Array.Parallel.Lifted.Scalar")
+
+ , dph_Prelude_PArr = mk (fsLit "Data.Array.Parallel.Prelude.Base.PArr")
+ , dph_Prelude_Int = mk (fsLit "Data.Array.Parallel.Prelude.Base.Int")
+ , dph_Prelude_Word8 = mk (fsLit "Data.Array.Parallel.Prelude.Base.Word8")
+ , dph_Prelude_Double = mk (fsLit "Data.Array.Parallel.Prelude.Base.Double")
+ , dph_Prelude_Bool = mk (fsLit "Data.Array.Parallel.Prelude.Base.Bool")
+ , dph_Prelude_Tuple = mk (fsLit "Data.Array.Parallel.Prelude.Base.Tuple")
+ }
+ where mk = mkModule pkg . mkModuleNameFS
+
+
+-- | Project out ids of modules that contain orphan instances that we need to load.
+dph_Orphans :: [Modules -> Module]
+dph_Orphans = [dph_Repr, dph_Instances]
+
+
+-- | Information about what builtin stuff to use from the DPH base libraries.
+data Builtins
+ = Builtins
+ { dphModules :: Modules
+
+ -- From dph-common:Data.Array.Parallel.Lifted.PArray
+ , parrayTyCon :: TyCon -- ^ PArray
+ , parrayDataCon :: DataCon -- ^ PArray
+ , pdataTyCon :: TyCon -- ^ PData
+ , paTyCon :: TyCon -- ^ PA
+ , paDataCon :: DataCon -- ^ PA
+ , preprTyCon :: TyCon -- ^ PRepr
+ , prTyCon :: TyCon -- ^ PR
+ , prDataCon :: DataCon -- ^ PR
+ , replicatePDVar :: Var -- ^ replicatePD
+ , emptyPDVar :: Var -- ^ emptyPD
+ , packByTagPDVar :: Var -- ^ packByTagPD
+ , combinePDVars :: Array Int Var -- ^ combinePD
+ , scalarClass :: Class -- ^ Scalar
+
+ -- From dph-common:Data.Array.Parallel.Lifted.Closure
+ , closureTyCon :: TyCon -- ^ :->
+ , closureVar :: Var -- ^ closure
+ , applyVar :: Var -- ^ $:
+ , liftedClosureVar :: Var -- ^ liftedClosure
+ , liftedApplyVar :: Var -- ^ liftedApply
+ , closureCtrFuns :: Array Int Var -- ^ closure1 .. closure2
+
+ -- From dph-common:Data.Array.Parallel.Lifted.Repr
+ , voidTyCon :: TyCon -- ^ Void
+ , wrapTyCon :: TyCon -- ^ Wrap
+ , sumTyCons :: Array Int TyCon -- ^ Sum2 .. Sum3
+ , voidVar :: Var -- ^ void
+ , pvoidVar :: Var -- ^ pvoid
+ , fromVoidVar :: Var -- ^ fromVoid
+ , punitVar :: Var -- ^ punit
+
+ -- From dph-common:Data.Array.Parallel.Lifted.Selector
+ , selTys :: Array Int Type -- ^ Sel2
+ , selReplicates :: Array Int CoreExpr -- ^ replicate2
+ , selPicks :: Array Int CoreExpr -- ^ pick2
+ , selTagss :: Array Int CoreExpr -- ^ tagsSel2
+ , selEls :: Array (Int, Int) CoreExpr -- ^ elementsSel2_0 .. elementsSel_2_1
+
+ -- From dph-common:Data.Array.Parallel.Lifted.Scalar
+ -- NOTE: map is counted as a zipWith fn with one argument array.
+ , scalarZips :: Array Int Var -- ^ map, zipWith, zipWith3
+
+ -- A Fresh variable
+ , liftingContext :: Var -- ^ lc
+ }
+
+
+-- | Get an element from one of the arrays of contained by a `Builtins`.
+-- If the indexed thing is not in the array then panic.
+indexBuiltin
+ :: (Ix i, Outputable i)
+ => String -- ^ Name of the selector we've used, for panic messages.
+ -> (Builtins -> Array i a) -- ^ Field selector for the `Builtins`.
+ -> i -- ^ Index into the array.
+ -> Builtins
+ -> a
+
+indexBuiltin fn f i bi
+ | inRange (bounds xs) i = xs ! i
+ | otherwise = pprPanic fn (ppr i)
+ where
+ xs = f bi
+
+
+-- Projections ----------------------------------------------------------------
+selTy :: Int -> Builtins -> Type
+selTy = indexBuiltin "selTy" selTys
+
+selReplicate :: Int -> Builtins -> CoreExpr
+selReplicate = indexBuiltin "selReplicate" selReplicates
+
+selPick :: Int -> Builtins -> CoreExpr
+selPick = indexBuiltin "selPick" selPicks
+
+selTags :: Int -> Builtins -> CoreExpr
+selTags = indexBuiltin "selTags" selTagss
+
+selElements :: Int -> Int -> Builtins -> CoreExpr
+selElements i j = indexBuiltin "selElements" selEls (i,j)