From 5f9b7f3e0c999e765f75b0c48b0f675d99842cea Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Fri, 13 Feb 2009 16:04:32 +0100 Subject: [PATCH] Make modFuncs work with stateful functions. This allows createArchitecture and createEntity to access the current session. --- Translator.hs | 6 +++--- TranslatorTypes.hs | 36 +++++++++++++++++++++++++++++++----- VHDL.hs | 12 ++++++------ 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/Translator.hs b/Translator.hs index 88f321e..37a812b 100644 --- a/Translator.hs +++ b/Translator.hs @@ -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. diff --git a/TranslatorTypes.hs b/TranslatorTypes.hs index 5d1ecf7..9a521b8 100644 --- a/TranslatorTypes.hs +++ b/TranslatorTypes.hs @@ -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 6b8b7b6..eac7079 100644 --- 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 = -- 2.30.2