@@ -180,6 +180,7 @@ combine_aval_bval(const exprt &aval, const exprt &bval, const typet &dest)
180180{
181181 PRECONDITION (aval.type ().id () == ID_bv);
182182 PRECONDITION (bval.type ().id () == ID_bv);
183+ PRECONDITION (dest.id () == ID_bv);
183184 return concatenation_exprt{{bval, aval}, dest};
184185}
185186
@@ -336,6 +337,24 @@ exprt aval_bval(const not_exprt &expr)
336337 return if_exprt{has_xz, x, aval_bval_conversion (not_expr, x.type ())};
337338}
338339
340+ exprt aval_bval (const bitnot_exprt &expr)
341+ {
342+ auto &type = expr.type ();
343+ PRECONDITION (is_four_valued (type));
344+ PRECONDITION (is_aval_bval (expr.op ()));
345+
346+ // x/z is done bit-wise.
347+ // ~z is x.
348+ auto op_aval = aval (expr.op ());
349+ auto op_bval = bval (expr.op ());
350+
351+ exprt aval = bitor_exprt{
352+ bitand_exprt{bitnot_exprt{op_bval}, op_bval}, // x/z case
353+ bitand_exprt{bitnot_exprt{op_aval}, bitnot_exprt{op_bval}}}; // 0/1 case
354+
355+ return combine_aval_bval (aval, op_bval, lower_to_aval_bval (expr.type ()));
356+ }
357+
339358exprt aval_bval (const power_exprt &expr)
340359{
341360 PRECONDITION (is_four_valued (expr.type ()));
0 commit comments