From cffec1f95f0ac4bad1deb24bf7f921bd93145a16 Mon Sep 17 00:00:00 2001 From: Jannis Harder Date: Tue, 24 May 2022 14:32:14 +0200 Subject: [PATCH] verilog: fix signedness when removing unreachable cases --- CHANGELOG | 5 ++++ frontends/ast/simplify.cc | 1 + tests/verilog/unreachable_case_sign.ys | 33 ++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 tests/verilog/unreachable_case_sign.ys diff --git a/CHANGELOG b/CHANGELOG index 4004c534b..ff7ce49a2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,11 @@ List of major changes and improvements between releases Yosys 0.17 .. Yosys 0.17-dev -------------------------- + * Verilog + - Fixed an issue where simplifying case statements by removing unreachable + cases could result in the wrong signedness being used for comparison with + the remaining cases + Yosys 0.16 .. Yosys 0.17 -------------------------- * New commands and options diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index bd3e09c4b..4d7c4f522 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -1531,6 +1531,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, detectSignWidth(width_hint, sign_hint); while (children[0]->simplify(const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) { } if (children[0]->type == AST_CONSTANT && children[0]->bits_only_01()) { + children[0]->is_signed = sign_hint; RTLIL::Const case_expr = children[0]->bitsAsConst(width_hint, sign_hint); std::vector new_children; new_children.push_back(children[0]); diff --git a/tests/verilog/unreachable_case_sign.ys b/tests/verilog/unreachable_case_sign.ys new file mode 100644 index 000000000..25bc0c6f0 --- /dev/null +++ b/tests/verilog/unreachable_case_sign.ys @@ -0,0 +1,33 @@ +logger -expect-no-warnings + +read_verilog -formal <