From 8537a9efdac7282c4d76993a4b6b8ab1a164f684 Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Wed, 22 Jul 2020 20:30:33 -0600 Subject: [PATCH] fix scoping of single-item generate conditionals --- src/Convert/Scoper.hs | 25 +++++++++++++++++-------- test/basic/generate_if_scope.sv | 9 +++++++++ test/basic/generate_if_scope.v | 9 +++++++++ 3 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 test/basic/generate_if_scope.sv create mode 100644 test/basic/generate_if_scope.v diff --git a/src/Convert/Scoper.hs b/src/Convert/Scoper.hs index 3769c84..81ffaaa 100644 --- a/src/Convert/Scoper.hs +++ b/src/Convert/Scoper.hs @@ -361,16 +361,13 @@ evalScoperT declMapper moduleItemMapper genItemMapper stmtMapper topName items = let genItems = map GenModuleItem injected' ++ [genItem''] return $ GenBlock "" genItems scopeGenItemMapper :: GenItem -> ScoperT a m GenItem - scopeGenItemMapper (GenFor (index, a) b c (GenBlock name genItems)) = do - enterScope name index - genItems' <- mapM fullGenItemMapper genItems - exitScope name index - return $ GenFor (index, a) b c (GenBlock name genItems') scopeGenItemMapper (GenFor (index, a) b c genItem) = do - enterScope "" index - genItem' <- fullGenItemMapper genItem - exitScope "" index + genItem' <- scopeGenItemBranchMapper index genItem return $ GenFor (index, a) b c genItem' + scopeGenItemMapper (GenIf cond thenItem elseItem) = do + thenItem' <- scopeGenItemBranchMapper "" thenItem + elseItem' <- scopeGenItemBranchMapper "" elseItem + return $ GenIf cond thenItem' elseItem' scopeGenItemMapper (GenBlock name genItems) = do enterScope name "" genItems' <- mapM fullGenItemMapper genItems @@ -381,6 +378,18 @@ evalScoperT declMapper moduleItemMapper genItemMapper stmtMapper topName items = scopeGenItemMapper genItem = traverseSinglyNestedGenItemsM fullGenItemMapper genItem + scopeGenItemBranchMapper :: Identifier -> GenItem -> ScoperT a m GenItem + scopeGenItemBranchMapper index (GenBlock name genItems) = do + enterScope name index + genItems' <- mapM fullGenItemMapper genItems + exitScope name index + return $ GenBlock name genItems' + scopeGenItemBranchMapper index genItem = do + enterScope "" index + genItem' <- fullGenItemMapper genItem + exitScope "" index + return genItem' + partScoper :: MapperM (Scoper a) Decl -> MapperM (Scoper a) ModuleItem diff --git a/test/basic/generate_if_scope.sv b/test/basic/generate_if_scope.sv new file mode 100644 index 0000000..3e9ea28 --- /dev/null +++ b/test/basic/generate_if_scope.sv @@ -0,0 +1,9 @@ +module top; + parameter WIDTH = 5; + logic [WIDTH-1:0] x, y; + if (WIDTH > 0) + initial + x = WIDTH'(0); + initial + y = WIDTH'(0); +endmodule diff --git a/test/basic/generate_if_scope.v b/test/basic/generate_if_scope.v new file mode 100644 index 0000000..2dffd9b --- /dev/null +++ b/test/basic/generate_if_scope.v @@ -0,0 +1,9 @@ +module top; + parameter WIDTH = 5; + reg [WIDTH-1:0] x, y; + if (WIDTH > 0) + initial + x = 0; + initial + y = 0; +endmodule