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