futhark-0.20.6: An optimising compiler for a functional, array-oriented language.
Safe HaskellNone
LanguageHaskell2010

Futhark.Builder.Class

Description

This module defines a convenience typeclass for creating normalised programs.

See Futhark.Construct for a high-level description.

Synopsis

Documentation

class (ASTRep rep, FParamInfo rep ~ DeclType, LParamInfo rep ~ Type, RetType rep ~ DeclExtType, BranchType rep ~ ExtType, SetType (LetDec rep)) => Buildable rep where Source #

The class of representations that can be constructed solely from an expression, within some monad. Very important: the methods should not have any significant side effects! They may be called more often than you think, and the results thrown away. If used exclusively within a MonadBuilder instance, it is acceptable for them to create new bindings, however.

Methods

mkExpPat :: [Ident] -> Exp rep -> Pat rep Source #

mkExpDec :: Pat rep -> Exp rep -> ExpDec rep Source #

mkBody :: Stms rep -> Result -> Body rep Source #

mkLetNames :: (MonadFreshNames m, HasScope rep m) => [VName] -> Exp rep -> m (Stm rep) Source #

Instances

Instances details
Buildable Seq Source # 
Instance details

Defined in Futhark.IR.Seq

Buildable SOACS Source # 
Instance details

Defined in Futhark.IR.SOACS

Buildable MC Source # 
Instance details

Defined in Futhark.IR.MC

Buildable GPU Source # 
Instance details

Defined in Futhark.IR.GPU

(Buildable rep, CanBeAliased (Op rep)) => Buildable (Aliases rep) Source # 
Instance details

Defined in Futhark.IR.Aliases

Methods

mkExpPat :: [Ident] -> Exp (Aliases rep) -> Pat (Aliases rep) Source #

mkExpDec :: Pat (Aliases rep) -> Exp (Aliases rep) -> ExpDec (Aliases rep) Source #

mkBody :: Stms (Aliases rep) -> Result -> Body (Aliases rep) Source #

mkLetNames :: (MonadFreshNames m, HasScope (Aliases rep) m) => [VName] -> Exp (Aliases rep) -> m (Stm (Aliases rep)) Source #

(Buildable rep, CanBeWise (Op rep)) => Buildable (Wise rep) Source # 
Instance details

Defined in Futhark.Optimise.Simplify.Rep

Methods

mkExpPat :: [Ident] -> Exp (Wise rep) -> Pat (Wise rep) Source #

mkExpDec :: Pat (Wise rep) -> Exp (Wise rep) -> ExpDec (Wise rep) Source #

mkBody :: Stms (Wise rep) -> Result -> Body (Wise rep) Source #

mkLetNames :: (MonadFreshNames m, HasScope (Wise rep) m) => [VName] -> Exp (Wise rep) -> m (Stm (Wise rep)) Source #

mkLet :: Buildable rep => [Ident] -> Exp rep -> Stm rep Source #

Construct a Stm from identifiers for the context- and value part of the pattern, as well as the expression.

mkLet' :: Buildable rep => [Ident] -> StmAux a -> Exp rep -> Stm rep Source #

Like mkLet, but also take attributes and certificates from the given StmAux.

class (ASTRep (Rep m), MonadFreshNames m, Applicative m, Monad m, LocalScope (Rep m) m) => MonadBuilder m where Source #

A monad that supports the creation of bindings from expressions and bodies from bindings, with a specific rep. This is the main typeclass that a monad must implement in order for it to be useful for generating or modifying Futhark code. Most importantly maintains a current state of Stms (as well as a Scope) that have been added with addStm.

Very important: the methods should not have any significant side effects! They may be called more often than you think, and the results thrown away. It is acceptable for them to create new bindings, however.

Minimal complete definition

mkExpDecM, mkBodyM, mkLetNamesM, addStms, collectStms

Associated Types

type Rep m :: Type Source #

Methods

mkExpDecM :: Pat (Rep m) -> Exp (Rep m) -> m (ExpDec (Rep m)) Source #

mkBodyM :: Stms (Rep m) -> Result -> m (Body (Rep m)) Source #

mkLetNamesM :: [VName] -> Exp (Rep m) -> m (Stm (Rep m)) Source #

addStm :: Stm (Rep m) -> m () Source #

Add a statement to the Stms under construction.

addStms :: Stms (Rep m) -> m () Source #

Add multiple statements to the Stms under construction.

collectStms :: m a -> m (a, Stms (Rep m)) Source #

Obtain the statements constructed during a monadic action, instead of adding them to the state.

certifying :: Certs -> m a -> m a Source #

Add the provided certificates to any statements added during execution of the action.

Instances

Instances details
MonadBuilder InternaliseM Source # 
Instance details

Defined in Futhark.Internalise.Monad

Associated Types

type Rep InternaliseM Source #

(ASTRep rep, BuilderOps rep) => MonadBuilder (RuleM rep) Source # 
Instance details

Defined in Futhark.Optimise.Simplify.Rule

Associated Types

type Rep (RuleM rep) Source #

Methods

mkExpDecM :: Pat (Rep (RuleM rep)) -> Exp (Rep (RuleM rep)) -> RuleM rep (ExpDec (Rep (RuleM rep))) Source #

mkBodyM :: Stms (Rep (RuleM rep)) -> Result -> RuleM rep (Body (Rep (RuleM rep))) Source #

mkLetNamesM :: [VName] -> Exp (Rep (RuleM rep)) -> RuleM rep (Stm (Rep (RuleM rep))) Source #

addStm :: Stm (Rep (RuleM rep)) -> RuleM rep () Source #

addStms :: Stms (Rep (RuleM rep)) -> RuleM rep () Source #

collectStms :: RuleM rep a -> RuleM rep (a, Stms (Rep (RuleM rep))) Source #

certifying :: Certs -> RuleM rep a -> RuleM rep a Source #

(ASTRep rep, MonadFreshNames m, BuilderOps rep) => MonadBuilder (BuilderT rep m) Source # 
Instance details

Defined in Futhark.Builder

Associated Types

type Rep (BuilderT rep m) Source #

Methods

mkExpDecM :: Pat (Rep (BuilderT rep m)) -> Exp (Rep (BuilderT rep m)) -> BuilderT rep m (ExpDec (Rep (BuilderT rep m))) Source #

mkBodyM :: Stms (Rep (BuilderT rep m)) -> Result -> BuilderT rep m (Body (Rep (BuilderT rep m))) Source #

mkLetNamesM :: [VName] -> Exp (Rep (BuilderT rep m)) -> BuilderT rep m (Stm (Rep (BuilderT rep m))) Source #

addStm :: Stm (Rep (BuilderT rep m)) -> BuilderT rep m () Source #

addStms :: Stms (Rep (BuilderT rep m)) -> BuilderT rep m () Source #

collectStms :: BuilderT rep m a -> BuilderT rep m (a, Stms (Rep (BuilderT rep m))) Source #

certifying :: Certs -> BuilderT rep m a -> BuilderT rep m a Source #

Allocable fromrep torep inner => MonadBuilder (AllocM fromrep torep) Source # 
Instance details

Defined in Futhark.Pass.ExplicitAllocations

Associated Types

type Rep (AllocM fromrep torep) Source #

Methods

mkExpDecM :: Pat (Rep (AllocM fromrep torep)) -> Exp (Rep (AllocM fromrep torep)) -> AllocM fromrep torep (ExpDec (Rep (AllocM fromrep torep))) Source #

mkBodyM :: Stms (Rep (AllocM fromrep torep)) -> Result -> AllocM fromrep torep (Body (Rep (AllocM fromrep torep))) Source #

mkLetNamesM :: [VName] -> Exp (Rep (AllocM fromrep torep)) -> AllocM fromrep torep (Stm (Rep (AllocM fromrep torep))) Source #

addStm :: Stm (Rep (AllocM fromrep torep)) -> AllocM fromrep torep () Source #

addStms :: Stms (Rep (AllocM fromrep torep)) -> AllocM fromrep torep () Source #

collectStms :: AllocM fromrep torep a -> AllocM fromrep torep (a, Stms (Rep (AllocM fromrep torep))) Source #

certifying :: Certs -> AllocM fromrep torep a -> AllocM fromrep torep a Source #

insertStms :: Buildable rep => Stms rep -> Body rep -> Body rep Source #

Add several bindings at the outermost level of a Body.

insertStm :: Buildable rep => Stm rep -> Body rep -> Body rep Source #

Add a single binding at the outermost level of a Body.

letBind :: MonadBuilder m => Pat (Rep m) -> Exp (Rep m) -> m () Source #

Add a statement with the given pattern and expression.

letBindNames :: MonadBuilder m => [VName] -> Exp (Rep m) -> m () Source #

Add a statement with the given pattern element names and expression.

collectStms_ :: MonadBuilder m => m a -> m (Stms (Rep m)) Source #

As collectStms, but throw away the ordinary result.

bodyBind :: MonadBuilder m => Body (Rep m) -> m Result Source #

Add the statements of the body, then return the body result.

attributing :: MonadBuilder m => Attrs -> m a -> m a Source #

Add the given attributes to any statements added by this action.

auxing :: MonadBuilder m => StmAux anyrep -> m a -> m a Source #

Add the certificates and attributes to any statements added by this action.