3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 09:05:31 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2024-01-12 14:00:33 -08:00
parent abc0cf3775
commit 22103c0322
2 changed files with 15 additions and 8 deletions

View file

@ -34,11 +34,9 @@ namespace polysat {
bool fixed_bits::check(rational const& val, fi_record& fi) {
unsigned sz = c.size(m_var);
rational bw = rational::power_of_two(sz);
// verbose_stream() << "check for fixed bits v" << m_var << "[" << sz << "] := " << val << "\n";
for (auto const& s : m_fixed_slices) {
rational sbw = rational::power_of_two(s.length);
// slice is properly contained in bit-vector variable
// verbose_stream() << " slice " << s.value << "[" << s.length << "]@" << s.offset << "\n";
if (s.length <= sz && s.value != mod(machine_div2k(val, s.offset), sbw)) {
SASSERT(s.offset + s.length <= sz);
rational hi_val = s.value;

View file

@ -638,20 +638,27 @@ namespace polysat {
if (ebw < bw || aw != bw) {
auto const& p2b = rational::power_of_two(bw);
auto const& p2eb = rational::power_of_two(bw - ebw);
// let coeff = 2^{bw - ebw}
// let assume coeff * x \not\in [lo, t[
// Then value is chosen, min x . coeff * x >= t.
// In other words:
//
// coeff * (value - 1) <= t < coeff*value + 1
//
auto vlo = c.value(mod((e.value - 1) * p2eb, p2b), bw);
auto vhi = c.value(mod(e.value * p2eb + 1, p2b), bw);
auto vlo = c.value(mod((e.value - 1) * p2eb - 1, p2b), bw);
// t in ] (value - 1) * 2^{bw - ebw} ; value * 2^{bw - ebw} ]
// t in [ (value - 1) * 2^{bw - ebw} - 1 ; value * 2^{bw - ebw} + 1 [
#if 0
verbose_stream() << e.value << " " << t << "\n";
if (t.is_val()) verbose_stream() << "tval " << t.val() << "\n";
verbose_stream() << "value " << e.value << "\n";
verbose_stream() << "t " << t << "\n";
verbose_stream() << "[" << vlo << " " << vhi << "[\n";
verbose_stream() << "bw " << ebw << " " << bw << " " << e.e->interval << " bw " << abw << " " << aw << " " << after.e->coeff << " " << after.e->interval << "\n";
verbose_stream() << "before bw " << ebw << " " << bw << " " << *e.e << "\nafter bw " << abw << " " << aw << " " << *after.e << "\n";
if (!t.is_val())
IF_VERBOSE(0, verbose_stream() << "symbolic t : " << t << "\n");
#endif
auto sc = cs.ult(t - vlo, vhi - vlo);
CTRACE("bv", sc.is_always_false(), c.display(tout));
VERIFY(!sc.is_always_false());
if (!sc.is_always_true())
deps.push_back(c.propagate(sc, c.explain_weak_eval(sc)));
@ -1011,6 +1018,8 @@ namespace polysat {
out << e->coeff << " * v" << v << " " << e->interval << " ";
else
out << e->interval << " ";
for (auto const& d : e->deps)
out << d << " ";
if (e->side_cond.size() <= 5)
out << e->side_cond << " ";
else