mirror of
https://github.com/Z3Prover/z3
synced 2025-04-22 16:45:31 +00:00
Refactor sls bv evaluation and fix logic checks for bit operations
This commit is contained in:
parent
fe7dcb0394
commit
1d3891f8d6
3 changed files with 22 additions and 17 deletions
|
@ -926,15 +926,15 @@ namespace sls {
|
|||
m_tmp.set_bw(a.bw);
|
||||
if (try_above) {
|
||||
a.set_add(m_tmp, b.bits(), m_one);
|
||||
if (!a.is_zero(m_tmp) && a.set_random_at_least(m_tmp, m_rand))
|
||||
if (a.set_random_at_least(m_tmp, m_rand) && m_tmp != b.bits())
|
||||
return true;
|
||||
}
|
||||
a.set_sub(m_tmp, b.bits(), m_one);
|
||||
if (!a.is_zero(m_tmp) && a.set_random_at_most(m_tmp, m_rand))
|
||||
if (a.set_random_at_most(m_tmp, m_rand) && m_tmp != b.bits())
|
||||
return true;
|
||||
if (!try_above) {
|
||||
a.set_add(m_tmp, b.bits(), m_one);
|
||||
if (!a.is_zero(m_tmp) && a.set_random_at_least(m_tmp, m_rand))
|
||||
if (a.set_random_at_least(m_tmp, m_rand) && m_tmp != b.bits())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -1001,9 +1001,11 @@ namespace sls {
|
|||
};
|
||||
fold_oper(m_tmp2, t, i, f);
|
||||
bvval& a = wval(t, i);
|
||||
m_tmp.set_bw(a.bw);
|
||||
for (unsigned j = 0; j < a.nw; ++j)
|
||||
m_tmp[j] = e[j] & (~m_tmp2[j] | random_bits());
|
||||
|
||||
//verbose_stream() << wval(t) << " " << m_tmp << "\n";
|
||||
return a.set_repair(random_bool(), m_tmp);
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,8 @@ namespace sls {
|
|||
for (auto e : ctx.subterms())
|
||||
set_fixed(e);
|
||||
|
||||
//ctx.display(verbose_stream());
|
||||
|
||||
for (auto lit : ctx.unit_literals()) {
|
||||
auto a = ctx.atom(lit.var());
|
||||
if (!a)
|
||||
|
@ -40,9 +42,12 @@ namespace sls {
|
|||
init_range(to_app(a), lit.sign());
|
||||
ev.m_fixed.setx(a->get_id(), true, false);
|
||||
}
|
||||
//ctx.display(verbose_stream());
|
||||
|
||||
for (auto e : ctx.subterms())
|
||||
propagate_range_up(e);
|
||||
propagate_range_up(e);
|
||||
|
||||
//ctx.display(verbose_stream());
|
||||
}
|
||||
|
||||
void bv_fixed::propagate_range_up(expr* e) {
|
||||
|
@ -150,17 +155,17 @@ namespace sls {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool bv_fixed::init_eq(expr* t, rational const& a, bool sign) {
|
||||
bool bv_fixed::init_eq(expr* t, rational const& a, bool sign) {
|
||||
unsigned lo, hi;
|
||||
rational b(0);
|
||||
// verbose_stream() << mk_bounded_pp(t, m) << " == " << a << "\n";
|
||||
expr* s = nullptr;
|
||||
if (sign)
|
||||
if (sign && true)
|
||||
// 1 <= t - a
|
||||
init_range(nullptr, rational(1), t, -a, false);
|
||||
else
|
||||
if (!sign)
|
||||
// t - a <= 0
|
||||
init_range(t, -a, nullptr, rational::zero(), false);
|
||||
|
||||
if (!sign && bv.is_bv_not(t, s)) {
|
||||
for (unsigned i = 0; i < bv.get_bv_size(s); ++i)
|
||||
if (!a.get_bit(i))
|
||||
|
@ -178,11 +183,13 @@ namespace sls {
|
|||
}
|
||||
if (bv.is_extract(t, lo, hi, s)) {
|
||||
if (hi == lo) {
|
||||
sign = sign ? a == 1 : a == 0;
|
||||
auto sign1 = sign ? a == 1 : a == 0;
|
||||
auto& val = ev.wval(s);
|
||||
if (val.try_set_bit(lo, !sign))
|
||||
val.fixed.set(lo, true);
|
||||
if (val.try_set_bit(lo, !sign1))
|
||||
val.fixed.set(lo, true);
|
||||
|
||||
val.tighten_range();
|
||||
|
||||
}
|
||||
else if (!sign) {
|
||||
auto& val = ev.wval(s);
|
||||
|
@ -190,8 +197,7 @@ namespace sls {
|
|||
if (val.try_set_bit(i, a.get_bit(i - lo)))
|
||||
val.fixed.set(i, true);
|
||||
val.tighten_range();
|
||||
// verbose_stream() << lo << " " << hi << " " << val << " := " << a << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
if (!sign && hi + 1 == bv.get_bv_size(s)) {
|
||||
// s < 2^lo * (a + 1)
|
||||
|
|
|
@ -673,10 +673,7 @@ namespace sls {
|
|||
|
||||
// verbose_stream() << "tighten " << m_lo << " " << m_hi << " " << m_bits << "\n";
|
||||
if (m_lo == m_hi)
|
||||
return;
|
||||
|
||||
if (is_zero(m_hi))
|
||||
return;
|
||||
return;
|
||||
|
||||
inf_feasible(m_lo);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue