mirror of
https://github.com/Z3Prover/z3
synced 2025-08-15 15:25:26 +00:00
move to hide bits
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
cfa6bd4534
commit
acc9c21653
6 changed files with 253 additions and 220 deletions
|
@ -25,7 +25,7 @@ namespace bv {
|
|||
{}
|
||||
|
||||
void sls_fixed::init(expr_ref_vector const& es) {
|
||||
init_ranges(es);
|
||||
// init_ranges(es);
|
||||
ev.sort_assertions(es);
|
||||
for (expr* e : ev.m_todo) {
|
||||
if (!is_app(e))
|
||||
|
@ -110,7 +110,7 @@ namespace bv {
|
|||
}
|
||||
else if (bv.is_bit2bool(e, s, idx)) {
|
||||
auto& val = wval0(s);
|
||||
val.set(val.bits, idx, !sign);
|
||||
val.set_bit(idx, !sign);
|
||||
val.set(val.fixed, idx, true);
|
||||
val.init_fixed();
|
||||
}
|
||||
|
@ -184,7 +184,7 @@ namespace bv {
|
|||
auto& val_th = wval0(e->get_arg(1));
|
||||
auto& val_el = wval0(e->get_arg(2));
|
||||
for (unsigned i = 0; i < val.nw; ++i)
|
||||
val.fixed[i] = val_el.fixed[i] & val_th.fixed[i] & ~(val_el.bits[i] ^ val_th.bits[i]);
|
||||
val.fixed[i] = val_el.fixed[i] & val_th.fixed[i] & ~(val_el.bits(i) ^ val_th.bits(i));
|
||||
val.init_fixed();
|
||||
}
|
||||
}
|
||||
|
@ -232,7 +232,7 @@ namespace bv {
|
|||
auto& b = wval0(e->get_arg(1));
|
||||
// (a.fixed & b.fixed) | (a.fixed & ~a.bits) | (b.fixed & ~b.bits)
|
||||
for (unsigned i = 0; i < a.nw; ++i)
|
||||
v.fixed[i] = (a.fixed[i] & b.fixed[i]) | (a.fixed[i] & ~a.bits[i]) | (b.fixed[i] & ~b.bits[i]);
|
||||
v.fixed[i] = (a.fixed[i] & b.fixed[i]) | (a.fixed[i] & ~a.bits(i)) | (b.fixed[i] & ~b.bits(i));
|
||||
break;
|
||||
}
|
||||
case OP_BOR: {
|
||||
|
@ -240,7 +240,7 @@ namespace bv {
|
|||
auto& b = wval0(e->get_arg(1));
|
||||
// (a.fixed & b.fixed) | (a.fixed & a.bits) | (b.fixed & b.bits)
|
||||
for (unsigned i = 0; i < a.nw; ++i)
|
||||
v.fixed[i] = (a.fixed[i] & b.fixed[i]) | (a.fixed[i] & a.bits[i]) | (b.fixed[i] & b.bits[i]);
|
||||
v.fixed[i] = (a.fixed[i] & b.fixed[i]) | (a.fixed[i] & a.bits(i)) | (b.fixed[i] & b.bits(i));
|
||||
break;
|
||||
}
|
||||
case OP_BXOR: {
|
||||
|
@ -264,7 +264,7 @@ namespace bv {
|
|||
if (pfixed && a.get(a.fixed, i) && b.get(b.fixed, i))
|
||||
v.set(v.fixed, i, true);
|
||||
else if (!pfixed && a.get(a.fixed, i) && b.get(b.fixed, i) &&
|
||||
!a.get(a.bits, i) && !b.get(b.bits, i)) {
|
||||
!a.get_bit(i) && !b.get_bit(i)) {
|
||||
pfixed = true;
|
||||
v.set(v.fixed, i, false);
|
||||
}
|
||||
|
@ -273,6 +273,17 @@ namespace bv {
|
|||
v.set(v.fixed, i, false);
|
||||
}
|
||||
}
|
||||
rational r, rlo, rhi;
|
||||
if (bv.is_numeral(e->get_arg(0), r) && !b.eq(b.lo, b.hi)) {
|
||||
b.get_value(b.lo, rlo);
|
||||
b.get_value(b.hi, rhi);
|
||||
v.add_range(r + rlo, r + rhi);
|
||||
}
|
||||
if (bv.is_numeral(e->get_arg(1), r) && !a.eq(a.lo, a.hi)) {
|
||||
a.get_value(a.lo, rlo);
|
||||
a.get_value(a.hi, rhi);
|
||||
v.add_range(r + rlo, r + rhi);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OP_BMUL: {
|
||||
|
@ -288,29 +299,29 @@ namespace bv {
|
|||
if (!b.get(b.fixed, k))
|
||||
break;
|
||||
for (; zj < v.bw; ++zj)
|
||||
if (!a.get(a.fixed, zj) || a.get(a.bits, zj))
|
||||
if (!a.get(a.fixed, zj) || a.get_bit(zj))
|
||||
break;
|
||||
for (; zk < v.bw; ++zk)
|
||||
if (!b.get(b.fixed, zk) || b.get(b.bits, zk))
|
||||
if (!b.get(b.fixed, zk) || b.get_bit(zk))
|
||||
break;
|
||||
for (; hzj < v.bw; ++hzj)
|
||||
if (!a.get(a.fixed, v.bw - hzj - 1) || a.get(a.bits, v.bw - hzj - 1))
|
||||
if (!a.get(a.fixed, v.bw - hzj - 1) || a.get_bit(v.bw - hzj - 1))
|
||||
break;
|
||||
for (; hzk < v.bw; ++hzk)
|
||||
if (!b.get(b.fixed, v.bw - hzk - 1) || b.get(b.bits, v.bw - hzk - 1))
|
||||
if (!b.get(b.fixed, v.bw - hzk - 1) || b.get_bit(v.bw - hzk - 1))
|
||||
break;
|
||||
|
||||
|
||||
if (j > 0 && k > 0) {
|
||||
for (unsigned i = 0; i < std::min(k, j); ++i) {
|
||||
SASSERT(!v.get(v.bits, i));
|
||||
SASSERT(!v.get_bit(i));
|
||||
v.set(v.fixed, i, true);
|
||||
}
|
||||
}
|
||||
// lower zj + jk bits are 0
|
||||
if (zk > 0 || zj > 0) {
|
||||
for (unsigned i = 0; i < zk + zj; ++i) {
|
||||
SASSERT(!v.get(v.bits, i));
|
||||
SASSERT(!v.get_bit(i));
|
||||
v.set(v.fixed, i, true);
|
||||
}
|
||||
}
|
||||
|
@ -320,7 +331,7 @@ namespace bv {
|
|||
hzj = v.bw - hzj;
|
||||
hzk = v.bw - hzk;
|
||||
for (unsigned i = hzj + hzk - 1; i < v.bw; ++i) {
|
||||
SASSERT(!v.get(v.bits, i));
|
||||
SASSERT(!v.get_bit(i));
|
||||
v.set(v.fixed, i, true);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue