Skip to content

Commit d4ea9b8

Browse files
committed
Verilog: aval/bval encoding for zero extension
This adds an aval/bval encoding for zero extension.
1 parent f4f5c9e commit d4ea9b8

File tree

7 files changed

+44
-7
lines changed

7 files changed

+44
-7
lines changed
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
KNOWNBUG
2-
equality4.v
1+
CORE
2+
equality4.sv
33

44
^EXIT=0$
55
^SIGNAL=0$
66
--
77
^warning: ignoring
88
--
9-
zero_extend doesn't work for four-valued operands.

regression/verilog/expressions/equality4.sv

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,4 @@ module main;
44
initial assert((2'b10 + 1'sbx) === 8'bxxxxxxxx);
55
initial assert((2'b10 | 1'sbx) === 8'b0000001x);
66

7-
// The two operands are sign-extended to 8 bits.
8-
initial assert((2'sb10 + 1'sbx) === 8'sbxxxxxxxx);
9-
initial assert((2'sb10 | 1'sbx) === 8'sb1111111x);
10-
117
endmodule
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
KNOWNBUG
2+
equality5.sv
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
--
7+
^warning: ignoring
8+
--
9+
This gives the wrong answer.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module main;
2+
3+
// The two operands are sign-extended to 8 bits.
4+
initial assert((2'sb10 + 1'sbx) === 8'sbxxxxxxxx);
5+
initial assert((2'sb10 | 1'sbx) === 8'sb1111111x);
6+
7+
endmodule

src/verilog/aval_bval_encoding.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,23 @@ exprt aval_bval(const binary_relation_exprt &expr)
627627
aval_bval_conversion(two_valued_expr, lower_to_aval_bval(type))};
628628
}
629629

630+
exprt aval_bval(const zero_extend_exprt &expr)
631+
{
632+
PRECONDITION(is_four_valued(expr.type()));
633+
634+
// extend aval and bval separately
635+
auto op_aval = aval(expr.op());
636+
auto op_bval = bval(expr.op());
637+
638+
auto result_type = lower_to_aval_bval(expr.type());
639+
auto extended_type = bv_typet{aval_bval_width(result_type)};
640+
641+
auto aval_extended = zero_extend_exprt{op_aval, extended_type};
642+
auto bval_extended = zero_extend_exprt{op_bval, extended_type};
643+
644+
return combine_aval_bval(aval_extended, bval_extended, result_type);
645+
}
646+
630647
exprt default_aval_bval_lowering(const exprt &expr)
631648
{
632649
auto &type = expr.type();

src/verilog/aval_bval_encoding.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ exprt aval_bval(const typecast_exprt &);
7171
exprt aval_bval(const shift_exprt &);
7272
/// lowering for <=, <, etc.
7373
exprt aval_bval(const binary_relation_exprt &);
74+
/// lowering for zero extension
75+
exprt aval_bval(const zero_extend_exprt &);
7476

7577
/// If any operand has x/z, then the result is 'x'.
7678
/// Otherwise, the result is the expression applied to the aval

src/verilog/verilog_lowering.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,13 @@ exprt verilog_lowering(exprt expr)
682682
else
683683
return expr;
684684
}
685+
else if(expr.id() == ID_zero_extend)
686+
{
687+
if(is_four_valued(expr.type()))
688+
return aval_bval(to_zero_extend_expr(expr));
689+
else
690+
return expr;
691+
}
685692
else
686693
return expr; // leave as is
687694

0 commit comments

Comments
 (0)