Add a BindMap argument to flattenExpr.
[matthijs/master-project/cλash.git] / Flatten.hs
index 3c5fda7b9537a801915b23ff0472720179127327..0ee9595cbf1f3072ddec2e9099370a6e86fe304a 100644 (file)
@@ -22,12 +22,13 @@ data FlatFunction = FlatFunction {
 type SignalUseMap = HsValueMap SignalUse
 type SignalDefMap = HsValueMap SignalDef
 
+type SignalId = Int
 data SignalUse = SignalUse {
-  sigUseId :: Int
+  sigUseId :: SignalId
 } deriving (Show, Eq)
 
 data SignalDef = SignalDef {
-  sigDefId :: Int
+  sigDefId :: SignalId
 } deriving (Show, Eq)
 
 data App = App {
@@ -75,7 +76,26 @@ type BindMap = [(
     )
   )]
 
-type FlattenState = State.State ([App], [CondDef], Int)
+type FlattenState = State.State ([App], [CondDef], SignalId)
+
+-- | Add an application to the current FlattenState
+addApp :: App -> FlattenState ()
+addApp a = do
+  (apps, conds, n) <- State.get
+  State.put (a:apps, conds, n)
+
+-- | Add a conditional definition to the current FlattenState
+addCondDef :: CondDef -> FlattenState ()
+addCondDef c = do
+  (apps, conds, n) <- State.get
+  State.put (apps, c:conds, n)
+
+-- | Generates a new signal id, which is unique within the current flattening.
+genSignalId :: FlattenState SignalId 
+genSignalId = do
+  (apps, conds, n) <- State.get
+  State.put (apps, conds, n+1)
+  return n
 
 -- | Flatten a haskell function
 flattenFunction ::
@@ -88,15 +108,17 @@ flattenFunction hsfunc bind@(NonRec var expr) =
   FlatFunction args res apps conds
   where
     init_state        = ([], [], 0)
-    (fres, end_state) = State.runState (flattenExpr expr) init_state
+    (fres, end_state) = State.runState (flattenExpr [] expr) init_state
     (args, res)       = fres
     (apps, conds, _)  = end_state
 
 flattenExpr ::
-  CoreExpr
+  BindMap
+  -> CoreExpr
   -> FlattenState ([SignalDefMap], SignalUseMap)
 
-flattenExpr _ = do
+
+flattenExpr _ _ = do
   return ([], Tuple [])