mirror of
https://github.com/Z3Prover/z3
synced 2025-06-27 08:28:44 +00:00
na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
f805130c0b
commit
f71219a9d0
1 changed files with 12 additions and 16 deletions
|
@ -545,26 +545,23 @@ namespace polysat {
|
||||||
auto lo = after.e->interval.lo();
|
auto lo = after.e->interval.lo();
|
||||||
auto hi = after.e->interval.hi();
|
auto hi = after.e->interval.hi();
|
||||||
|
|
||||||
SASSERT(after.e->bit_width <= bw_after);
|
SASSERT(abw <= bw_after);
|
||||||
SASSERT(ebw <= bw);
|
SASSERT(ebw <= bw);
|
||||||
|
|
||||||
auto const& p2b = rational::power_of_two(bw);
|
if (ebw < bw || bw_after != bw) {
|
||||||
auto const& p2eb = rational::power_of_two(bw - ebw);
|
auto const& p2b = rational::power_of_two(bw);
|
||||||
|
auto const& p2eb = rational::power_of_two(bw - ebw);
|
||||||
auto t_equal_value = [&]() {
|
|
||||||
auto vhi = c.value(mod(e.value * p2eb + 1, 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);
|
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} ; value * 2^{bw - ebw} ]
|
||||||
// t in [ (value - 1) * 2^{bw - ebw} - 1 ; value * 2^{bw - ebw} + 1 [
|
// t in [ (value - 1) * 2^{bw - ebw} - 1 ; value * 2^{bw - ebw} + 1 [
|
||||||
auto eq = cs.ult(t - vlo, vhi - vlo);
|
|
||||||
SASSERT(!eq.is_always_false());
|
|
||||||
if (!eq.is_always_true())
|
|
||||||
deps.push_back(c.propagate(eq, c.explain_eval(eq)));
|
|
||||||
};
|
|
||||||
|
|
||||||
|
if (!t.is_val())
|
||||||
if (ebw < bw || bw_after != bw) {
|
IF_VERBOSE(0, verbose_stream() << "symbolic t : " << t << "\n");
|
||||||
t_equal_value();
|
auto sc = cs.ult(t - vlo, vhi - vlo);
|
||||||
|
SASSERT(!sc.is_always_false());
|
||||||
|
if (!sc.is_always_true())
|
||||||
|
deps.push_back(c.propagate(sc, c.explain_eval(sc)));
|
||||||
t.reset(lo.manager());
|
t.reset(lo.manager());
|
||||||
t = c.value(mod(e.value, rational::power_of_two(bw_after)), bw_after);
|
t = c.value(mod(e.value, rational::power_of_two(bw_after)), bw_after);
|
||||||
}
|
}
|
||||||
|
@ -573,10 +570,9 @@ namespace polysat {
|
||||||
t *= rational::power_of_two(bw_after - abw);
|
t *= rational::power_of_two(bw_after - abw);
|
||||||
|
|
||||||
auto sc = cs.ult(t - lo, hi - lo);
|
auto sc = cs.ult(t - lo, hi - lo);
|
||||||
if (sc.is_always_true())
|
|
||||||
return;
|
|
||||||
SASSERT(!sc.is_always_false());
|
SASSERT(!sc.is_always_false());
|
||||||
deps.push_back(c.propagate(sc, c.explain_eval(sc)));
|
if (!sc.is_always_true())
|
||||||
|
deps.push_back(c.propagate(sc, c.explain_eval(sc)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue