Skip to content

Commit f46c378

Browse files
bugfixes
1 parent d774f07 commit f46c378

File tree

4 files changed

+41
-9
lines changed

4 files changed

+41
-9
lines changed

src/ast/sls/bv_sls_eval.cpp

+27-6
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ namespace bv {
615615
val.set(a.bits());
616616
else {
617617
set_sdiv();
618-
val.set_mul(m_tmp, val.bits(), b.bits());
618+
val.set_mul(m_tmp, val.eval, b.bits());
619619
val.set_sub(val.eval, a.bits(), m_tmp);
620620
}
621621
break;
@@ -685,7 +685,7 @@ namespace bv {
685685
return sls_valuation::random_bits(m_rand);
686686
}
687687

688-
bool sls_eval::try_repair(app* e, unsigned i) {
688+
bool sls_eval::try_repair(app* e, unsigned i) {
689689
if (is_fixed0(e->get_arg(i)))
690690
return false;
691691
else if (e->get_family_id() == basic_family_id)
@@ -844,6 +844,7 @@ namespace bv {
844844
case OP_BSMUL_NO_OVFL:
845845
case OP_BSMUL_NO_UDFL:
846846
case OP_BSMUL_OVFL:
847+
verbose_stream() << mk_pp(e, m) << "\n";
847848
return false;
848849
case OP_BSREM:
849850
case OP_BSREM_I:
@@ -1042,8 +1043,10 @@ namespace bv {
10421043
b.get(y);
10431044
if (parity_b > 0) {
10441045
b.shift_right(y, parity_b);
1046+
#if 0
10451047
for (unsigned i = parity_b; i < b.bw; ++i)
10461048
y.set(i, m_rand() % 2 == 0);
1049+
#endif
10471050
}
10481051

10491052
y[a.nw] = 0;
@@ -1127,10 +1130,12 @@ namespace bv {
11271130
else {
11281131
auto& b1 = m_nexta;
11291132
a.set_add(b1, b.bits(), m_one);
1133+
b1.set_bw(b.bw);
11301134
if (p2 == b1)
11311135
r = false;
11321136
else
11331137
r = try_repair_sge(a, b1, p2);
1138+
b1.set_bw(0);
11341139
}
11351140
p2.set_bw(0);
11361141
return r;
@@ -1148,7 +1153,7 @@ namespace bv {
11481153
bool r = false;
11491154
if (e)
11501155
r = try_repair_sge(a, b.bits(), p2);
1151-
else if (b.is_zero())
1156+
else if (b.bits() == p2)
11521157
r = false;
11531158
else {
11541159
auto& b1 = m_nexta;
@@ -1201,7 +1206,7 @@ namespace bv {
12011206
a.set_sub(p2_1, p2, m_one);
12021207
p2_1.set_bw(a.bw);
12031208
bool r = false;
1204-
if (b < p2)
1209+
if (p2 < b)
12051210
// random b <= x < p2
12061211
r = a.set_random_in_range(b, p2_1, m_tmp3, m_rand);
12071212
else {
@@ -1532,7 +1537,7 @@ namespace bv {
15321537
if (e.get(i) != e.get(a.bw - 1))
15331538
return false;
15341539

1535-
for (unsigned i = 0; i < e.bw; ++i)
1540+
for (unsigned i = 0; i < e.nw; ++i)
15361541
m_tmp[i] = e[i];
15371542
a.clear_overflow_bits(m_tmp);
15381543
return a.try_set(m_tmp);
@@ -1546,7 +1551,7 @@ namespace bv {
15461551
if (e.get(i))
15471552
return false;
15481553

1549-
for (unsigned i = 0; i < e.bw; ++i)
1554+
for (unsigned i = 0; i < e.nw; ++i)
15501555
m_tmp[i] = e[i];
15511556
a.clear_overflow_bits(m_tmp);
15521557
return a.try_set(m_tmp);
@@ -1630,4 +1635,20 @@ namespace bv {
16301635
}
16311636
return false;
16321637
}
1638+
1639+
std::ostream& sls_eval::display(std::ostream& out, expr_ref_vector const& es) {
1640+
auto& terms = sort_assertions(es);
1641+
for (expr* e : terms) {
1642+
out << e->get_id() << ": " << mk_bounded_pp(e, m, 1) << " ";
1643+
if (is_fixed0(e))
1644+
out << "f ";
1645+
if (bv.is_bv(e))
1646+
out << wval(e);
1647+
else if (m.is_bool(e))
1648+
out << (bval0(e) ? "T" : "F");
1649+
out << "\n";
1650+
}
1651+
terms.reset();
1652+
return out;
1653+
}
16331654
}

src/ast/sls/bv_sls_eval.h

+3
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,8 @@ namespace bv {
169169
* Propagate repair up to parent
170170
*/
171171
bool repair_up(expr* e);
172+
173+
174+
std::ostream& display(std::ostream& out, expr_ref_vector const& es);
172175
};
173176
}

src/ast/sls/sls_valuation.h

+4
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ namespace bv {
3737
bvect(unsigned sz) : svector(sz, (unsigned)0) {}
3838
void set_bw(unsigned bw);
3939

40+
void set(unsigned bit_idx, bool val) {
41+
auto _val = static_cast<digit_t>(0 - static_cast<digit_t>(val));
42+
get_bit_word(bit_idx) ^= (_val ^ get_bit_word(bit_idx)) & get_pos_mask(bit_idx);
43+
}
4044

4145
bool get(unsigned bit_idx) const {
4246
return (get_bit_word(bit_idx) & get_pos_mask(bit_idx)) != 0;

src/test/sls_test.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,13 @@ namespace bv {
154154
ev.set(e2, val);
155155
auto rep1 = ev.try_repair(to_app(e2), idx);
156156
if (!rep1) {
157-
verbose_stream() << "Not repaired " << mk_pp(e2, m) << " r: " << r << "\n";
157+
verbose_stream() << "Not repaired " << mk_pp(e1, m) << " " << mk_pp(e2, m) << " r: " << r << "\n";
158158
}
159159
auto val3 = ev.bval0(e2);
160160
if (val3 != val) {
161161
verbose_stream() << "Repaired but not corrected " << mk_pp(e2, m) << "\n";
162+
ev.display(std::cout, es);
163+
exit(0);
162164
}
163165
//SASSERT(rep1);
164166
}
@@ -171,8 +173,9 @@ namespace bv {
171173
auto rep2 = ev.try_repair(to_app(e2), idx);
172174
if (!rep2) {
173175
verbose_stream() << "Not repaired " << mk_pp(e2, m) << "\n";
174-
}
176+
}
175177
auto val3 = ev.wval(e2);
178+
val3.commit_eval();
176179
if (!val3.eq(val1)) {
177180
verbose_stream() << "Repaired but not corrected " << mk_pp(e2, m) << "\n";
178181
}
@@ -234,6 +237,7 @@ static void test_repair1() {
234237
}
235238

236239
void tst_sls_test() {
237-
test_repair1();
238240
test_eval1();
241+
test_repair1();
242+
239243
}

0 commit comments

Comments
 (0)