@@ -36,8 +36,7 @@ bv_typet aval_bval_type(std::size_t width, irep_idt source_type)
3636
3737bv_typet lower_to_aval_bval (const typet &src)
3838{
39- PRECONDITION (
40- src.id () == ID_verilog_unsignedbv || src.id () == ID_verilog_signedbv);
39+ PRECONDITION (is_four_valued (src));
4140 return aval_bval_type (to_bitvector_type (src).get_width (), src.id ());
4241}
4342
@@ -75,9 +74,7 @@ typet aval_bval_underlying(const typet &src)
7574
7675constant_exprt lower_to_aval_bval (const constant_exprt &src)
7776{
78- PRECONDITION (
79- src.type ().id () == ID_verilog_signedbv ||
80- src.type ().id () == ID_verilog_unsignedbv);
77+ PRECONDITION (is_four_valued (src.type ()));
8178
8279 auto new_type = lower_to_aval_bval (src.type ());
8380 auto width = aval_bval_width (new_type);
@@ -256,7 +253,7 @@ exprt has_xz(const exprt &expr)
256253 return false_exprt{}; // it's two-valued
257254}
258255
259- // / return 'x', one bit, in aval_bval encoding
256+ // / return 'x'
260257exprt make_x (const typet &type)
261258{
262259 PRECONDITION (is_four_valued (type));
@@ -539,3 +536,33 @@ exprt aval_bval(const shift_exprt &expr)
539536 auto x = make_x (expr.type ());
540537 return if_exprt{distance_has_xz, x, combined};
541538}
539+
540+ exprt default_aval_bval_lowering (const exprt &expr)
541+ {
542+ auto &type = expr.type ();
543+
544+ PRECONDITION (is_four_valued (type));
545+
546+ exprt::operandst disjuncts;
547+ for (auto &op : expr.operands ())
548+ disjuncts.push_back (has_xz (op));
549+
550+ auto has_xz = disjunction (disjuncts);
551+
552+ exprt two_valued_expr = expr; // copy
553+
554+ for (auto &op : two_valued_expr.operands ())
555+ op = aval_underlying (op); // replace by aval
556+
557+ if (type.id () == ID_verilog_unsignedbv)
558+ two_valued_expr.type () = unsignedbv_typet{to_bitvector_type (type).width ()};
559+ else if (type.id () == ID_verilog_signedbv)
560+ two_valued_expr.type () = signedbv_typet{to_bitvector_type (type).width ()};
561+ else
562+ PRECONDITION (false );
563+
564+ return if_exprt{
565+ has_xz,
566+ make_x (type),
567+ aval_bval_conversion (two_valued_expr, lower_to_aval_bval (type))};
568+ }
0 commit comments