{-# LANGUAGE FlexibleInstances #-}
{-# 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.Kernel,
module Futhark.IR.GPU.Sizes,
module Futhark.IR.SOACS.SOAC,
)
where
import Futhark.Binder
import Futhark.Construct
import Futhark.IR.GPU.Kernel
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 qualified Futhark.TypeCheck as TypeCheck
data GPU
instance RepTypes GPU where
type Op GPU = HostOp GPU (SOAC GPU)
instance ASTRep GPU where
expTypesFromPattern :: forall (m :: * -> *).
(HasScope GPU m, Monad m) =>
Pattern GPU -> m [BranchType GPU]
expTypesFromPattern = [ExtType] -> m [ExtType]
forall (m :: * -> *) a. Monad m => a -> m a
return ([ExtType] -> m [ExtType])
-> (PatternT Type -> [ExtType]) -> PatternT Type -> m [ExtType]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PatternT Type -> [ExtType]
forall dec. Typed dec => PatternT dec -> [ExtType]
expExtTypesFromPattern
instance TypeCheck.CheckableOp GPU where
checkOp :: OpWithAliases (Op GPU) -> TypeM GPU ()
checkOp = Maybe SegLevel
-> HostOp (Aliases GPU) (SOAC (Aliases GPU)) -> TypeM GPU ()
forall {rep}.
(Checkable rep,
OpWithAliases (Op rep)
~ HostOp (Aliases rep) (SOAC (Aliases rep))) =>
Maybe SegLevel
-> HostOp (Aliases rep) (SOAC (Aliases rep)) -> TypeM rep ()
typeCheckGPUOp Maybe SegLevel
forall a. Maybe a
Nothing
where
typeCheckGPUOp :: Maybe SegLevel
-> HostOp (Aliases rep) (SOAC (Aliases rep)) -> TypeM rep ()
typeCheckGPUOp Maybe SegLevel
lvl =
(SegLevel -> OpWithAliases (Op rep) -> TypeM rep ())
-> Maybe SegLevel
-> (SOAC (Aliases rep) -> TypeM rep ())
-> HostOp (Aliases rep) (SOAC (Aliases rep))
-> TypeM rep ()
forall rep 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 (Maybe SegLevel
-> HostOp (Aliases rep) (SOAC (Aliases rep)) -> TypeM rep ())
-> (SegLevel -> Maybe SegLevel)
-> SegLevel
-> HostOp (Aliases rep) (SOAC (Aliases rep))
-> TypeM rep ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SegLevel -> Maybe SegLevel
forall a. a -> Maybe a
Just) Maybe SegLevel
lvl SOAC (Aliases rep) -> TypeM rep ()
forall rep. Checkable rep => SOAC (Aliases rep) -> TypeM rep ()
typeCheckSOAC
instance TypeCheck.Checkable GPU
instance Bindable GPU where
mkBody :: Stms GPU -> [SubExp] -> Body GPU
mkBody = BodyDec GPU -> Stms GPU -> [SubExp] -> Body GPU
forall rep. BodyDec rep -> Stms rep -> [SubExp] -> BodyT rep
Body ()
mkExpPat :: [Ident] -> [Ident] -> Exp GPU -> Pattern GPU
mkExpPat [Ident]
ctx [Ident]
val Exp GPU
_ = [Ident] -> [Ident] -> PatternT Type
basicPattern [Ident]
ctx [Ident]
val
mkExpDec :: Pattern GPU -> Exp GPU -> ExpDec GPU
mkExpDec Pattern GPU
_ Exp GPU
_ = ()
mkLetNames :: forall (m :: * -> *).
(MonadFreshNames m, HasScope GPU m) =>
[VName] -> Exp GPU -> m (Stm GPU)
mkLetNames = [VName] -> Exp GPU -> m (Stm GPU)
forall rep (m :: * -> *).
(ExpDec rep ~ (), LetDec rep ~ Type, MonadFreshNames m,
TypedOp (Op rep), HasScope rep m) =>
[VName] -> Exp rep -> m (Stm rep)
simpleMkLetNames
instance BinderOps 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) = SegOp SegLevel GPU -> Maybe (SegOp SegLevel GPU)
forall a. a -> Maybe a
Just SegOp SegLevel GPU
op
asSegOp Op GPU
_ = Maybe (SegOp (SegOpLevel GPU) GPU)
forall a. Maybe a
Nothing
segOp :: SegOp (SegOpLevel GPU) GPU -> Op GPU
segOp = SegOp (SegOpLevel GPU) GPU -> Op GPU
forall rep op. SegOp SegLevel rep -> HostOp rep op
SegOp