3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-04-07 01:54:10 +00:00

peepopt.muldiv: Add a signedness check.

Fixes #2318.
This commit is contained in:
Marcelina Kościelnicka 2020-08-04 16:30:24 +02:00
parent c39ebe6ae0
commit e89cc9c02f
2 changed files with 16 additions and 1 deletions

View file

@ -1,16 +1,18 @@
pattern muldiv pattern muldiv
state <SigSpec> t x y state <SigSpec> t x y
state <bool> is_signed
match mul match mul
select mul->type == $mul select mul->type == $mul
select GetSize(port(mul, \A)) + GetSize(port(mul, \B)) <= GetSize(port(mul, \Y)) select GetSize(port(mul, \A)) + GetSize(port(mul, \B)) <= GetSize(port(mul, \Y))
endmatch endmatch
code t x y code t x y is_signed
t = port(mul, \Y); t = port(mul, \Y);
x = port(mul, \A); x = port(mul, \A);
y = port(mul, \B); y = port(mul, \B);
is_signed = param(mul, \A_SIGNED).as_bool();
branch; branch;
std::swap(x, y); std::swap(x, y);
endcode endcode
@ -19,6 +21,7 @@ match div
select div->type.in($div) select div->type.in($div)
index <SigSpec> port(div, \A) === t index <SigSpec> port(div, \A) === t
index <SigSpec> port(div, \B) === x index <SigSpec> port(div, \B) === x
filter param(div, \A_SIGNED).as_bool() == is_signed
endmatch endmatch
code code

12
tests/opt/bug2318.ys Normal file
View file

@ -0,0 +1,12 @@
read_verilog <<EOT
module t(input [3:0] A, input [3:0] B, output signed [3:0] Y);
wire [7:0] P = A * B;
wire signed [7:0] SP = P;
wire signed [3:0] SB = B;
assign Y = SP / SB;
endmodule
EOT
equiv_opt -assert peepopt