Copyright | (C) 2012-2016 University of Twente |
---|---|
License | BSD2 (see the file LICENSE) |
Maintainer | Christiaan Baaij <christiaan.baaij@gmail.com> |
Safe Haskell | None |
Language | Haskell2010 |
Utility functions used by the normalisation transformations
Synopsis
- isConstantArg :: Text -> Int -> RewriteMonad NormalizeState Bool
- shouldReduce :: Context -> RewriteMonad NormalizeState Bool
- alreadyInlined :: Id -> Id -> NormalizeMonad (Maybe Int)
- addNewInline :: Id -> Id -> NormalizeMonad ()
- specializeNorm :: NormRewrite
- isRecursiveBndr :: Id -> NormalizeSession Bool
- isClosed :: TyConMap -> Term -> Bool
- callGraph :: BindingMap -> Id -> CallGraph
- classifyFunction :: Term -> TermClassification
- isCheapFunction :: Term -> Bool
- isNonRecursiveGlobalVar :: Term -> NormalizeSession Bool
- canConstantSpec :: Term -> RewriteMonad NormalizeState Bool
- normalizeTopLvlBndr :: Id -> (Id, SrcSpan, InlineSpec, Term) -> NormalizeSession (Id, SrcSpan, InlineSpec, Term)
- rewriteExpr :: (String, NormRewrite) -> (String, Term) -> (Id, SrcSpan) -> NormalizeSession Term
- removedTm :: Type -> Term
Documentation
:: Text | Primitive name |
-> Int | Argument number |
-> RewriteMonad NormalizeState Bool | Yields |
Determine if argument should reduce to a constant given a primitive and an argument number. Caches results.
:: Context | ..in the current transformcontext |
-> RewriteMonad NormalizeState Bool |
Given a list of transformation contexts, determine if any of the contexts indicates that the current arg is to be reduced to a constant / literal.
:: Id | Function we want to inline |
-> Id | Function in which we want to perform the inlining |
-> NormalizeMonad (Maybe Int) |
Determine if a function is already inlined in the context of the NetlistMonad
:: Id | Function we want to inline |
-> Id | Function in which we want to perform the inlining |
-> NormalizeMonad () |
specializeNorm :: NormRewrite Source #
Specialize under the Normalization Monad
isRecursiveBndr :: Id -> NormalizeSession Bool Source #
Assert whether a name is a reference to a recursive binder.
callGraph :: BindingMap -> Id -> CallGraph Source #
Create a call graph for a set of global binders, given a root
classifyFunction :: Term -> TermClassification Source #
Give a "performance/size" classification of a function in normal form.
isCheapFunction :: Term -> Bool Source #
Determine whether a function adds a lot of hardware or not.
It is considered expensive when it has 2 or more of the following components:
- functions
- primitives
- selections (multiplexers)
isNonRecursiveGlobalVar :: Term -> NormalizeSession Bool Source #
Test whether a given term represents a non-recursive global variable
canConstantSpec :: Term -> RewriteMonad NormalizeState Bool Source #
Test if we can constant specialize current term in current function. The rules are, we can constant fold if:
- Term does not carry a clock or reset
- Term is constant is
isConstant
sense, and additionally when term is a global, non-recursive variable
normalizeTopLvlBndr :: Id -> (Id, SrcSpan, InlineSpec, Term) -> NormalizeSession (Id, SrcSpan, InlineSpec, Term) Source #
:: (String, NormRewrite) | Transformation to apply |
-> (String, Term) | Term to transform |
-> (Id, SrcSpan) | Renew current function being rewritten |
-> NormalizeSession Term |
Rewrite a term according to the provided transformation