Skip to content

Commit 4f09a7e

Browse files
authoredJan 16, 2025··
Merge pull request #929 from diffblue/aval-bval-bitwise
aval/bval encoding for bitwise operators
2 parents bc7a3df + b40d0a8 commit 4f09a7e

File tree

5 files changed

+70
-0
lines changed

5 files changed

+70
-0
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
bitwise1.sv
3+
--bound 0
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
--
7+
^warning: ignoring
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module main;
2+
3+
assert final ((4'b0001 & 4'b1001) === 4'b0001);
4+
assert final ((4'b1001 & 4'bx001) === 4'bx001);
5+
assert final ((4'b1001 & 4'bz001) === 4'bx001);
6+
assert final ((4'b0001 | 4'b1001) === 4'b1001);
7+
assert final ((4'b0001 | 4'bx001) === 4'bx001);
8+
assert final ((4'b0001 | 4'bz001) === 4'bx001);
9+
assert final ((4'b0001 ^ 4'b1001) === 4'b1000);
10+
assert final ((4'b0001 ^ 4'bx001) === 4'bx000);
11+
assert final ((4'b0001 ^ 4'bz001) === 4'bx000);
12+
assert final ((4'b0001 ~^ 4'b1001) === 4'b0111);
13+
assert final ((4'b0001 ~^ 4'bx001) === 4'bx111);
14+
assert final ((4'b0001 ~^ 4'bz001) === 4'bx111);
15+
16+
endmodule

‎src/verilog/aval_bval_encoding.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,39 @@ exprt aval_bval(const bitnot_exprt &expr)
355355
return combine_aval_bval(aval, op_bval, lower_to_aval_bval(expr.type()));
356356
}
357357

358+
exprt aval_bval_bitwise(const multi_ary_exprt &expr)
359+
{
360+
auto &type = expr.type();
361+
PRECONDITION(is_four_valued(type));
362+
PRECONDITION(!expr.operands().empty());
363+
364+
for(auto &op : expr.operands())
365+
PRECONDITION(is_aval_bval(op));
366+
367+
// x/z is done bit-wise.
368+
// Any bit involving x/z is x.
369+
370+
// bval
371+
exprt::operandst bval_disjuncts;
372+
373+
for(auto &op : expr.operands())
374+
bval_disjuncts.push_back(bval(op));
375+
376+
auto bval = bitor_exprt{bval_disjuncts, bval_disjuncts.front().type()};
377+
378+
// aval
379+
exprt::operandst aval_conjuncts;
380+
381+
for(auto &op : expr.operands())
382+
aval_conjuncts.push_back(aval(op));
383+
384+
exprt aval = bitand_exprt{
385+
multi_ary_exprt{expr.id(), aval_conjuncts, aval_conjuncts.front().type()},
386+
bitnot_exprt{bval}}; // 0/1 case
387+
388+
return combine_aval_bval(aval, bval, lower_to_aval_bval(expr.type()));
389+
}
390+
358391
exprt aval_bval(const power_exprt &expr)
359392
{
360393
PRECONDITION(is_four_valued(expr.type()));

‎src/verilog/aval_bval_encoding.h

+2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ exprt aval_bval(const verilog_logical_inequality_exprt &);
4949
exprt aval_bval(const not_exprt &);
5050
/// lowering for ~
5151
exprt aval_bval(const bitnot_exprt &);
52+
/// lowering for &, |, ^, ^~
53+
exprt aval_bval_bitwise(const multi_ary_exprt &);
5254
/// lowering for ==?
5355
exprt aval_bval(const verilog_wildcard_equality_exprt &);
5456
/// lowering for !=?

‎src/verilog/verilog_lowering.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,18 @@ exprt verilog_lowering(exprt expr)
513513
else
514514
return expr; // leave as is
515515
}
516+
else if(
517+
expr.id() == ID_bitand || expr.id() == ID_bitor || expr.id() == ID_bitxor ||
518+
expr.id() == ID_bitxnor)
519+
{
520+
auto &multi_ary_expr = to_multi_ary_expr(expr);
521+
522+
// encode into aval/bval
523+
if(is_four_valued(expr.type()))
524+
return aval_bval_bitwise(multi_ary_expr);
525+
else
526+
return expr; // leave as is
527+
}
516528
else if(expr.id() == ID_verilog_iff)
517529
{
518530
auto &iff = to_verilog_iff_expr(expr);

0 commit comments

Comments
 (0)