diff --git a/src/Convert/Package.hs b/src/Convert/Package.hs index 8173fd1..9d2c4f8 100644 --- a/src/Convert/Package.hs +++ b/src/Convert/Package.hs @@ -442,10 +442,36 @@ addUsedPIs :: ModuleItem -> (ModuleItem, Idents) addUsedPIs item = (item, usedPIs) where - usedPIs = execWriter $ - traverseNestedModuleItemsM (traverseIdentsM writeIdent) item - writeIdent :: Identifier -> Writer Idents Identifier - writeIdent x = tell (Set.singleton x) >> return x + usedPIs = execWriter $ evalScoperT + writeDeclIdents writeModuleItemIdents writeGenItemIdents writeStmtIdents + "" [item] + +type IdentWriter = ScoperT () (Writer Idents) + +writeDeclIdents :: Decl -> IdentWriter Decl +writeDeclIdents decl = do + case decl of + Variable _ _ x _ _ -> insertElem x () + Param _ _ x _ -> insertElem x () + ParamType _ x _ -> insertElem x () + CommentDecl{} -> return () + traverseDeclIdentsM writeIdent decl + +writeModuleItemIdents :: ModuleItem -> IdentWriter ModuleItem +writeModuleItemIdents = traverseIdentsM writeIdent + +writeGenItemIdents :: GenItem -> IdentWriter GenItem +writeGenItemIdents = + traverseGenItemExprsM $ traverseExprIdentsM writeIdent + +writeStmtIdents :: Stmt -> IdentWriter Stmt +writeStmtIdents = traverseStmtIdentsM writeIdent + +writeIdent :: Identifier -> IdentWriter Identifier +writeIdent x = do + details <- lookupElemM x + when (details == Nothing) $ tell (Set.singleton x) + return x -- visits all identifiers in a module item traverseIdentsM :: Monad m => MapperM m Identifier -> MapperM m ModuleItem diff --git a/src/Convert/SizeCast.hs b/src/Convert/SizeCast.hs index bb9fa8d..894f7a0 100644 --- a/src/Convert/SizeCast.hs +++ b/src/Convert/SizeCast.hs @@ -27,7 +27,7 @@ traverseDeclM :: Decl -> Scoper Type Decl traverseDeclM decl = do decl' <- case decl of Variable _ t x _ _ -> do - details <- lookupElemM x + details <- lookupLocalIdentM x if isPrefixOf "sv2v_cast_" x && details /= Nothing then return $ Variable Local t DuplicateTag [] Nil else insertElem x t >> return decl @@ -122,7 +122,7 @@ traverseExprM = return $ Number $ Decimal (fromIntegral size) True val' where val' = val `mod` (2 ^ size) convertCastWithSigningM s e sg = do - details <- lookupElemM $ castFnName s sg + details <- lookupLocalIdentM $ castFnName s sg when (details == Nothing) $ injectItem $ MIPackageItem $ castFn s sg let f = castFnName s sg let args = Args [e] [] diff --git a/test/basic/cast_conflict.sv b/test/basic/cast_conflict.sv new file mode 100644 index 0000000..c0a495a --- /dev/null +++ b/test/basic/cast_conflict.sv @@ -0,0 +1,11 @@ +module top; + parameter CONST = 1; + localparam WIDTH = CONST * 2; + localparam VALUE = WIDTH'(1'sb1); + initial $display("%b", VALUE); + if (1) begin : blk2 + localparam WIDTH = CONST * 3; + localparam VALUE = WIDTH'(1'sb1); + initial $display("%b", VALUE); + end +endmodule diff --git a/test/basic/cast_conflict.v b/test/basic/cast_conflict.v new file mode 100644 index 0000000..801a6b2 --- /dev/null +++ b/test/basic/cast_conflict.v @@ -0,0 +1,8 @@ +module top; + initial $display("%b", 2'b11); + generate + if (1) begin : blk2 + initial $display("%b", 3'b111); + end + endgenerate +endmodule diff --git a/test/basic/function_reorder_resolve.sv b/test/basic/function_reorder_resolve.sv new file mode 100644 index 0000000..e589461 --- /dev/null +++ b/test/basic/function_reorder_resolve.sv @@ -0,0 +1,15 @@ +module top; + parameter YES = 1; + if (YES) begin + function automatic [31:0] help; + input [31:0] inp; + help = inp + 1; + endfunction + initial $display("A %0d", help(0)); + end + function automatic [31:0] help; + input [31:0] inp; + help = inp + 2; + endfunction + initial $display("B %0d", help(0)); +endmodule diff --git a/test/lib/functions.sh b/test/lib/functions.sh index f2712b2..390449e 100644 --- a/test/lib/functions.sh +++ b/test/lib/functions.sh @@ -51,13 +51,8 @@ assertConverts() { ac_tmpb=$SHUNIT_TMPDIR/ac-conv-tmpb.v $SV2V $ac_tmpa 2> /dev/null > $ac_tmpb assertTrue "2nd conversion of $ac_file failed" $? - if [ -n "$(diff $ac_tmpa $ac_tmpb)" ]; then - ac_tmpc=$SHUNIT_TMPDIR/ac-conv-tmpc.v - $SV2V $ac_tmpb 2> /dev/null > $ac_tmpc - assertTrue "3rd conversion of $ac_file failed" $? - diff $ac_tmpb $ac_tmpc > /dev/null - assertTrue "conversion of $ac_file not stable after the second iteration" $? - fi + diff $ac_tmpa $ac_tmpb > /dev/null + assertTrue "conversion of $ac_file not stable after the first iteration" $? $SV2V -v $ac_file 2> /dev/null > /dev/null assertTrue "verbose conversion of $ac_file failed" $? # using sed to remove quoted strings