From a38137b69adadc381b0dd46820ddb60e1649dc40 Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Wed, 15 Jul 2020 19:04:11 -0600 Subject: [PATCH] fix conversion of casts in gen item exprs --- src/Convert/Scoper.hs | 12 +++++++++++- src/Convert/SizeCast.hs | 2 +- test/basic/local_cast.sv | 6 ++++++ test/basic/local_cast.v | 6 ++++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Convert/Scoper.hs b/src/Convert/Scoper.hs index 6711d77..3769c84 100644 --- a/src/Convert/Scoper.hs +++ b/src/Convert/Scoper.hs @@ -349,7 +349,17 @@ evalScoperT declMapper moduleItemMapper genItemMapper stmtMapper topName items = -- TODO: This doesn't yet support implicit naming of generate blocks as -- blocks as described in Section 27.6. fullGenItemMapper :: GenItem -> ScoperT a m GenItem - fullGenItemMapper = genItemMapper >=> scopeGenItemMapper + fullGenItemMapper genItem = do + genItem' <- genItemMapper genItem + injected <- gets sInjected + if null injected + then scopeGenItemMapper genItem' + else do + modify' $ \s -> s { sInjected = [] } + injected' <- mapM fullModuleItemMapper injected + genItem'' <- scopeGenItemMapper genItem' + 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 diff --git a/src/Convert/SizeCast.hs b/src/Convert/SizeCast.hs index 568d763..4e09ea1 100644 --- a/src/Convert/SizeCast.hs +++ b/src/Convert/SizeCast.hs @@ -37,7 +37,7 @@ traverseModuleItemM item = traverseExprsM traverseExprM item traverseGenItemM :: GenItem -> Scoper Type GenItem -traverseGenItemM = return +traverseGenItemM = traverseGenItemExprsM traverseExprM traverseStmtM :: Stmt -> Scoper Type Stmt traverseStmtM = traverseStmtExprsM traverseExprM diff --git a/test/basic/local_cast.sv b/test/basic/local_cast.sv index 9c9d624..320658a 100644 --- a/test/basic/local_cast.sv +++ b/test/basic/local_cast.sv @@ -15,5 +15,11 @@ module top; end end end + // TODO: This is not yet supported by iverilog + // localparam P = 2; + // for (genvar i = 0; i < int'(P); i = i + 1) begin : g + // wire a = i; + // end + // initial $display("%b %b", g[0].a, g[1].a); endgenerate endmodule diff --git a/test/basic/local_cast.v b/test/basic/local_cast.v index 4fdcf12..9c7bb5c 100644 --- a/test/basic/local_cast.v +++ b/test/basic/local_cast.v @@ -20,5 +20,11 @@ module top; cast_i = inp; endfunction end + // TODO: This is not yet supported by iverilog + // localparam P = 2; + // for (i = 0; i < P; i = i + 1) begin : g + // wire a = i; + // end + // initial $display("%b %b", g[0].a, g[1].a); endgenerate endmodule