{-# 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.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 Op GPU = HostOp GPU (SOAC GPU)
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.CheckableOp GPU where
checkOp :: OpWithAliases (Op GPU) -> TypeM GPU ()
checkOp = forall {k} {rep :: k}.
(OpWithAliases (Op rep)
~ HostOp (Aliases rep) (SOAC (Aliases rep)),
Checkable rep) =>
Maybe SegLevel
-> HostOp (Aliases rep) (SOAC (Aliases rep)) -> TypeM rep ()
typeCheckGPUOp forall a. Maybe a
Nothing
where
typeCheckGPUOp :: Maybe SegLevel
-> HostOp (Aliases rep) (SOAC (Aliases rep)) -> TypeM rep ()
typeCheckGPUOp Maybe SegLevel
lvl =
forall {k} (rep :: k) op.
Checkable rep =>
(SegLevel -> OpWithAliases (Op rep) -> TypeM rep ())
-> Maybe SegLevel
-> (op -> TypeM rep ())
-> HostOp (Aliases rep) op
-> TypeM rep ()
typeCheckHostOp (Maybe SegLevel
-> HostOp (Aliases rep) (SOAC (Aliases rep)) -> TypeM rep ()
typeCheckGPUOp forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just) Maybe SegLevel
lvl forall {k} (rep :: k).
Checkable rep =>
SOAC (Aliases rep) -> TypeM rep ()
typeCheckSOAC
instance TC.Checkable GPU
instance Buildable GPU where
mkBody :: Stms GPU -> Result -> Body GPU
mkBody = forall {k} (rep :: k).
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 {k} (rep :: k) (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 {k} (rep :: k) op. SegOp SegLevel rep -> HostOp rep op
SegOp