{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE Rank2Types #-}
module Data.Array.Knead.Symbolic.Render.Basic (
run,
(*->),
storable,
marshal,
array,
scatter,
) where
import qualified Data.Array.Knead.Symbolic.Render.Argument as Arg
import qualified Data.Array.Knead.Symbolic.PhysicalParametric as PhysP
import qualified Data.Array.Knead.Symbolic.Physical as Phys
import qualified Data.Array.Knead.Symbolic.Private as Core
import qualified Data.Array.Knead.Shape as Shape
import qualified Data.Array.Comfort.Storable.Unchecked as Array
import qualified LLVM.DSL.Render.Run as Run
import LLVM.DSL.Render.Run (run, (*->))
import LLVM.DSL.Expression (Exp)
import qualified LLVM.Extra.Multi.Value.Storable as Storable
import qualified LLVM.Extra.Multi.Value.Marshal as Marshal
import Prelude2010
import Prelude ()
_example1raw ::
(Marshal.C sh, Shape.C sh, Marshal.C z, Marshal.C a, Storable.C b) =>
Run.T IO z (Exp a -> Core.Array sh b) (a -> IO (Phys.Array sh b))
_example1raw = Arg.primitive *-> array
_example2raw ::
(Marshal.C sh, Shape.C sh,
Marshal.C z, Marshal.C a, Marshal.C b, Storable.C c) =>
Run.T IO z
(Exp a -> Exp b -> Core.Array sh c)
(a -> b -> IO (Phys.Array sh c))
_example2raw = Arg.primitive *-> Arg.primitive *-> array
_example2 ::
(Marshal.C sh, Shape.C sh,
Marshal.C a, Marshal.C b, Storable.C c) =>
(Exp a -> Exp b -> Core.Array sh c) ->
IO (a -> b -> IO (Phys.Array sh c))
_example2 = run (Arg.primitive *-> Arg.primitive *-> array)
_example2exp ::
(Marshal.C a, Marshal.C b, Storable.C c) =>
(Exp a -> Exp b -> Exp c) ->
IO (a -> b -> IO c)
_example2exp = run (Arg.primitive *-> Arg.primitive *-> storable)
_example2marshal ::
(Marshal.C a, Marshal.C b, Marshal.C c) =>
(Exp a -> Exp b -> Exp c) ->
IO (a -> b -> IO c)
_example2marshal = run (Arg.primitive *-> Arg.primitive *-> marshal)
_example2scatter ::
(Shape.C sh0, Shape.C sh1, Marshal.C sh1,
Marshal.C a, Marshal.C b, Storable.C c) =>
(Exp a -> Exp b -> PhysP.Scatter sh0 sh1 c) ->
IO (a -> b -> IO (Array.Array sh1 c))
_example2scatter = run (Arg.primitive *-> Arg.primitive *-> scatter)
singleton :: Exp a -> Core.Array () a
singleton = Core.fromScalar
storable :: (Marshal.C p, Storable.C a) => Run.T IO p (Exp a) (IO a)
storable = Run.Cons $ PhysP.the . fmap singleton
marshal :: (Marshal.C p, Marshal.C a) => Run.T IO p (Exp a) (IO a)
marshal = Run.Cons $ PhysP.theMarshal . fmap singleton
array ::
(Shape.C sh, Shape.Index sh ~ ix, Marshal.C sh,
Marshal.C p, Storable.C a) =>
Run.T IO p (Core.Array sh a) (IO (Phys.Array sh a))
array = Run.Cons PhysP.render
scatter ::
(Shape.C sh0, Shape.C sh1, Marshal.C sh1, Marshal.C p, Storable.C a) =>
Run.T IO p (PhysP.Scatter sh0 sh1 a) (IO (Array.Array sh1 a))
scatter = Run.Cons PhysP.scatter