Skip to content

Commit dfd5c27

Browse files
na
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent 803f0f0 commit dfd5c27

File tree

6 files changed

+48
-26
lines changed

6 files changed

+48
-26
lines changed

src/ast/sls/bv_sls.cpp

+26-15
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,19 @@ namespace bv {
5252
m_repair_roots.insert(e->get_id());
5353
}
5454
}
55+
for (auto* t : m_terms.terms()) {
56+
if (t && !re_eval_is_correct(t))
57+
m_repair_roots.insert(t->get_id());
58+
}
59+
}
60+
61+
void sls::init_repair_goal(app* t) {
62+
if (m.is_bool(t))
63+
m_eval.set(t, m_eval.bval1(t));
64+
else if (bv.is_bv(t)) {
65+
auto& v = m_eval.wval(t);
66+
v.bits().copy_to(v.nw, v.eval);
67+
}
5568
}
5669

5770
void sls::reinit_eval() {
@@ -89,11 +102,18 @@ namespace bv {
89102
return { false, e };
90103
}
91104

92-
if (!m_repair_roots.empty()) {
105+
while (!m_repair_roots.empty()) {
93106
unsigned index = m_repair_roots.elem_at(m_rand(m_repair_roots.size()));
94107
e = m_terms.term(index);
95-
m_repair_root = index;
96-
return { true, e };
108+
if (m_terms.is_assertion(e) && !m_eval.bval1(e)) {
109+
SASSERT(m_eval.bval0(e));
110+
return { true, e };
111+
}
112+
if (!re_eval_is_correct(e)) {
113+
init_repair_goal(e);
114+
return { true, e };
115+
}
116+
m_repair_roots.remove(index);
97117
}
98118

99119
return { false, nullptr };
@@ -103,11 +123,12 @@ namespace bv {
103123
// init and init_eval were invoked
104124
unsigned n = 0;
105125
for (; n++ < m_config.m_max_repairs && m.inc(); ) {
106-
++m_stats.m_moves;
107126
auto [down, e] = next_to_repair();
108127
if (!e)
109128
return l_true;
110129

130+
++m_stats.m_moves;
131+
111132
trace_repair(down, e);
112133

113134
if (down)
@@ -137,22 +158,12 @@ namespace bv {
137158

138159
void sls::try_repair_down(app* e) {
139160

140-
if (eval_is_correct(e)) {
141-
// if (bv.is_bv(e))
142-
// verbose_stream() << mk_pp(e, m) << " := " << m_eval.wval(e) << "\n";
143-
m_repair_roots.remove(m_repair_root);
144-
m_repair_root = UINT_MAX;
145-
return;
146-
}
147-
148161
unsigned n = e->get_num_args();
149162
if (n == 0) {
150163
auto& v = m_eval.wval(e);
151-
v.commit_eval();
164+
VERIFY(v.commit_eval());
152165
for (auto p : m_terms.parents(e))
153166
m_repair_up.insert(p->get_id());
154-
m_repair_roots.remove(m_repair_root);
155-
m_repair_root = UINT_MAX;
156167
return;
157168
}
158169

src/ast/sls/bv_sls.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ namespace bv {
4646
sls_stats m_stats;
4747
indexed_uint_set m_repair_up, m_repair_roots;
4848
unsigned m_repair_down = UINT_MAX;
49-
unsigned m_repair_root = UINT_MAX;
5049
ptr_vector<expr> m_todo;
5150
random_gen m_rand;
5251
config m_config;
@@ -55,6 +54,7 @@ namespace bv {
5554

5655
bool eval_is_correct(app* e);
5756
bool re_eval_is_correct(app* e);
57+
void init_repair_goal(app* e);
5858
void try_repair_down(app* e);
5959
void try_repair_up(app* e);
6060
void set_repair_down(expr* e) { m_repair_down = e->get_id(); }

src/ast/sls/bv_sls_eval.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -1100,7 +1100,7 @@ namespace bv {
11001100
if (parity_e > 0 && parity_b > 0)
11011101
b.shift_right(m_tmp2, std::min(parity_b, parity_e));
11021102
a.set_mul(m_tmp, tb, m_tmp2);
1103-
return a.set_repair(random_bool(), m_tmp);
1103+
return a.set_repair(random_bool(), m_tmp);
11041104
}
11051105

11061106
bool sls_eval::try_repair_bnot(bvect const& e, bvval& a) {
@@ -1633,6 +1633,11 @@ namespace bv {
16331633
}
16341634
if (bv.is_bv(e)) {
16351635
auto& v = eval(to_app(e));
1636+
for (unsigned i = 0; i < v.nw; ++i)
1637+
if (0 != (v.fixed[i] & (v.bits()[i] ^ v.eval[i]))) {
1638+
v.bits().copy_to(v.nw, v.eval);
1639+
return false;
1640+
}
16361641
v.commit_eval();
16371642
return true;
16381643
}

src/ast/sls/bv_sls_fixed.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace bv {
2525
{}
2626

2727
void sls_fixed::init(expr_ref_vector const& es) {
28-
// init_ranges(es);
28+
init_ranges(es);
2929
ev.sort_assertions(es);
3030
for (expr* e : ev.m_todo) {
3131
if (!is_app(e))

src/ast/sls/sls_valuation.cpp

+13-7
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,14 @@ namespace bv {
9595
mask = ~(digit_t)0;
9696
}
9797

98-
void sls_valuation::commit_eval() {
99-
DEBUG_CODE(
100-
for (unsigned i = 0; i < nw; ++i)
101-
VERIFY(0 == (fixed[i] & (m_bits[i] ^ eval[i])));
102-
);
98+
bool sls_valuation::commit_eval() {
99+
for (unsigned i = 0; i < nw; ++i)
100+
if (0 != (fixed[i] & (m_bits[i] ^ eval[i])))
101+
return false;
103102
for (unsigned i = 0; i < nw; ++i)
104103
m_bits[i] = eval[i];
105104
SASSERT(well_formed());
105+
return true;
106106
}
107107

108108
bool sls_valuation::in_range(bvect const& bits) const {
@@ -446,6 +446,9 @@ namespace bv {
446446
if (h == l)
447447
return;
448448

449+
//verbose_stream() << "[" << l << ", " << h << "[\n";
450+
//verbose_stream() << *this << "\n";
451+
449452
SASSERT(is_zero(fixed)); // ranges can only be added before fixed bits are set.
450453

451454
if (m_lo == m_hi) {
@@ -473,10 +476,13 @@ namespace bv {
473476
set_value(m_hi, h);
474477
}
475478
}
479+
480+
481+
476482
SASSERT(!has_overflow(m_lo));
477483
SASSERT(!has_overflow(m_hi));
478-
if (!in_range(eval))
479-
set(eval, m_lo);
484+
if (!in_range(m_bits))
485+
set(m_bits, m_lo);
480486
SASSERT(well_formed());
481487
}
482488

src/ast/sls/sls_valuation.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ namespace bv {
115115

116116
digit_t bits(unsigned i) const { return m_bits[i]; }
117117
bvect const& bits() const { return m_bits; }
118-
void commit_eval();
118+
bool commit_eval();
119119

120120
bool get_bit(unsigned i) const { return m_bits.get(i); }
121121
bool try_set_bit(unsigned i, bool b) {

0 commit comments

Comments
 (0)