mirror of
https://github.com/Z3Prover/z3
synced 2025-08-27 21:48:56 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
8df45b442b
commit
80f00f191a
26 changed files with 213 additions and 152 deletions
|
@ -46,7 +46,7 @@ void bit2int::operator()(expr * n, expr_ref & result, proof_ref& p) {
|
|||
|
||||
unsigned bit2int::get_b2i_size(expr* n) {
|
||||
expr* arg = nullptr;
|
||||
VERIFY(m_bv_util.is_bv2int(n, arg));
|
||||
VERIFY(m_bv_util.is_ubv2int(n, arg));
|
||||
return m_bv_util.get_bv_size(arg);
|
||||
}
|
||||
|
||||
|
@ -83,7 +83,7 @@ bool bit2int::extract_bv(expr* n, unsigned& sz, bool& sign, expr_ref& bv) {
|
|||
numeral k;
|
||||
bool is_int;
|
||||
expr* r = nullptr;
|
||||
if (m_bv_util.is_bv2int(n, r)) {
|
||||
if (m_bv_util.is_ubv2int(n, r)) {
|
||||
bv = r;
|
||||
sz = m_bv_util.get_bv_size(bv);
|
||||
sign = false;
|
||||
|
@ -123,7 +123,7 @@ bool bit2int::mk_add(expr* e1, expr* e2, expr_ref& result) {
|
|||
tmp2 = m_rewriter.mk_zero_extend(1, tmp2);
|
||||
SASSERT(m_bv_util.get_bv_size(tmp1) == m_bv_util.get_bv_size(tmp2));
|
||||
tmp3 = m_rewriter.mk_bv_add(tmp1, tmp2);
|
||||
result = m_rewriter.mk_bv2int(tmp3);
|
||||
result = m_rewriter.mk_ubv2int(tmp3);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -168,7 +168,7 @@ bool bit2int::mk_mul(expr* e1, expr* e2, expr_ref& result) {
|
|||
|
||||
SASSERT(m_bv_util.get_bv_size(tmp1) == m_bv_util.get_bv_size(tmp2));
|
||||
tmp3 = m_rewriter.mk_bv_mul(tmp1, tmp2);
|
||||
result = m_rewriter.mk_bv2int(tmp3);
|
||||
result = m_rewriter.mk_ubv2int(tmp3);
|
||||
if (sign1 != sign2) {
|
||||
result = m_arith_util.mk_uminus(result);
|
||||
}
|
||||
|
@ -183,13 +183,13 @@ bool bit2int::is_bv_poly(expr* n, expr_ref& pos, expr_ref& neg) {
|
|||
numeral k;
|
||||
bool is_int;
|
||||
todo.push_back(n);
|
||||
neg = pos = m_rewriter.mk_bv2int(m_bit0);
|
||||
neg = pos = m_rewriter.mk_ubv2int(m_bit0);
|
||||
|
||||
while (!todo.empty()) {
|
||||
n = todo.back();
|
||||
todo.pop_back();
|
||||
expr* arg1 = nullptr, *arg2 = nullptr;
|
||||
if (m_bv_util.is_bv2int(n)) {
|
||||
if (m_bv_util.is_ubv2int(n)) {
|
||||
VERIFY(mk_add(n, pos, pos));
|
||||
}
|
||||
else if (m_arith_util.is_numeral(n, k, is_int) && is_int) {
|
||||
|
@ -208,16 +208,16 @@ bool bit2int::is_bv_poly(expr* n, expr_ref& pos, expr_ref& neg) {
|
|||
}
|
||||
else if (m_arith_util.is_mul(n, arg1, arg2) &&
|
||||
m_arith_util.is_numeral(arg1, k, is_int) && is_int && k.is_minus_one() &&
|
||||
m_bv_util.is_bv2int(arg2)) {
|
||||
m_bv_util.is_ubv2int(arg2)) {
|
||||
VERIFY(mk_add(arg2, neg, neg));
|
||||
}
|
||||
else if (m_arith_util.is_mul(n, arg1, arg2) &&
|
||||
m_arith_util.is_numeral(arg2, k, is_int) && is_int && k.is_minus_one() &&
|
||||
m_bv_util.is_bv2int(arg1)) {
|
||||
m_bv_util.is_ubv2int(arg1)) {
|
||||
VERIFY(mk_add(arg1, neg, neg));
|
||||
}
|
||||
else if (m_arith_util.is_uminus(n, arg1) &&
|
||||
m_bv_util.is_bv2int(arg1)) {
|
||||
m_bv_util.is_ubv2int(arg1)) {
|
||||
VERIFY(mk_add(arg1, neg, neg));
|
||||
}
|
||||
else {
|
||||
|
@ -251,7 +251,7 @@ void bit2int::visit(app* n) {
|
|||
m_arith_util.is_lt(n) || m.is_eq(n);
|
||||
expr_ref result(m);
|
||||
for (unsigned i = 0; !has_b2i && i < num_args; ++i) {
|
||||
has_b2i = m_bv_util.is_bv2int(args[i]);
|
||||
has_b2i = m_bv_util.is_ubv2int(args[i]);
|
||||
}
|
||||
if (!has_b2i) {
|
||||
result = m.mk_app(f, num_args, args);
|
||||
|
@ -367,7 +367,7 @@ void bit2int::visit(app* n) {
|
|||
tmp2 = e2bv;
|
||||
align_sizes(tmp1, tmp2);
|
||||
tmp3 = m_rewriter.mk_bv_urem(tmp1, tmp2);
|
||||
result = m_rewriter.mk_bv2int(tmp3);
|
||||
result = m_rewriter.mk_ubv2int(tmp3);
|
||||
cache_result(n, result);
|
||||
return;
|
||||
}
|
||||
|
@ -393,7 +393,7 @@ void bit2int::visit(app* n) {
|
|||
tmp2 = e2bv;
|
||||
align_sizes(tmp1, tmp2);
|
||||
tmp3 = m_rewriter.mk_bv_urem(tmp1, tmp2);
|
||||
result = m_rewriter.mk_bv2int(tmp3);
|
||||
result = m_rewriter.mk_ubv2int(tmp3);
|
||||
|
||||
cache_result(n, result);
|
||||
}
|
||||
|
|
|
@ -548,7 +548,8 @@ MK_PARAMETRIC_UNARY_REDUCE(reduce_sign_extend, mk_sign_extend);
|
|||
case OP_BIT2BOOL:
|
||||
case OP_MKBV:
|
||||
case OP_INT2BV:
|
||||
case OP_BV2INT:
|
||||
case OP_UBV2INT:
|
||||
case OP_SBV2INT:
|
||||
return BR_FAILED;
|
||||
default:
|
||||
TRACE("bit_blaster", tout << "non-supported operator: " << f->get_name() << "\n";
|
||||
|
|
|
@ -164,7 +164,7 @@ void bv2int_translator::translate_app(app* e) {
|
|||
expr* r = m.mk_app(f, m_args);
|
||||
if (has_bv_sort) {
|
||||
ctx.push(push_back_vector(m_vars));
|
||||
r = bv.mk_bv2int(r);
|
||||
r = bv.mk_ubv2int(r);
|
||||
}
|
||||
set_translated(e, r);
|
||||
return;
|
||||
|
@ -424,7 +424,7 @@ void bv2int_translator::translate_bv(app* e) {
|
|||
ctx.push(push_back_vector(m_int2bv));
|
||||
r = arg(0);
|
||||
break;
|
||||
case OP_BV2INT:
|
||||
case OP_UBV2INT:
|
||||
m_bv2int.push_back(e);
|
||||
ctx.push(push_back_vector(m_bv2int));
|
||||
r = umod(e->get_arg(0), 0);
|
||||
|
|
|
@ -197,9 +197,12 @@ br_status bv_rewriter::mk_app_core(func_decl * f, unsigned num_args, expr * cons
|
|||
case OP_EXT_ROTATE_RIGHT:
|
||||
SASSERT(num_args == 2);
|
||||
return mk_bv_ext_rotate_right(args[0], args[1], result);
|
||||
case OP_BV2INT:
|
||||
case OP_UBV2INT:
|
||||
SASSERT(num_args == 1);
|
||||
return mk_bv2int(args[0], result);
|
||||
return mk_ubv2int(args[0], result);
|
||||
case OP_SBV2INT:
|
||||
SASSERT(num_args == 1);
|
||||
return mk_sbv2int(args[0], result);
|
||||
case OP_INT2BV:
|
||||
SASSERT(num_args == 1);
|
||||
return mk_int2bv(m_util.get_bv_size(f->get_range()), args[0], result);
|
||||
|
@ -1480,20 +1483,20 @@ br_status bv_rewriter::mk_int2bv(unsigned bv_size, expr * arg, expr_ref & result
|
|||
return BR_DONE;
|
||||
}
|
||||
|
||||
// int2bv (bv2int x) --> x
|
||||
if (m_util.is_bv2int(arg, x) && bv_size == get_bv_size(x)) {
|
||||
// int2bv (ubv2int x) --> x
|
||||
if (m_util.is_ubv2int(arg, x) && bv_size == get_bv_size(x)) {
|
||||
result = x;
|
||||
return BR_DONE;
|
||||
}
|
||||
|
||||
// int2bv (bv2int x) --> 0000x
|
||||
if (m_util.is_bv2int(arg, x) && bv_size > get_bv_size(x)) {
|
||||
// int2bv (ubv2int x) --> 0000x
|
||||
if (m_util.is_ubv2int(arg, x) && bv_size > get_bv_size(x)) {
|
||||
mk_zero_extend(bv_size - get_bv_size(x), x, result);
|
||||
return BR_REWRITE1;
|
||||
}
|
||||
|
||||
// int2bv (bv2int x) --> x[sz-1:0]
|
||||
if (m_util.is_bv2int(arg, x) && bv_size < get_bv_size(x)) {
|
||||
// int2bv (ubv2int x) --> x[sz-1:0]
|
||||
if (m_util.is_ubv2int(arg, x) && bv_size < get_bv_size(x)) {
|
||||
result = m_mk_extract(bv_size - 1, 0, x);
|
||||
return BR_REWRITE1;
|
||||
}
|
||||
|
@ -1520,7 +1523,13 @@ br_status bv_rewriter::mk_int2bv(unsigned bv_size, expr * arg, expr_ref & result
|
|||
return BR_FAILED;
|
||||
}
|
||||
|
||||
br_status bv_rewriter::mk_bv2int(expr * arg, expr_ref & result) {
|
||||
br_status bv_rewriter::mk_sbv2int(expr* arg, expr_ref& result) {
|
||||
result = m_util.mk_sbv2int_as_ubv2int(arg);
|
||||
|
||||
return BR_REWRITE2;
|
||||
}
|
||||
|
||||
br_status bv_rewriter::mk_ubv2int(expr * arg, expr_ref & result) {
|
||||
numeral v;
|
||||
unsigned sz;
|
||||
if (is_numeral(arg, v, sz)) {
|
||||
|
@ -1536,7 +1545,7 @@ br_status bv_rewriter::mk_bv2int(expr * arg, expr_ref & result) {
|
|||
|
||||
unsigned num_args = to_app(arg)->get_num_args();
|
||||
for (expr* x : *to_app(arg)) {
|
||||
args.push_back(m_util.mk_bv2int(x));
|
||||
args.push_back(m_util.mk_ubv2int(x));
|
||||
}
|
||||
unsigned sz = get_bv_size(to_app(arg)->get_arg(num_args-1));
|
||||
for (unsigned i = num_args - 1; i > 0; ) {
|
||||
|
@ -1552,13 +1561,13 @@ br_status bv_rewriter::mk_bv2int(expr * arg, expr_ref & result) {
|
|||
}
|
||||
if (is_mul_no_overflow(arg)) {
|
||||
expr_ref_vector args(m);
|
||||
for (expr* x : *to_app(arg)) args.push_back(m_util.mk_bv2int(x));
|
||||
for (expr* x : *to_app(arg)) args.push_back(m_util.mk_ubv2int(x));
|
||||
result = m_autil.mk_mul(args.size(), args.data());
|
||||
return BR_REWRITE2;
|
||||
}
|
||||
if (is_add_no_overflow(arg)) {
|
||||
expr_ref_vector args(m);
|
||||
for (expr* x : *to_app(arg)) args.push_back(m_util.mk_bv2int(x));
|
||||
for (expr* x : *to_app(arg)) args.push_back(m_util.mk_ubv2int(x));
|
||||
result = m_autil.mk_add(args.size(), args.data());
|
||||
return BR_REWRITE2;
|
||||
}
|
||||
|
@ -2805,7 +2814,7 @@ br_status bv_rewriter::mk_eq_bv2int(expr* lhs, expr* rhs, expr_ref& result) {
|
|||
if (m_autil.is_numeral(lhs))
|
||||
std::swap(lhs, rhs);
|
||||
|
||||
if (m_autil.is_numeral(rhs, r) && m_util.is_bv2int(lhs, x)) {
|
||||
if (m_autil.is_numeral(rhs, r) && m_util.is_ubv2int(lhs, x)) {
|
||||
unsigned bv_size = m_util.get_bv_size(x);
|
||||
if (0 <= r && r < rational::power_of_two(bv_size))
|
||||
result = m.mk_eq(m_util.mk_numeral(r, bv_size), x);
|
||||
|
@ -2813,8 +2822,8 @@ br_status bv_rewriter::mk_eq_bv2int(expr* lhs, expr* rhs, expr_ref& result) {
|
|||
result = m.mk_false();
|
||||
return BR_REWRITE1;
|
||||
}
|
||||
if (m_util.is_bv2int(lhs, x) &&
|
||||
m_util.is_bv2int(rhs, y)) {
|
||||
if (m_util.is_ubv2int(lhs, x) &&
|
||||
m_util.is_ubv2int(rhs, y)) {
|
||||
auto szx = m_util.get_bv_size(x);
|
||||
auto szy = m_util.get_bv_size(y);
|
||||
if (szx < szy)
|
||||
|
|
|
@ -128,7 +128,8 @@ class bv_rewriter : public poly_rewriter<bv_rewriter_core> {
|
|||
br_status mk_bv_urem_i(expr * arg1, expr * arg2, expr_ref & result) { return mk_bv_urem_core(arg1, arg2, true, result); }
|
||||
br_status mk_bv_smod_i(expr * arg1, expr * arg2, expr_ref & result) { return mk_bv_smod_core(arg1, arg2, true, result); }
|
||||
br_status mk_int2bv(unsigned bv_size, expr * arg, expr_ref & result);
|
||||
br_status mk_bv2int(expr * arg, expr_ref & result);
|
||||
br_status mk_ubv2int(expr * arg, expr_ref & result);
|
||||
br_status mk_sbv2int(expr* arg, expr_ref& result);
|
||||
br_status mk_bv_redor(expr * arg, expr_ref & result);
|
||||
br_status mk_bv_redand(expr * arg, expr_ref & result);
|
||||
br_status mk_bv_comp(expr * arg1, expr * arg2, expr_ref & result);
|
||||
|
@ -244,10 +245,10 @@ public:
|
|||
MK_BV_BINARY(mk_bv_sub);
|
||||
|
||||
|
||||
expr_ref mk_bv2int(expr* a) {
|
||||
expr_ref mk_ubv2int(expr* a) {
|
||||
expr_ref result(m);
|
||||
if (BR_FAILED == mk_bv2int(a, result))
|
||||
result = m_util.mk_bv2int(a);
|
||||
if (BR_FAILED == mk_ubv2int(a, result))
|
||||
result = m_util.mk_ubv2int(a);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -2639,7 +2639,7 @@ br_status seq_rewriter::mk_str_stoi(expr* a, expr_ref& result) {
|
|||
}
|
||||
if (str().is_ubv2s(a, b)) {
|
||||
bv_util bv(m());
|
||||
result = bv.mk_bv2int(b);
|
||||
result = bv.mk_ubv2int(b);
|
||||
return BR_DONE;
|
||||
}
|
||||
|
||||
|
|
|
@ -693,7 +693,7 @@ struct th_rewriter_cfg : public default_rewriter_cfg {
|
|||
}
|
||||
|
||||
br_status extended_bv_eq(expr* a, expr* b, expr_ref& result) {
|
||||
if (m_bv_util.is_bv2int(a) || m_bv_util.is_bv2int(b))
|
||||
if (m_bv_util.is_ubv2int(a) || m_bv_util.is_ubv2int(b))
|
||||
return m_bv_rw.mk_eq_bv2int(a, b, result);
|
||||
return BR_FAILED;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue