Skip to content

Commit 7c34d9d

Browse files
committed
Verilog: lowering for four-valued zero-extend
This adds a lowering for zero_extend expressions for four-valued operands.
1 parent 8fe2c5e commit 7c34d9d

File tree

4 files changed

+37
-3
lines changed

4 files changed

+37
-3
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.

src/verilog/aval_bval_encoding.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,25 @@ exprt aval_bval(const shift_exprt &expr)
537537
return if_exprt{distance_has_xz, x, combined};
538538
}
539539

540+
exprt aval_bval(const zero_extend_exprt &expr)
541+
{
542+
PRECONDITION(is_four_valued(expr));
543+
544+
auto expr_aval_bval_type = lower_to_aval_bval(expr.type());
545+
546+
// zero-extend aval and bval separately!
547+
auto op_aval = aval(expr.op());
548+
auto op_bval = bval(expr.op());
549+
550+
auto aval_ext_width = aval_bval_width(expr_aval_bval_type);
551+
auto ext_type = bv_typet{aval_ext_width};
552+
553+
auto aval_extended = zero_extend_exprt{op_aval, ext_type};
554+
auto bval_extended = zero_extend_exprt{op_bval, ext_type};
555+
556+
return combine_aval_bval(aval_extended, bval_extended, expr_aval_bval_type);
557+
}
558+
540559
exprt default_aval_bval_lowering(const exprt &expr)
541560
{
542561
auto &type = expr.type();

src/verilog/aval_bval_encoding.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ exprt aval_bval(const verilog_implies_exprt &);
6767
exprt aval_bval(const typecast_exprt &);
6868
/// lowering for shifts
6969
exprt aval_bval(const shift_exprt &);
70+
/// lowering for zero extension
71+
exprt aval_bval(const zero_extend_exprt &);
7072

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

src/verilog/verilog_lowering.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,20 @@ exprt verilog_lowering(exprt expr)
650650
else
651651
return expr;
652652
}
653+
else if(expr.id() == ID_zero_extend)
654+
{
655+
auto &zero_extend = to_zero_extend_expr(expr);
656+
657+
if(
658+
is_four_valued(zero_extend.type()) ||
659+
is_four_valued(zero_extend.op().type()))
660+
{
661+
// encode into aval/bval
662+
return aval_bval(zero_extend);
663+
}
664+
else
665+
return expr; // leave as is
666+
}
653667
else
654668
return expr; // leave as is
655669

0 commit comments

Comments
 (0)