mirror of
https://github.com/Z3Prover/z3
synced 2025-07-19 19:02:02 +00:00
bv semantics
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
7bcb4936c7
commit
ec6cab377a
1 changed files with 30 additions and 3 deletions
|
@ -541,6 +541,23 @@ namespace intblast {
|
||||||
return r;
|
return r;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
auto rotate_left = [&](unsigned n) {
|
||||||
|
auto sz = bv.get_bv_size(e);
|
||||||
|
expr* r = arg(0);
|
||||||
|
if (n != 0 && sz != 1) {
|
||||||
|
// r[sz - n - 1 : 0] ++ r[sz - 1 : sz - n]
|
||||||
|
// r * 2^(sz - n) + (r / 2^(sz - n)) mod n???
|
||||||
|
NOT_IMPLEMENTED_YET();
|
||||||
|
auto N = bv_size(e);
|
||||||
|
auto A = rational::power_of_two(sz - n);
|
||||||
|
auto B = rational::power_of_two(n);
|
||||||
|
auto hi = a.mk_mul(r, a.mk_int(B));
|
||||||
|
auto lo = a.mk_idiv(a.mk_mod(r, a.mk_int(B)), a.mk_int(A));
|
||||||
|
r = a.mk_add(hi, lo);
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
};
|
||||||
|
|
||||||
expr* bv_expr = e;
|
expr* bv_expr = e;
|
||||||
expr* r = nullptr;
|
expr* r = nullptr;
|
||||||
auto const& args = m_args;
|
auto const& args = m_args;
|
||||||
|
@ -590,7 +607,7 @@ namespace intblast {
|
||||||
break;
|
break;
|
||||||
case OP_CONCAT: {
|
case OP_CONCAT: {
|
||||||
unsigned sz = 0;
|
unsigned sz = 0;
|
||||||
for (unsigned i = 0; i < args.size(); ++i) {
|
for (unsigned i = args.size(); i-- > 0; ++i) {
|
||||||
expr* old_arg = e->get_arg(i);
|
expr* old_arg = e->get_arg(i);
|
||||||
expr* new_arg = umod(old_arg, i);
|
expr* new_arg = umod(old_arg, i);
|
||||||
if (sz > 0) {
|
if (sz > 0) {
|
||||||
|
@ -786,8 +803,18 @@ namespace intblast {
|
||||||
r = m.mk_ite(m.mk_eq(y, a.mk_int(0)), x, r);
|
r = m.mk_ite(m.mk_eq(y, a.mk_int(0)), x, r);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_ROTATE_LEFT:
|
case OP_ROTATE_LEFT: {
|
||||||
case OP_ROTATE_RIGHT:
|
auto n = e->get_parameter(0).get_int();
|
||||||
|
r = rotate_left(n);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OP_ROTATE_RIGHT: {
|
||||||
|
auto n = e->get_parameter(0).get_int();
|
||||||
|
unsigned sz = bv.get_bv_size(e);
|
||||||
|
n = n % sz;
|
||||||
|
r = rotate_left(sz - n);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case OP_EXT_ROTATE_LEFT:
|
case OP_EXT_ROTATE_LEFT:
|
||||||
case OP_EXT_ROTATE_RIGHT:
|
case OP_EXT_ROTATE_RIGHT:
|
||||||
case OP_REPEAT:
|
case OP_REPEAT:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue