{-# LANGUAGE TypeFamilies #-}
module Futhark.IR.GPU
( GPU,
module Futhark.IR.Prop,
module Futhark.IR.Traversals,
module Futhark.IR.Pretty,
module Futhark.IR.Syntax,
module Futhark.IR.GPU.Op,
module Futhark.IR.GPU.Sizes,
module Futhark.IR.SOACS.SOAC,
)
where
import Futhark.Builder
import Futhark.Construct
import Futhark.IR.Aliases (Aliases)
import Futhark.IR.GPU.Op
import Futhark.IR.GPU.Sizes
import Futhark.IR.Pretty
import Futhark.IR.Prop
import Futhark.IR.SOACS.SOAC hiding (HistOp (..))
import Futhark.IR.Syntax
import Futhark.IR.Traversals
import Futhark.IR.TypeCheck qualified as TC
data GPU
instance RepTypes GPU where
type OpC GPU = HostOp SOAC
instance ASTRep GPU where
expTypesFromPat :: forall (m :: * -> *).
(HasScope GPU m, Monad m) =>
Pat (LetDec GPU) -> m [BranchType GPU]
expTypesFromPat = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall dec. Typed dec => Pat dec -> [ExtType]
expExtTypesFromPat
instance TC.Checkable GPU where
checkOp :: Op (Aliases GPU) -> TypeM GPU ()
checkOp = Maybe SegLevel -> HostOp SOAC (Aliases GPU) -> TypeM GPU ()
typeCheckGPUOp forall a. Maybe a
Nothing
where
typeCheckGPUOp ::
Maybe SegLevel ->
HostOp SOAC (Aliases GPU) ->
TC.TypeM GPU ()
typeCheckGPUOp :: Maybe SegLevel -> HostOp SOAC (Aliases GPU) -> TypeM GPU ()
typeCheckGPUOp Maybe SegLevel
lvl =
forall rep (op :: * -> *).
Checkable rep =>
(SegLevel -> Op (Aliases rep) -> TypeM rep ())
-> Maybe SegLevel
-> (op (Aliases rep) -> TypeM rep ())
-> HostOp op (Aliases rep)
-> TypeM rep ()
typeCheckHostOp (Maybe SegLevel -> HostOp SOAC (Aliases GPU) -> TypeM GPU ()
typeCheckGPUOp forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just) Maybe SegLevel
lvl forall rep. Checkable rep => SOAC (Aliases rep) -> TypeM rep ()
typeCheckSOAC
instance Buildable GPU where
mkBody :: Stms GPU -> Result -> Body GPU
mkBody = forall rep. BodyDec rep -> Stms rep -> Result -> Body rep
Body ()
mkExpPat :: [Ident] -> Exp GPU -> Pat (LetDec GPU)
mkExpPat [Ident]
idents Exp GPU
_ = [Ident] -> Pat Type
basicPat [Ident]
idents
mkExpDec :: Pat (LetDec GPU) -> Exp GPU -> ExpDec GPU
mkExpDec Pat (LetDec GPU)
_ Exp GPU
_ = ()
mkLetNames :: forall (m :: * -> *).
(MonadFreshNames m, HasScope GPU m) =>
[VName] -> Exp GPU -> m (Stm GPU)
mkLetNames = forall rep (m :: * -> *).
(ExpDec rep ~ (), LetDec rep ~ Type, MonadFreshNames m,
TypedOp (Op rep), HasScope rep m) =>
[VName] -> Exp rep -> m (Stm rep)
simpleMkLetNames
instance BuilderOps GPU
instance PrettyRep GPU
instance HasSegOp GPU where
type SegOpLevel GPU = SegLevel
asSegOp :: Op GPU -> Maybe (SegOp (SegOpLevel GPU) GPU)
asSegOp (SegOp SegOp SegLevel GPU
op) = forall a. a -> Maybe a
Just SegOp SegLevel GPU
op
asSegOp Op GPU
_ = forall a. Maybe a
Nothing
segOp :: SegOp (SegOpLevel GPU) GPU -> Op GPU
segOp = forall (op :: * -> *) rep. SegOp SegLevel rep -> HostOp op rep
SegOp