Work around some bugs in the current clash to make reducer compile correctly
[matthijs/master-project/cλash.git] / cλash / CLasH / Utils / Core / CoreTools.hs
index 3945cce2a72dcf5ef55a6e87d3bb2980eab553b7..094b70294ceabcca23e722df69c98e93e1bd85db 100644 (file)
@@ -36,6 +36,7 @@ import qualified Unique
 import qualified CoreUtils
 import qualified CoreFVs
 import qualified Literal
+import qualified MkCore
 
 -- Local imports
 import CLasH.Translator.TranslatorTypes
@@ -298,19 +299,29 @@ hasStateType expr = case getType expr of
   Just ty -> isStateType ty
 
 
--- | Flattens nested non-recursive lets into a single list of bindings. The
--- expression passed does not have to be a let expression, if it isn't an
--- empty list of bindings is returned.
+-- | Flattens nested lets into a single list of bindings. The expression
+--   passed does not have to be a let expression, if it isn't an empty list of
+--   bindings is returned.
 flattenLets ::
   CoreSyn.CoreExpr -- ^ The expression to flatten.
   -> ([Binding], CoreSyn.CoreExpr) -- ^ The bindings and resulting expression.
-flattenLets (CoreSyn.Let (CoreSyn.NonRec bndr expr) res) =
-  ((bndr, expr):bindings, res')
+flattenLets (CoreSyn.Let binds expr) = 
+  (bindings ++ bindings', expr')
   where
     -- Recursively flatten the contained expression
-    (bindings, res') = flattenLets res
+    (bindings', expr') =flattenLets expr
+    -- Flatten our own bindings to remove the Rec / NonRec constructors
+    bindings = CoreSyn.flattenBinds [binds]
 flattenLets expr = ([], expr)
 
+-- | Create bunch of nested non-recursive let expressions from the given
+-- bindings. The first binding is bound at the highest level (and thus
+-- available in all other bindings).
+mkNonRecLets :: [Binding] -> CoreSyn.CoreExpr -> CoreSyn.CoreExpr
+mkNonRecLets bindings expr = MkCore.mkCoreLets binds expr
+  where
+    binds = map (uncurry CoreSyn.NonRec) bindings
+
 -- | A class of things that (optionally) have a core Type. The type is
 -- optional, since Type expressions don't have a type themselves.
 class TypedThing t where