Safe Haskell | None |
---|---|
Language | GHC2021 |
Futhark.Builder
Description
This module defines a convenience monad/typeclass for building
ASTs. The fundamental building block is BuilderT
and its
execution functions, but it is usually easier to use Builder
.
See Futhark.Construct for a high-level description.
Synopsis
- data BuilderT rep (m :: Type -> Type) a
- runBuilderT :: MonadFreshNames m => BuilderT rep m a -> Scope rep -> m (a, Stms rep)
- runBuilderT_ :: MonadFreshNames m => BuilderT rep m () -> Scope rep -> m (Stms rep)
- runBuilderT' :: (MonadFreshNames m, HasScope somerep m, SameScope somerep rep) => BuilderT rep m a -> m (a, Stms rep)
- runBuilderT'_ :: (MonadFreshNames m, HasScope somerep m, SameScope somerep rep) => BuilderT rep m a -> m (Stms rep)
- class ASTRep rep => BuilderOps rep where
- type Builder rep = BuilderT rep (State VNameSource)
- runBuilder :: (MonadFreshNames m, HasScope somerep m, SameScope somerep rep) => Builder rep a -> m (a, Stms rep)
- runBuilder_ :: (MonadFreshNames m, HasScope somerep m, SameScope somerep rep) => Builder rep a -> m (Stms rep)
- runBodyBuilder :: (Buildable rep, MonadFreshNames m, HasScope somerep m, SameScope somerep rep) => Builder rep Result -> m (Body rep)
- runLambdaBuilder :: (Buildable rep, MonadFreshNames m, HasScope somerep m, SameScope somerep rep) => [LParam rep] -> Builder rep Result -> m (Lambda rep)
- module Futhark.Builder.Class
A concrete MonadBuilder
monad.
data BuilderT rep (m :: Type -> Type) a Source #
A monad transformer that tracks statements and provides a
MonadBuilder
instance, assuming that the underlying monad provides
a name source. In almost all cases, this is what you will use for
constructing statements (possibly as part of a larger monad stack).
If you find yourself needing to implement MonadBuilder
from
scratch, then it is likely that you are making a mistake.
Instances
runBuilderT :: MonadFreshNames m => BuilderT rep m a -> Scope rep -> m (a, Stms rep) Source #
Run a builder action given an initial scope, returning a value and
the statements added (addStm
) during the action.
runBuilderT_ :: MonadFreshNames m => BuilderT rep m () -> Scope rep -> m (Stms rep) Source #
Like runBuilderT
, but return only the statements.
runBuilderT' :: (MonadFreshNames m, HasScope somerep m, SameScope somerep rep) => BuilderT rep m a -> m (a, Stms rep) Source #
Like runBuilderT
, but get the initial scope from the current
monad.
runBuilderT'_ :: (MonadFreshNames m, HasScope somerep m, SameScope somerep rep) => BuilderT rep m a -> m (Stms rep) Source #
Like runBuilderT_
, but get the initial scope from the current
monad.
class ASTRep rep => BuilderOps rep where Source #
A BuilderT
(and by extension, a Builder
) is only an instance of
MonadBuilder
for representations that implement this type class,
which contains methods for constructing statements.
Minimal complete definition
Nothing
Methods
mkExpDecB :: (MonadBuilder m, Rep m ~ rep) => Pat (LetDec rep) -> Exp rep -> m (ExpDec rep) Source #
default mkExpDecB :: (MonadBuilder m, Buildable rep) => Pat (LetDec rep) -> Exp rep -> m (ExpDec rep) Source #
mkBodyB :: (MonadBuilder m, Rep m ~ rep) => Stms rep -> Result -> m (Body rep) Source #
mkLetNamesB :: (MonadBuilder m, Rep m ~ rep) => [VName] -> Exp rep -> m (Stm rep) Source #
default mkLetNamesB :: (MonadBuilder m, Rep m ~ rep, Buildable rep) => [VName] -> Exp rep -> m (Stm rep) Source #
Instances
BuilderOps GPU Source # | |
Defined in Futhark.IR.GPU | |
BuilderOps GPUMem Source # | |
Defined in Futhark.IR.GPUMem Methods mkExpDecB :: (MonadBuilder m, Rep m ~ GPUMem) => Pat (LetDec GPUMem) -> Exp GPUMem -> m (ExpDec GPUMem) Source # mkBodyB :: (MonadBuilder m, Rep m ~ GPUMem) => Stms GPUMem -> Result -> m (Body GPUMem) Source # mkLetNamesB :: (MonadBuilder m, Rep m ~ GPUMem) => [VName] -> Exp GPUMem -> m (Stm GPUMem) Source # | |
BuilderOps MC Source # | |
BuilderOps MCMem Source # | |
Defined in Futhark.IR.MCMem Methods mkExpDecB :: (MonadBuilder m, Rep m ~ MCMem) => Pat (LetDec MCMem) -> Exp MCMem -> m (ExpDec MCMem) Source # mkBodyB :: (MonadBuilder m, Rep m ~ MCMem) => Stms MCMem -> Result -> m (Body MCMem) Source # mkLetNamesB :: (MonadBuilder m, Rep m ~ MCMem) => [VName] -> Exp MCMem -> m (Stm MCMem) Source # | |
BuilderOps SOACS Source # | |
Defined in Futhark.IR.SOACS Methods mkExpDecB :: (MonadBuilder m, Rep m ~ SOACS) => Pat (LetDec SOACS) -> Exp SOACS -> m (ExpDec SOACS) Source # mkBodyB :: (MonadBuilder m, Rep m ~ SOACS) => Stms SOACS -> Result -> m (Body SOACS) Source # mkLetNamesB :: (MonadBuilder m, Rep m ~ SOACS) => [VName] -> Exp SOACS -> m (Stm SOACS) Source # | |
BuilderOps Seq Source # | |
Defined in Futhark.IR.Seq | |
BuilderOps SeqMem Source # | |
Defined in Futhark.IR.SeqMem Methods mkExpDecB :: (MonadBuilder m, Rep m ~ SeqMem) => Pat (LetDec SeqMem) -> Exp SeqMem -> m (ExpDec SeqMem) Source # mkBodyB :: (MonadBuilder m, Rep m ~ SeqMem) => Stms SeqMem -> Result -> m (Body SeqMem) Source # mkLetNamesB :: (MonadBuilder m, Rep m ~ SeqMem) => [VName] -> Exp SeqMem -> m (Stm SeqMem) Source # | |
(ASTRep rep, AliasedOp (OpC rep), Buildable (Aliases rep)) => BuilderOps (Aliases rep) Source # | |
Defined in Futhark.IR.Aliases Methods mkExpDecB :: (MonadBuilder m, Rep m ~ Aliases rep) => Pat (LetDec (Aliases rep)) -> Exp (Aliases rep) -> m (ExpDec (Aliases rep)) Source # mkBodyB :: (MonadBuilder m, Rep m ~ Aliases rep) => Stms (Aliases rep) -> Result -> m (Body (Aliases rep)) Source # mkLetNamesB :: (MonadBuilder m, Rep m ~ Aliases rep) => [VName] -> Exp (Aliases rep) -> m (Stm (Aliases rep)) Source # | |
BuilderOps (Wise GPU) Source # | |
Defined in Futhark.IR.GPU.Simplify Methods mkExpDecB :: (MonadBuilder m, Rep m ~ Wise GPU) => Pat (LetDec (Wise GPU)) -> Exp (Wise GPU) -> m (ExpDec (Wise GPU)) Source # mkBodyB :: (MonadBuilder m, Rep m ~ Wise GPU) => Stms (Wise GPU) -> Result -> m (Body (Wise GPU)) Source # mkLetNamesB :: (MonadBuilder m, Rep m ~ Wise GPU) => [VName] -> Exp (Wise GPU) -> m (Stm (Wise GPU)) Source # | |
BuilderOps (Wise GPUMem) Source # | |
Defined in Futhark.IR.GPUMem Methods mkExpDecB :: (MonadBuilder m, Rep m ~ Wise GPUMem) => Pat (LetDec (Wise GPUMem)) -> Exp (Wise GPUMem) -> m (ExpDec (Wise GPUMem)) Source # mkBodyB :: (MonadBuilder m, Rep m ~ Wise GPUMem) => Stms (Wise GPUMem) -> Result -> m (Body (Wise GPUMem)) Source # mkLetNamesB :: (MonadBuilder m, Rep m ~ Wise GPUMem) => [VName] -> Exp (Wise GPUMem) -> m (Stm (Wise GPUMem)) Source # | |
BuilderOps (Wise MC) Source # | |
Defined in Futhark.IR.MC Methods mkExpDecB :: (MonadBuilder m, Rep m ~ Wise MC) => Pat (LetDec (Wise MC)) -> Exp (Wise MC) -> m (ExpDec (Wise MC)) Source # mkBodyB :: (MonadBuilder m, Rep m ~ Wise MC) => Stms (Wise MC) -> Result -> m (Body (Wise MC)) Source # mkLetNamesB :: (MonadBuilder m, Rep m ~ Wise MC) => [VName] -> Exp (Wise MC) -> m (Stm (Wise MC)) Source # | |
BuilderOps (Wise MCMem) Source # | |
Defined in Futhark.IR.MCMem Methods mkExpDecB :: (MonadBuilder m, Rep m ~ Wise MCMem) => Pat (LetDec (Wise MCMem)) -> Exp (Wise MCMem) -> m (ExpDec (Wise MCMem)) Source # mkBodyB :: (MonadBuilder m, Rep m ~ Wise MCMem) => Stms (Wise MCMem) -> Result -> m (Body (Wise MCMem)) Source # mkLetNamesB :: (MonadBuilder m, Rep m ~ Wise MCMem) => [VName] -> Exp (Wise MCMem) -> m (Stm (Wise MCMem)) Source # | |
BuilderOps (Wise SOACS) Source # | |
Defined in Futhark.IR.SOACS.Simplify Methods mkExpDecB :: (MonadBuilder m, Rep m ~ Wise SOACS) => Pat (LetDec (Wise SOACS)) -> Exp (Wise SOACS) -> m (ExpDec (Wise SOACS)) Source # mkBodyB :: (MonadBuilder m, Rep m ~ Wise SOACS) => Stms (Wise SOACS) -> Result -> m (Body (Wise SOACS)) Source # mkLetNamesB :: (MonadBuilder m, Rep m ~ Wise SOACS) => [VName] -> Exp (Wise SOACS) -> m (Stm (Wise SOACS)) Source # | |
BuilderOps (Wise Seq) Source # | |
Defined in Futhark.IR.Seq Methods mkExpDecB :: (MonadBuilder m, Rep m ~ Wise Seq) => Pat (LetDec (Wise Seq)) -> Exp (Wise Seq) -> m (ExpDec (Wise Seq)) Source # mkBodyB :: (MonadBuilder m, Rep m ~ Wise Seq) => Stms (Wise Seq) -> Result -> m (Body (Wise Seq)) Source # mkLetNamesB :: (MonadBuilder m, Rep m ~ Wise Seq) => [VName] -> Exp (Wise Seq) -> m (Stm (Wise Seq)) Source # | |
BuilderOps (Wise SeqMem) Source # | |
Defined in Futhark.IR.SeqMem Methods mkExpDecB :: (MonadBuilder m, Rep m ~ Wise SeqMem) => Pat (LetDec (Wise SeqMem)) -> Exp (Wise SeqMem) -> m (ExpDec (Wise SeqMem)) Source # mkBodyB :: (MonadBuilder m, Rep m ~ Wise SeqMem) => Stms (Wise SeqMem) -> Result -> m (Body (Wise SeqMem)) Source # mkLetNamesB :: (MonadBuilder m, Rep m ~ Wise SeqMem) => [VName] -> Exp (Wise SeqMem) -> m (Stm (Wise SeqMem)) Source # |
runBuilder :: (MonadFreshNames m, HasScope somerep m, SameScope somerep rep) => Builder rep a -> m (a, Stms rep) Source #
Run a builder action, returning a value and the statements added
(addStm
) during the action. Assumes that the current monad
provides initial scope and name source.
runBuilder_ :: (MonadFreshNames m, HasScope somerep m, SameScope somerep rep) => Builder rep a -> m (Stms rep) Source #
Like runBuilder
, but throw away the result and just return the
added statements.
runBodyBuilder :: (Buildable rep, MonadFreshNames m, HasScope somerep m, SameScope somerep rep) => Builder rep Result -> m (Body rep) Source #
Run a builder that produces a Result
and construct a body that
contains that result alongside the statements produced during the
builder.
runLambdaBuilder :: (Buildable rep, MonadFreshNames m, HasScope somerep m, SameScope somerep rep) => [LParam rep] -> Builder rep Result -> m (Lambda rep) Source #
Given lambda parameters, Run a builder action that produces the
statements and returns the Result
of the lambda body.
The MonadBuilder
typeclass
module Futhark.Builder.Class