futhark-0.19.7: An optimising compiler for a functional, array-oriented language.
Safe HaskellSafe-Inferred
LanguageHaskell2010

Futhark.Binder.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)) => Bindable 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 MonadBinder instance, it is acceptable for them to create new bindings, however.

Methods

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

mkExpDec :: Pattern 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
Bindable Seq Source # 
Instance details

Defined in Futhark.IR.Seq

Bindable SOACS Source # 
Instance details

Defined in Futhark.IR.SOACS

Bindable MC Source # 
Instance details

Defined in Futhark.IR.MC

Bindable GPU Source # 
Instance details

Defined in Futhark.IR.GPU

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

Defined in Futhark.IR.Aliases

Methods

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

mkExpDec :: Pattern (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 #

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

Defined in Futhark.Optimise.Simplify.Rep

Methods

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

mkExpDec :: Pattern (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 :: Bindable rep => [Ident] -> [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' :: Bindable rep => [Ident] -> [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) => MonadBinder 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 :: Pattern (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 :: Certificates -> m a -> m a Source #

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

Instances

Instances details
MonadBinder InternaliseM Source # 
Instance details

Defined in Futhark.Internalise.Monad

Associated Types

type Rep InternaliseM Source #

(ASTRep rep, BinderOps rep) => MonadBinder (RuleM rep) Source # 
Instance details

Defined in Futhark.Optimise.Simplify.Rule

Associated Types

type Rep (RuleM rep) Source #

Methods

mkExpDecM :: Pattern (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 :: Certificates -> RuleM rep a -> RuleM rep a Source #

(ASTRep rep, MonadFreshNames m, BinderOps rep) => MonadBinder (BinderT rep m) Source # 
Instance details

Defined in Futhark.Binder

Associated Types

type Rep (BinderT rep m) Source #

Methods

mkExpDecM :: Pattern (Rep (BinderT rep m)) -> Exp (Rep (BinderT rep m)) -> BinderT rep m (ExpDec (Rep (BinderT rep m))) Source #

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

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

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

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

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

certifying :: Certificates -> BinderT rep m a -> BinderT rep m a Source #

(Allocable fromrep torep, Allocator torep (AllocM fromrep torep)) => MonadBinder (AllocM fromrep torep) Source # 
Instance details

Defined in Futhark.Pass.ExplicitAllocations

Associated Types

type Rep (AllocM fromrep torep) Source #

Methods

mkExpDecM :: Pattern (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 :: Certificates -> AllocM fromrep torep a -> AllocM fromrep torep a Source #

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

Add several bindings at the outermost level of a Body.

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

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

letBind :: MonadBinder m => Pattern (Rep m) -> Exp (Rep m) -> m () Source #

Add a statement with the given pattern and expression.

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

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

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

As collectStms, but throw away the ordinary result.

bodyBind :: MonadBinder m => Body (Rep m) -> m [SubExp] Source #

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

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

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

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

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