From 58e5bfa6d3261de4d90728fec981fc9ef3f97614 Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Sat, 23 Jan 2021 17:39:29 -0700 Subject: [PATCH] fix typeof incorrectly propagating implicit types --- src/Convert/TypeOf.hs | 7 ++++--- test/basic/case_inside_cast.sv | 17 +++++++++++++++++ test/basic/case_inside_cast.v | 6 ++++++ 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 test/basic/case_inside_cast.sv create mode 100644 test/basic/case_inside_cast.v diff --git a/src/Convert/TypeOf.hs b/src/Convert/TypeOf.hs index 551cd5c..98ea1c7 100644 --- a/src/Convert/TypeOf.hs +++ b/src/Convert/TypeOf.hs @@ -41,9 +41,10 @@ traverseDeclM decl = do item <- traverseModuleItemM (MIPackageItem $ Decl decl) let MIPackageItem (Decl decl') = item case decl' of - Variable Local UnknownType ident [] Nil -> do - -- functions with no return type implicitly return a single bit - insertElem ident UnitType + Variable Local (Implicit sg rs) ident [] Nil -> do + -- implicit types, which are commonly found in function return + -- types, are recast as logics to avoid outputting bare ranges + insertElem ident $ IntegerVector TLogic sg rs return decl' Variable d t ident a e -> do let t' = injectRanges t a diff --git a/test/basic/case_inside_cast.sv b/test/basic/case_inside_cast.sv new file mode 100644 index 0000000..1507f93 --- /dev/null +++ b/test/basic/case_inside_cast.sv @@ -0,0 +1,17 @@ +module top; + typedef logic [1:0] T; + function automatic [1:0] flip; + input [1:0] inp; + flip = ~inp; + endfunction + initial begin + case (flip(2'b00)) inside + 2'b11: $display("good"); + default: $display("default"); + endcase + case (T'(flip(2'b00))) inside + 2'b11: $display("good"); + default: $display("default"); + endcase + end +endmodule diff --git a/test/basic/case_inside_cast.v b/test/basic/case_inside_cast.v new file mode 100644 index 0000000..0b1b1c4 --- /dev/null +++ b/test/basic/case_inside_cast.v @@ -0,0 +1,6 @@ +module top; + initial begin + $display("good"); + $display("good"); + end +endmodule