Name signals in a function after flattening it.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Fri, 13 Feb 2009 09:43:09 +0000 (10:43 +0100)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Fri, 13 Feb 2009 09:44:54 +0000 (10:44 +0100)
FlattenTypes.hs
Pretty.hs
Translator.hs
TranslatorTypes.hs

index 024db9b5332c6f4d94a22b356ed697d966ab70b8..b14ef387dc6f1300a0742a9ea2001f5f17ff4416 100644 (file)
@@ -76,7 +76,8 @@ data CondDef sigid = CondDef {
 
 -- | Information on a signal definition
 data Signal sigid = Signal {
-  id :: sigid
+  id :: sigid,
+  name :: Maybe String
 } deriving (Eq, Show)
 
 -- | A flattened function
@@ -122,6 +123,7 @@ addCondDef c = do
 genSignalId :: FlattenState UnnamedSignal 
 genSignalId = do
   (apps, conds, sigs, n) <- State.get
-  let s = Signal n
+  -- Generate a new numbered but unnamed signal
+  let s = Signal n Nothing
   State.put (apps, conds, s:sigs, n+1)
   return n
index 21a3795ff6b71986f2d5bc897a2c844af16c8ae8..ee4b3be78ec7c1facf6ea2402e753b943cf36f16 100644 (file)
--- a/Pretty.hs
+++ b/Pretty.hs
@@ -43,7 +43,8 @@ instance Pretty id => Pretty (CondDef id) where
   pPrint _ = text "TODO"
 
 instance Pretty id => Pretty (Signal id) where
-  pPrint (Signal id) = pPrint id
+  pPrint (Signal id Nothing) = pPrint id
+  pPrint (Signal id (Just name)) = pPrint id <> text ":" <> text name
 
 instance Pretty VHDLSession where
   pPrint (VHDLSession mod nameCount funcs) =
index d0738d3f9175a8058d3621bdf17479d52ff3b517..bb5845b6febe4f5d90185249d9cfcb1ced265d5e 100644 (file)
@@ -68,6 +68,7 @@ main =
       mapM addBuiltIn builtin_funcs
       -- Create entities and architectures for them
       mapM processBind binds
+      modFuncs nameFlatFunction
       return $ AST.DesignFile 
         []
         []
@@ -166,6 +167,24 @@ mkHsFunction f ty =
           error $ "Input state type of function " ++ hsname ++ ": " ++ (showSDoc $ ppr state_ty) ++ " does not match output state type: " ++ (showSDoc $ ppr outstate_ty)
       otherwise                -> error $ "Return type of top-level function " ++ hsname ++ " must be a two-tuple containing a state and output ports."
 
+-- | Adds signal names to the given FlatFunction
+nameFlatFunction ::
+  HsFunction
+  -> FuncData
+  -> FuncData
+
+nameFlatFunction hsfunc fdata =
+  let func = flatFunc fdata in
+  case func of
+    -- Skip (builtin) functions without a FlatFunction
+    Nothing -> fdata
+    -- Name the signals in all other functions
+    Just flatfunc ->
+      let s = sigs flatfunc in
+      let s' = map (\(Signal id Nothing) -> Signal id (Just $ "sig_" ++ (show id))) s in
+      let flatfunc' = flatfunc { sigs = s' } in
+      fdata { flatFunc = Just flatfunc' }
+
 -- | Splits a tuple type into a list of element types, or Nothing if the type
 --   is not a tuple type.
 splitTupleType ::
index 72cd3981f97624175c816c50fd094fc330a4b9ae..271a5d39c019b56faab9e2112c6cedcdf13e9e94 100644 (file)
@@ -46,10 +46,11 @@ setFlatFunc hsfunc flatfunc = do
   let fs'= Map.adjust (\d -> d { flatFunc = Just flatfunc }) hsfunc fs
   State.modify (\x -> x {funcs = fs' })
 
-modFunc :: HsFunction -> (HsFunction -> FuncData -> FuncData) -> VHDLState ()
-modFunc hsfunc f = do
+-- | Modify all functions in the map using the given function
+modFuncs :: (HsFunction -> FuncData -> FuncData) -> VHDLState ()
+modFuncs f = do
   fs <- State.gets funcs -- Get the funcs element from the session
-  let fs' = Map.adjustWithKey f hsfunc fs
+  let fs' = Map.mapWithKey f fs
   State.modify (\x -> x {funcs = fs' })
 
 getModule :: VHDLState HscTypes.CoreModule