clash-0.1: CLasH/Normalize/NormalizeTypes.hs
module CLasH.Normalize.NormalizeTypes where
-- Standard modules
import qualified Control.Monad.Trans.Writer as Writer
import qualified Data.Monoid as Monoid
-- GHC API
import qualified CoreSyn
-- Local imports
import CLasH.Translator.TranslatorTypes
-- Wrap a writer around a TranslatorSession, to run a single transformation
-- over a single expression and track if the expression was changed.
type TransformMonad = Writer.WriterT Monoid.Any TranslatorSession
-- | In what context does a core expression occur?
data CoreContext = AppFirst -- ^ The expression is the first
-- argument of an application (i.e.,
-- it is applied)
| AppSecond -- ^ The expression is the second
-- argument of an application
-- (i.e., something is applied to it)
| LetBinding -- ^ The expression is bound in a
-- (recursive or non-recursive) let
-- expression.
| LetBody -- ^ The expression is the body of a
-- let expression
| LambdaBody -- ^ The expression is the body of a
-- lambda abstraction
| Other -- ^ Another context
deriving (Eq, Show)
-- | Transforms a CoreExpr and keeps track if it has changed.
type Transform = [CoreContext] -> CoreSyn.CoreExpr -> TransformMonad CoreSyn.CoreExpr