mirror of
https://github.com/Z3Prover/z3
synced 2025-07-28 15:07:56 +00:00
add eval field to sls-valuation to track temporary values.
This commit is contained in:
parent
8f139e862c
commit
d774f07eb3
9 changed files with 339 additions and 336 deletions
|
@ -56,15 +56,34 @@ namespace bv {
|
|||
return mpn_manager().compare(a.data(), a.nw, b.data(), a.nw) >= 0;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& out, bvect const& v) {
|
||||
out << std::hex;
|
||||
bool nz = false;
|
||||
for (unsigned i = v.nw; i-- > 0;) {
|
||||
auto w = v[i];
|
||||
if (i + 1 == v.nw)
|
||||
w &= v.mask;
|
||||
if (nz)
|
||||
out << std::setw(8) << std::setfill('0') << w;
|
||||
else if (w != 0)
|
||||
out << w, nz = true;
|
||||
}
|
||||
if (!nz)
|
||||
out << "0";
|
||||
out << std::dec;
|
||||
return out;
|
||||
}
|
||||
|
||||
sls_valuation::sls_valuation(unsigned bw) {
|
||||
set_bw(bw);
|
||||
m_lo.set_bw(bw);
|
||||
m_hi.set_bw(bw);
|
||||
m_bits.set_bw(bw);
|
||||
fixed.set_bw(bw);
|
||||
eval.set_bw(bw);
|
||||
// have lo, hi bits, fixed point to memory allocated within this of size num_bytes each allocated
|
||||
for (unsigned i = 0; i < nw; ++i)
|
||||
m_lo[i] = 0, m_hi[i] = 0, m_bits[i] = 0, fixed[i] = 0;
|
||||
m_lo[i] = 0, m_hi[i] = 0, m_bits[i] = 0, fixed[i] = 0, eval[i] = 0;
|
||||
fixed[nw - 1] = ~mask;
|
||||
}
|
||||
|
||||
|
@ -76,6 +95,16 @@ namespace bv {
|
|||
mask = ~(digit_t)0;
|
||||
}
|
||||
|
||||
void sls_valuation::commit_eval() {
|
||||
DEBUG_CODE(
|
||||
for (unsigned i = 0; i < nw; ++i)
|
||||
VERIFY(0 == (fixed[i] & (m_bits[i] ^ eval[i])));
|
||||
);
|
||||
for (unsigned i = 0; i < nw; ++i)
|
||||
m_bits[i] = eval[i];
|
||||
SASSERT(well_formed());
|
||||
}
|
||||
|
||||
bool sls_valuation::in_range(bvect const& bits) const {
|
||||
mpn_manager m;
|
||||
auto c = m.compare(m_lo.data(), nw, m_hi.data(), nw);
|
||||
|
@ -303,9 +332,7 @@ namespace bv {
|
|||
if (!ok)
|
||||
VERIFY(try_down ? round_up(dst) : round_down(dst));
|
||||
DEBUG_CODE(SASSERT(0 == (mask & (fixed[nw-1] & (m_bits[nw-1] ^ dst[nw-1])))); for (unsigned i = 0; i + 1 < nw; ++i) SASSERT(0 == (fixed[i] & (m_bits[i] ^ dst[i]))););
|
||||
if (m_bits == dst)
|
||||
return false;
|
||||
set(m_bits, dst);
|
||||
set(eval, dst);
|
||||
SASSERT(well_formed());
|
||||
return true;
|
||||
}
|
||||
|
@ -452,8 +479,8 @@ namespace bv {
|
|||
}
|
||||
SASSERT(!has_overflow(m_lo));
|
||||
SASSERT(!has_overflow(m_hi));
|
||||
if (!in_range(m_bits))
|
||||
set(m_bits, m_lo);
|
||||
if (!in_range(eval))
|
||||
set(eval, m_lo);
|
||||
SASSERT(well_formed());
|
||||
}
|
||||
|
||||
|
@ -518,7 +545,7 @@ namespace bv {
|
|||
auto set_fixed_bit = [&](unsigned i, bool b) {
|
||||
if (!fixed.get(i)) {
|
||||
fixed.set(i, true);
|
||||
m_bits.set(i, b);
|
||||
eval.set(i, b);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -575,22 +602,5 @@ namespace bv {
|
|||
return c == 1;
|
||||
}
|
||||
|
||||
std::ostream& sls_valuation::print_bits(std::ostream& out, bvect const& v) const {
|
||||
bool nz = false;
|
||||
for (unsigned i = nw; i-- > 0;) {
|
||||
auto w = v[i];
|
||||
if (i + 1 == nw)
|
||||
w &= mask;
|
||||
if (nz)
|
||||
out << std::setw(8) << std::setfill('0') << w;
|
||||
else if (w != 0)
|
||||
out << w, nz = true;
|
||||
}
|
||||
|
||||
if (!nz)
|
||||
out << "0";
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue