Skip to content

Commit 9915378

Browse files
fixes based on unit tests
1 parent 046db66 commit 9915378

10 files changed

+363
-111
lines changed

src/ast/bv_decl_plugin.h

+7-7
Original file line numberDiff line numberDiff line change
@@ -557,15 +557,15 @@ class bv_util : public bv_recognizers {
557557
app* mk_bv_rotate_right(expr* arg, unsigned n);
558558

559559
// TODO: all these binary ops commute (right?) but it'd be more logical to swap `n` & `m` in the `return`
560-
app * mk_bvsmul_no_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BSMUL_NO_OVFL, n, m); }
561-
app * mk_bvsmul_no_udfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BSMUL_NO_UDFL, n, m); }
562-
app * mk_bvumul_no_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BUMUL_NO_OVFL, n, m); }
563-
app * mk_bvsmul_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BSMUL_OVFL, n, m); }
564-
app * mk_bvumul_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BUMUL_OVFL, n, m); }
560+
app * mk_bvsmul_no_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BSMUL_NO_OVFL, m, n); }
561+
app * mk_bvsmul_no_udfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BSMUL_NO_UDFL, m, n); }
562+
app * mk_bvumul_no_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BUMUL_NO_OVFL, m, n); }
563+
app * mk_bvsmul_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BSMUL_OVFL, m, n); }
564+
app * mk_bvumul_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BUMUL_OVFL, m, n); }
565565
app * mk_bvsdiv_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BSDIV_OVFL, m, n); }
566566
app * mk_bvneg_ovfl(expr* m) { return m_manager.mk_app(get_fid(), OP_BNEG_OVFL, m); }
567-
app * mk_bvuadd_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BUADD_OVFL, n, m); }
568-
app * mk_bvsadd_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BSADD_OVFL, n, m); }
567+
app * mk_bvuadd_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BUADD_OVFL, m, n); }
568+
app * mk_bvsadd_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BSADD_OVFL, m, n); }
569569
app * mk_bvusub_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BUSUB_OVFL, m, n); }
570570
app * mk_bvssub_ovfl(expr* m, expr* n) { return m_manager.mk_app(get_fid(), OP_BSSUB_OVFL, m, n); }
571571

src/ast/sls/bv_sls.cpp

+48-5
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,31 @@ namespace bv {
4646
m_eval.init_fixed(m_terms.assertions());
4747
}
4848

49+
void sls::reinit_eval() {
50+
std::function<bool(expr*, unsigned)> eval = [&](expr* e, unsigned i) {
51+
if (m.is_bool(e)) {
52+
if (m_eval.is_fixed0(e))
53+
return m_eval.bval0(e);
54+
}
55+
else if (bv.is_bv(e)) {
56+
auto& w = m_eval.wval0(e);
57+
if (w.get(w.fixed, i))
58+
return w.get(w.bits, i);
59+
60+
}
61+
return m_rand() % 2 == 0;
62+
};
63+
m_eval.init_eval(m_terms.assertions(), eval);
64+
m_repair_down.reset();
65+
m_repair_up.reset();
66+
for (auto* e : m_terms.assertions()) {
67+
if (!m_eval.bval0(e)) {
68+
m_eval.set(e, true);
69+
m_repair_down.insert(e->get_id());
70+
}
71+
}
72+
}
73+
4974
std::pair<bool, app*> sls::next_to_repair() {
5075
app* e = nullptr;
5176
if (!m_repair_down.empty()) {
@@ -59,30 +84,48 @@ namespace bv {
5984
return { !m_repair_down.empty(), e };
6085
}
6186

62-
lbool sls::operator()() {
87+
lbool sls::search() {
6388
// init and init_eval were invoked.
6489
unsigned& n = m_stats.m_moves;
6590
n = 0;
6691
for (; n < m_config.m_max_repairs && m.inc(); ++n) {
6792
auto [down, e] = next_to_repair();
6893
if (!e)
6994
return l_true;
70-
IF_VERBOSE(20, verbose_stream() << (down?"d ":"u ") << mk_bounded_pp(e, m, 1) << "\n");
95+
IF_VERBOSE(20, verbose_stream() << (down ? "d " : "u ") << mk_bounded_pp(e, m, 1) << "\n");
7196
if (eval_is_correct(e)) {
7297
if (down)
7398
m_repair_down.remove(e->get_id());
7499
else
75100
m_repair_up.remove(e->get_id());
76101
}
77102
else if (down) {
78-
try_repair_down(e);
103+
try_repair_down(e);
79104
}
80-
else
81-
try_repair_up(e);
105+
else
106+
try_repair_up(e);
82107
}
83108
return l_undef;
84109
}
85110

111+
lbool sls::operator()() {
112+
lbool res = l_undef;
113+
do {
114+
if (!m.inc())
115+
return l_undef;
116+
117+
res = search();
118+
119+
if (res != l_undef)
120+
return res;
121+
122+
reinit_eval();
123+
}
124+
while (m_stats.m_restarts++ < m_config.m_max_restarts);
125+
126+
return res;
127+
}
128+
86129
void sls::try_repair_down(app* e) {
87130
unsigned n = e->get_num_args();
88131
if (n > 0) {

src/ast/sls/bv_sls.h

+3
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ namespace bv {
5757

5858
bool try_repair_down(app* e, unsigned i);
5959

60+
lbool search();
61+
void reinit_eval();
62+
6063
public:
6164
sls(ast_manager& m);
6265

0 commit comments

Comments
 (0)