fix scoping of single-item generate conditionals

This commit is contained in:
Zachary Snow 2020-07-22 20:30:33 -06:00
parent 5ad8de9ef7
commit 8537a9efda
3 changed files with 35 additions and 8 deletions

View File

@ -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

View File

@ -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

View File

@ -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