2 -- | Builtin types and functions used by the vectoriser.
3 -- The source program uses functions from Data.Array.Parallel, which the vectoriser rewrites
4 -- to use equivalent vectorised versions in the DPH backend packages.
6 -- The `Builtins` structure holds the name of all the things in the DPH packages
7 -- we will need. We can get specific things using the selectors, which print a
8 -- civilized panic message if the specified thing cannot be found.
10 module Vectorise.Builtins (
15 -- * Wrapped selectors
29 initBuiltins, initBuiltinVars, initBuiltinTyCons, initBuiltinDataCons,
30 initBuiltinPAs, initBuiltinPRs,
31 initBuiltinBoxedTyCons, initBuiltinScalars,
37 import Vectorise.Builtins.Base
38 import Vectorise.Builtins.Modules
39 import Vectorise.Builtins.Initialise
51 -- | Lookup a method function given its name and instance type.
52 primMethod :: TyCon -> String -> Builtins -> DsM (Maybe Var)
53 primMethod tycon method (Builtins { dphModules = mods })
54 | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon)
56 $ dsLookupGlobalId =<< lookupOrig (dph_Unboxed mods)
57 (mkVarOcc $ method ++ suffix)
59 | otherwise = return Nothing
61 -- | Lookup the representation type we use for PArrays that contain a given element type.
62 primPArray :: TyCon -> Builtins -> DsM (Maybe TyCon)
63 primPArray tycon (Builtins { dphModules = mods })
64 | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon)
66 $ dsLookupTyCon =<< lookupOrig (dph_Unboxed mods)
67 (mkTcOcc $ "PArray" ++ suffix)
69 | otherwise = return Nothing
71 prim_ty_cons :: NameEnv String
72 prim_ty_cons = mkNameEnv [mk_prim intPrimTyCon]
74 mk_prim tycon = (tyConName tycon, '_' : getOccString tycon)