From 11bb05374c1a82c2717c3d83e4f72e7c7715ed42 Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Sun, 16 Aug 2020 12:50:51 -0400 Subject: [PATCH] simplify duplicate genvar conversion --- src/Convert/DuplicateGenvar.hs | 43 +++++++--------------------------- 1 file changed, 8 insertions(+), 35 deletions(-) diff --git a/src/Convert/DuplicateGenvar.hs b/src/Convert/DuplicateGenvar.hs index 2c2ee71..fae44d5 100644 --- a/src/Convert/DuplicateGenvar.hs +++ b/src/Convert/DuplicateGenvar.hs @@ -6,47 +6,20 @@ module Convert.DuplicateGenvar (convert) where -import Control.Monad.State.Strict -import qualified Data.Set as Set - +import Convert.Scoper import Convert.Traverse import Language.SystemVerilog.AST -type IdentSet = Set.Set Identifier - convert :: [AST] -> [AST] convert = map $ traverseDescriptions traverseDescription traverseDescription :: Description -> Description -traverseDescription (part @ Part{}) = - Part attrs extern kw lifetime name ports items' - where - Part attrs extern kw lifetime name ports items = part - -- intentionally only looks at top level module items - items' = evalState (mapM traverseModuleItemM items) Set.empty -traverseDescription other = other +traverseDescription = partScoper return traverseModuleItemM return return -traverseModuleItemM :: ModuleItem -> State IdentSet ModuleItem +traverseModuleItemM :: ModuleItem -> Scoper () ModuleItem traverseModuleItemM (Genvar x) = do - alreadyExists <- gets $ Set.member x - if alreadyExists - then return $ Generate [] - else do - modify $ Set.insert x - return $ Genvar x -traverseModuleItemM (Generate items) = do - s <- get - items' <- traverseItems items - s' <- get - items'' <- traverseItems items' - let genvarDecls = map (GenModuleItem . Genvar) $ - Set.toList $ Set.difference s' s - return $ Generate (genvarDecls ++ items'') - where traverseItems = mapM $ traverseNestedGenItemsM traverseGenItemM -traverseModuleItemM other = return other - -traverseGenItemM :: GenItem -> State IdentSet GenItem -traverseGenItemM (GenModuleItem item) = do - item' <- traverseModuleItemM item - return $ GenModuleItem item' -traverseGenItemM other = return other + details <- lookupElemM x + if details == Nothing + then insertElem x () >> return (Genvar x) + else return $ Generate [] +traverseModuleItemM item = return item