Make modFuncs work with stateful functions.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Fri, 13 Feb 2009 15:04:32 +0000 (16:04 +0100)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Fri, 13 Feb 2009 15:04:32 +0000 (16:04 +0100)
This allows createArchitecture and createEntity to access the current
session.

Translator.hs
TranslatorTypes.hs
VHDL.hs

index 88f321eaf10e127f3cc20344f8363df96f7456b1..37a812b2bceca493cf1e95824c6b7ea4b4484d4e 100644 (file)
@@ -177,19 +177,19 @@ mkHsFunction f ty =
 nameFlatFunction ::
   HsFunction
   -> FuncData
-  -> FuncData
+  -> VHDLState ()
 
 nameFlatFunction hsfunc fdata =
   let func = flatFunc fdata in
   case func of
     -- Skip (builtin) functions without a FlatFunction
-    Nothing -> fdata
+    Nothing -> do return ()
     -- Name the signals in all other functions
     Just flatfunc ->
       let s = flat_sigs flatfunc in
       let s' = map (\(id, (SignalInfo Nothing ty)) -> (id, SignalInfo (Just $ "sig_" ++ (show id)) ty)) s in
       let flatfunc' = flatfunc { flat_sigs = s' } in
-      fdata { flatFunc = Just flatfunc' }
+      setFlatFunc hsfunc flatfunc'
 
 -- | Splits a tuple type into a list of element types, or Nothing if the type
 --   is not a tuple type.
index 5d1ecf74343f98332901c974b069d805f858baa1..9a521b840057cbf114611731b17c03a784fb6a11 100644 (file)
@@ -50,11 +50,27 @@ getFuncs = do
   fs <- State.gets funcs -- Get the funcs element from the session
   return $ Map.toList fs
 
--- | Sets the FlatFunction for the given HsFunction in the given setting.
+-- | Gets all the functions from the current session
+getHsFuncs :: VHDLState [HsFunction]
+getHsFuncs = do
+  fs <- State.gets funcs -- Get the funcs element from the session
+  return $ Map.keys fs
+  
+-- | Sets the FlatFunction for the given HsFunction in the current session.
 setFlatFunc :: HsFunction -> FlatFunction -> VHDLState ()
 setFlatFunc hsfunc flatfunc =
   modFunc (\d -> d { flatFunc = Just flatfunc }) hsfunc
 
+-- | Sets the Entity for the given HsFunction in the current session.
+setEntity :: HsFunction -> Entity -> VHDLState ()
+setEntity hsfunc entity =
+  modFunc (\d -> d { funcEntity = Just entity }) hsfunc
+
+-- | Sets the Entity for the given HsFunction in the current session.
+setArchitecture :: HsFunction -> AST.ArchBody -> VHDLState ()
+setArchitecture hsfunc arch =
+  modFunc (\d -> d { funcArch = Just arch }) hsfunc
+
 -- | Modify a function in the map using the given function
 modFunc :: (FuncData -> FuncData) -> HsFunction -> VHDLState ()
 modFunc f hsfunc =
@@ -67,10 +83,20 @@ modFuncMap f = do
   let fs' = f fs
   State.modify (\x -> x {funcs = fs' })
 
--- | Modify all functions in the map using the given function
-modFuncs :: (HsFunction -> FuncData -> FuncData) -> VHDLState ()
-modFuncs f =
-  modFuncMap (Map.mapWithKey f)
+-- | Apply the given function to all functions in the map, and collect the
+--   results. The function is allowed to change the function map in the
+--   session, but any new functions added will not be mapped.
+modFuncs :: (HsFunction -> FuncData -> VHDLState ()) -> VHDLState ()
+modFuncs f = do
+  hsfuncs <- getHsFuncs
+  mapM doFunc hsfuncs
+  return ()
+  where
+    doFunc hsfunc = do
+      fdata_maybe <- getFunc hsfunc
+      case fdata_maybe of
+        Nothing -> do return ()
+        Just fdata -> f hsfunc fdata
 
 getModule :: VHDLState HscTypes.CoreModule
 getModule = State.gets coreMod -- Get the coreMod element from the session
diff --git a/VHDL.hs b/VHDL.hs
index 6b8b7b6d3ba26635ad94832659b9d41dc30615c9..eac7079155bd8d0b89e02aa441b321e9be890874 100644 (file)
--- a/VHDL.hs
+++ b/VHDL.hs
@@ -22,13 +22,13 @@ import TranslatorTypes
 createEntity ::
   HsFunction        -- | The function signature
   -> FuncData       -- | The function data collected so far
-  -> FuncData       -- | The modified function data
+  -> VHDLState ()
 
 createEntity hsfunc fdata = 
   let func = flatFunc fdata in
   case func of
     -- Skip (builtin) functions without a FlatFunction
-    Nothing -> fdata
+    Nothing -> do return ()
     -- Create an entity for all other functions
     Just flatfunc ->
       
@@ -41,7 +41,7 @@ createEntity hsfunc fdata =
         ent_decl' = createEntityAST hsfunc args' res'
         entity' = Entity args' res' (Just ent_decl')
       in
-        fdata { funcEntity = Just entity' }
+        setEntity hsfunc entity'
   where
     mkMap :: Eq id => [(id, SignalInfo)] -> id -> (AST.VHDLId, AST.TypeMark)
     mkMap sigmap id =
@@ -89,13 +89,13 @@ mkEntityId hsfunc =
 createArchitecture ::
   HsFunction        -- | The function signature
   -> FuncData       -- | The function data collected so far
-  -> FuncData       -- | The modified function data
+  -> VHDLState ()
 
 createArchitecture hsfunc fdata = 
   let func = flatFunc fdata in
   case func of
     -- Skip (builtin) functions without a FlatFunction
-    Nothing -> fdata
+    Nothing -> do return ()
     -- Create an architecture for all other functions
     Just flatfunc ->
       let 
@@ -113,7 +113,7 @@ createArchitecture hsfunc fdata =
         insts    = map (AST.CSISm . mkCompInsSm) apps
         arch     = AST.ArchBody (mkVHDLId "structural") (AST.NSimple entity_id) (map AST.BDISD sig_decs) insts
       in
-        fdata { funcArch = Just arch }
+        setArchitecture hsfunc arch
 
 mkSigDec :: SignalInfo -> AST.SigDec
 mkSigDec info =