Extract entities from the session and return them in the design file.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Fri, 13 Feb 2009 11:37:19 +0000 (12:37 +0100)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Fri, 13 Feb 2009 11:38:55 +0000 (12:38 +0100)
Translator.hs
TranslatorTypes.hs
VHDL.hs

index 30a71c5a2e68b51ef744ec917fa43f6c150e1a0f..b7d3e0ef32d681fc2f80562212a79d7960611a54 100644 (file)
@@ -70,9 +70,13 @@ main =
       mapM processBind binds
       modFuncs nameFlatFunction
       modFuncs VHDL.createEntity
+      -- Extract the library units generated from all the functions in the
+      -- session.
+      funcs <- getFuncs
+      let units = concat $ map VHDL.getLibraryUnits funcs
       return $ AST.DesignFile 
         []
-        []
+        units
 
 findBind :: [CoreBind] -> String -> Maybe CoreBind
 findBind binds lookfor =
index 75967c2d4c94e1672feed90ea6d1b715cc056c4d..99784409cc5bba03904df86098c719f4c81e5257 100644 (file)
@@ -43,6 +43,12 @@ getFunc hsfunc = do
   fs <- State.gets funcs -- Get the funcs element from the session
   return $ Map.lookup hsfunc fs
 
+-- | Gets all functions from the current session
+getFuncs :: VHDLState [(HsFunction, FuncData)]
+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.
 setFlatFunc :: HsFunction -> FlatFunction -> VHDLState ()
 setFlatFunc hsfunc flatfunc = do
diff --git a/VHDL.hs b/VHDL.hs
index 0387327c05d2c02f4503c4990e6d742200d4b009..efa14097adb09301b8a6f7a617fa3598b787f644 100644 (file)
--- a/VHDL.hs
+++ b/VHDL.hs
@@ -71,6 +71,16 @@ mkEntityId hsfunc =
   -- TODO: This doesn't work for functions with multiple signatures!
   mkVHDLId $ hsFuncName hsfunc
 
+getLibraryUnits ::
+  (HsFunction, FuncData)      -- | A function from the session
+  -> [AST.LibraryUnit]        -- | The library units it generates
+
+getLibraryUnits (hsfunc, fdata) =
+  case entity fdata of 
+    Nothing -> []
+    Just ent -> case ent_decl ent of
+      Nothing -> []
+      Just decl -> [AST.LUEntity decl]
 
 -- | The VHDL Bit type
 bit_ty :: AST.TypeMark