Skip to content

Commit 9cde4f7

Browse files
bugfixes
1 parent d7e419b commit 9cde4f7

File tree

5 files changed

+58
-25
lines changed

5 files changed

+58
-25
lines changed

src/ast/sls/bv_sls.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,12 @@ namespace bv {
166166

167167
void sls::try_repair_up(app* e) {
168168
m_repair_up.remove(e->get_id());
169-
if (m_terms.is_assertion(e)) {
170-
m_repair_down.insert(e->get_id());
171-
}
169+
if (m_terms.is_assertion(e) || !m_eval.repair_up(e))
170+
m_repair_down.insert(e->get_id());
172171
else {
173-
m_eval.repair_up(e);
172+
if (!eval_is_correct(e)) {
173+
verbose_stream() << "incorrect eval #" << e->get_id() << " " << mk_bounded_pp(e, m) << "\n";
174+
}
174175
SASSERT(eval_is_correct(e));
175176
for (auto p : m_terms.parents(e))
176177
m_repair_up.insert(p->get_id());

src/ast/sls/bv_sls_eval.cpp

+31-15
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Module Name:
1212
--*/
1313

1414
#include "ast/ast_pp.h"
15+
#include "ast/ast_ll_pp.h"
1516
#include "ast/sls/bv_sls.h"
1617

1718
namespace bv {
@@ -178,7 +179,9 @@ namespace bv {
178179
}
179180
return m.are_equal(a, b);
180181
}
182+
case OP_DISTINCT:
181183
default:
184+
verbose_stream() << mk_bounded_pp(e, m) << "\n";
182185
UNREACHABLE();
183186
break;
184187
}
@@ -511,14 +514,16 @@ namespace bv {
511514
}
512515
case OP_SIGN_EXT: {
513516
auto& a = wval0(e->get_arg(0));
514-
val.set(a.bits);
517+
for (unsigned i = 0; i < a.bw; ++i)
518+
val.set(val.bits, i, a.get(a.bits, i));
515519
bool sign = a.sign();
516520
val.set_range(val.bits, a.bw, val.bw, sign);
517521
break;
518522
}
519523
case OP_ZERO_EXT: {
520524
auto& a = wval0(e->get_arg(0));
521-
val.set(a.bits);
525+
for (unsigned i = 0; i < a.bw; ++i)
526+
val.set(val.bits, i, a.get(a.bits, i));
522527
val.set_range(val.bits, a.bw, val.bw, false);
523528
break;
524529
}
@@ -1268,6 +1273,7 @@ namespace bv {
12681273
a.set(m_tmp, i, e.get(e.bits, i - sh));
12691274
for (unsigned i = 0; i < sh; ++i)
12701275
a.set(m_tmp, i, a.get(a.bits, i));
1276+
a.clear_overflow_bits(m_tmp);
12711277
return a.try_set(m_tmp);
12721278
}
12731279
}
@@ -1500,7 +1506,7 @@ namespace bv {
15001506
}
15011507

15021508
bool sls_eval::try_repair_zero_ext(bvval const& e, bvval& a) {
1503-
for (unsigned i = 0; i < e.bw; ++i)
1509+
for (unsigned i = 0; i < a.bw; ++i)
15041510
if (!a.get(a.fixed, i))
15051511
a.set(a.bits, i, e.get(e.bits, i));
15061512
return true;
@@ -1509,21 +1515,25 @@ namespace bv {
15091515
bool sls_eval::try_repair_concat(bvval const& e, bvval& a, bvval& b, unsigned i) {
15101516
if (i == 0) {
15111517
for (unsigned i = 0; i < a.bw; ++i)
1512-
if (!a.get(a.fixed, i))
1513-
a.set(a.bits, i, e.get(e.bits, i + b.bw));
1518+
a.set(m_tmp, i, e.get(e.bits, i + b.bw));
1519+
a.clear_overflow_bits(m_tmp);
1520+
a.set_repair(random_bool(), m_tmp);
15141521
}
15151522
else {
15161523
for (unsigned i = 0; i < b.bw; ++i)
1517-
if (!b.get(b.fixed, i))
1518-
b.set(b.bits, i, e.get(e.bits, i));
1524+
b.set(m_tmp, i, e.get(e.bits, i));
1525+
b.clear_overflow_bits(m_tmp);
1526+
b.set_repair(random_bool(), m_tmp);
15191527
}
15201528
return true;
15211529
}
15221530

15231531
bool sls_eval::try_repair_extract(bvval const& e, bvval& a, unsigned lo) {
15241532
for (unsigned i = 0; i < e.bw; ++i)
1525-
if (!a.get(a.fixed, i + lo))
1526-
a.set(a.bits, i + lo, e.get(e.bits, i));
1533+
if (a.get(a.fixed, i + lo) && a.get(a.bits, i + lo) != e.get(e.bits, i))
1534+
return false;
1535+
for (unsigned i = 0; i < e.bw; ++i)
1536+
a.set(a.bits, i + lo, e.get(e.bits, i));
15271537
return true;
15281538
}
15291539

@@ -1547,12 +1557,18 @@ namespace bv {
15471557
}
15481558
}
15491559

1550-
void sls_eval::repair_up(expr* e) {
1560+
bool sls_eval::repair_up(expr* e) {
15511561
if (!is_app(e))
1552-
return;
1553-
if (m.is_bool(e))
1554-
set(e, bval1(to_app(e)));
1555-
else if (bv.is_bv(e))
1556-
wval0(e).set(wval1(to_app(e)));
1562+
return false;
1563+
if (m.is_bool(e)) {
1564+
auto b = bval1(to_app(e));
1565+
if (is_fixed0(e))
1566+
return b == bval0(e);
1567+
m_eval[e->get_id()] = b;
1568+
return true;
1569+
}
1570+
if (bv.is_bv(e))
1571+
return wval0(e).try_set(wval1(to_app(e)));
1572+
return false;
15571573
}
15581574
}

src/ast/sls/bv_sls_eval.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,6 @@ namespace bv {
156156
/*
157157
* Propagate repair up to parent
158158
*/
159-
void repair_up(expr* e);
159+
bool repair_up(expr* e);
160160
};
161161
}

src/ast/sls/bv_sls_fixed.cpp

+14-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Module Name:
1212
--*/
1313

1414
#include "ast/ast_pp.h"
15+
#include "ast/ast_ll_pp.h"
1516
#include "ast/sls/bv_sls_fixed.h"
1617
#include "ast/sls/bv_sls_eval.h"
1718

@@ -138,6 +139,7 @@ namespace bv {
138139
v.add_range(-b, a - b);
139140
}
140141
else if (!y) {
142+
141143
if (mod(b + 1, rational::power_of_two(bv.get_bv_size(x))) == 0)
142144
return;
143145
auto& v = wval0(x);
@@ -300,21 +302,28 @@ namespace bv {
300302

301303

302304
if (j > 0 && k > 0) {
303-
for (unsigned i = 0; i < std::min(k, j); ++i)
305+
for (unsigned i = 0; i < std::min(k, j); ++i) {
306+
SASSERT(!v.get(v.bits, i));
304307
v.set(v.fixed, i, true);
308+
}
305309
}
306310
// lower zj + jk bits are 0
307311
if (zk > 0 || zj > 0) {
308-
for (unsigned i = 0; i < zk + zj; ++i)
312+
for (unsigned i = 0; i < zk + zj; ++i) {
313+
SASSERT(!v.get(v.bits, i));
309314
v.set(v.fixed, i, true);
315+
}
310316
}
311317
// upper bits are 0, if enough high order bits of a, b are 0.
312-
if (hzj < v.bw && hzk < v.bw && hzj + hzk > v.bw) {
318+
// TODO - buggy
319+
if (false && hzj < v.bw && hzk < v.bw && hzj + hzk > v.bw) {
313320
hzj = v.bw - hzj;
314321
hzk = v.bw - hzk;
315-
for (unsigned i = hzj + hzk - 1; i < v.bw; ++i)
322+
for (unsigned i = hzj + hzk - 1; i < v.bw; ++i) {
323+
SASSERT(!v.get(v.bits, i));
316324
v.set(v.fixed, i, true);
317-
}
325+
}
326+
}
318327
break;
319328
}
320329
case OP_CONCAT: {

src/ast/sls/bv_sls_terms.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ namespace bv {
9999
else if (bv.is_concat(e)) {
100100
FOLD_OP(bv.mk_concat);
101101
}
102+
else if (m.is_distinct(e)) {
103+
expr_ref_vector es(m);
104+
for (unsigned i = 0; i < num_args; ++i)
105+
for (unsigned j = i + 1; j < num_args; ++j)
106+
es.push_back(m.mk_not(m.mk_eq(arg(i), arg(j))));
107+
r = m.mk_and(es);
108+
}
102109
else if (bv.is_bv_sdiv(e, x, y) || bv.is_bv_sdiv0(e, x, y) || bv.is_bv_sdivi(e, x, y)) {
103110
r = mk_sdiv(x, y);
104111
}

0 commit comments

Comments
 (0)