mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 17:15:31 +00:00
n/a
This commit is contained in:
parent
ddf2d28350
commit
388b2f5eec
9 changed files with 274 additions and 202 deletions
|
@ -15,6 +15,12 @@ namespace bv {
|
|||
bv(m)
|
||||
{}
|
||||
|
||||
void check_eval(expr* a, expr* b, unsigned j) {
|
||||
auto es = create_exprs(a, b, j);
|
||||
for (expr* e : es)
|
||||
check_eval(e);
|
||||
}
|
||||
|
||||
void check_eval(expr* e) {
|
||||
std::function<bool(expr*, unsigned)> value = [](expr*, unsigned) {
|
||||
return false;
|
||||
|
@ -44,7 +50,7 @@ namespace bv {
|
|||
}
|
||||
else if (m.is_bool(e)) {
|
||||
auto val1 = ev.bval0(e);
|
||||
auto val2 = m.is_true(r) ? true : false;
|
||||
auto val2 = m.is_true(r);
|
||||
if (val1 != val2) {
|
||||
verbose_stream() << mk_pp(e, m) << " computed value " << val1 << " at odds with definition\n";
|
||||
}
|
||||
|
@ -53,121 +59,109 @@ namespace bv {
|
|||
}
|
||||
}
|
||||
|
||||
void check(expr* a, expr* b) {
|
||||
expr_ref e(m);
|
||||
auto& validator = *this;
|
||||
e = bv.mk_bv_add(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_mul(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_sub(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_udiv(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_sdiv(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_srem(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_urem(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_smod(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_shl(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_ashr(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_lshr(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_and(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_or(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_xor(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_neg(a);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bv_not(a);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bvumul_ovfl(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bvumul_no_ovfl(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_zero_extend(3, a);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_sign_extend(3, a);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_ule(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_sle(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_concat(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_extract(6, 3, a);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bvuadd_ovfl(a, b);
|
||||
validator.check_eval(e);
|
||||
expr_ref_vector create_exprs(expr* a, expr* b, unsigned j) {
|
||||
expr_ref_vector result(m);
|
||||
result.push_back(bv.mk_bv_add(a, b))
|
||||
.push_back(bv.mk_bv_mul(a, b))
|
||||
.push_back(bv.mk_bv_sub(a, b))
|
||||
.push_back(bv.mk_bv_udiv(a, b))
|
||||
.push_back(bv.mk_bv_sdiv(a, b))
|
||||
.push_back(bv.mk_bv_srem(a, b))
|
||||
.push_back(bv.mk_bv_urem(a, b))
|
||||
.push_back(bv.mk_bv_smod(a, b))
|
||||
.push_back(bv.mk_bv_shl(a, b))
|
||||
.push_back(bv.mk_bv_ashr(a, b))
|
||||
.push_back(bv.mk_bv_lshr(a, b))
|
||||
.push_back(bv.mk_bv_and(a, b))
|
||||
.push_back(bv.mk_bv_or(a, b))
|
||||
.push_back(bv.mk_bv_xor(a, b))
|
||||
.push_back(bv.mk_bv_neg(a))
|
||||
.push_back(bv.mk_bv_not(a))
|
||||
.push_back(bv.mk_bvumul_ovfl(a, b))
|
||||
.push_back(bv.mk_bvumul_no_ovfl(a, b))
|
||||
.push_back(bv.mk_zero_extend(3, a))
|
||||
.push_back(bv.mk_sign_extend(3, a))
|
||||
.push_back(bv.mk_ule(a, b))
|
||||
.push_back(bv.mk_sle(a, b))
|
||||
.push_back(bv.mk_concat(a, b))
|
||||
.push_back(bv.mk_extract(6, 3, a))
|
||||
.push_back(bv.mk_bvuadd_ovfl(a, b))
|
||||
.push_back(bv.mk_bv_rotate_left(a, j))
|
||||
.push_back(bv.mk_bv_rotate_right(a, j))
|
||||
.push_back(bv.mk_bv_rotate_left(a, b))
|
||||
.push_back(bv.mk_bv_rotate_right(a, b))
|
||||
// .push_back(bv.mk_bvsadd_ovfl(a, b))
|
||||
// .push_back(bv.mk_bvneg_ovfl(a))
|
||||
// .push_back(bv.mk_bvsmul_no_ovfl(a, b))
|
||||
// .push_back(bv.mk_bvsmul_no_udfl(a, b))
|
||||
// .push_back(bv.mk_bvsmul_ovfl(a, b))
|
||||
// .push_back(bv.mk_bvsdiv_ovfl(a, b))
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
// e = op(a, b),
|
||||
// update value of a to "random"
|
||||
// repair a based on computed values.
|
||||
void check_repair(expr* a, expr* b, unsigned j) {
|
||||
expr_ref x(m.mk_const("x", bv.mk_sort(bv.get_bv_size(a))), m);
|
||||
expr_ref y(m.mk_const("y", bv.mk_sort(bv.get_bv_size(b))), m);
|
||||
auto es1 = create_exprs(a, b, j);
|
||||
auto es2 = create_exprs(x, b, j);
|
||||
auto es3 = create_exprs(a, y, j);
|
||||
for (unsigned i = 0; i < es1.size(); ++i) {
|
||||
auto e1 = es1.get(i);
|
||||
auto e2 = es2.get(i);
|
||||
auto e3 = es3.get(i);
|
||||
check_repair_idx(e1, e2, 0, x);
|
||||
if (is_app(e1) && to_app(e1)->get_num_args() == 2)
|
||||
check_repair_idx(e1, e3, 1, y);
|
||||
}
|
||||
}
|
||||
|
||||
e = bv.mk_bvsadd_ovfl(a, b);
|
||||
validator.check_eval(e);
|
||||
random_gen rand;
|
||||
|
||||
e = bv.mk_bvneg_ovfl(a);
|
||||
validator.check_eval(e);
|
||||
void check_repair_idx(expr* e1, expr* e2, unsigned idx, expr* x) {
|
||||
std::function<bool(expr*, unsigned)> value = [&](expr*, unsigned) {
|
||||
return rand() % 2 == 0;
|
||||
};
|
||||
expr_ref_vector es(m);
|
||||
bv_util bv(m);
|
||||
es.push_back(e1);
|
||||
es.push_back(e2);
|
||||
sls_eval ev(m);
|
||||
ev.init_eval(es, value);
|
||||
th_rewriter rw(m);
|
||||
expr_ref r(e1, m);
|
||||
if (m.is_bool(e1)) {
|
||||
auto val = m.is_true(r);
|
||||
auto val2 = ev.bval0(e2);
|
||||
if (val != val2) {
|
||||
ev.set(e2, val);
|
||||
auto rep1 = ev.try_repair(to_app(e2), idx);
|
||||
if (!rep1) {
|
||||
verbose_stream() << "Not repaired " << mk_pp(e2, m) << "\n";
|
||||
}
|
||||
SASSERT(rep1);
|
||||
}
|
||||
}
|
||||
if (bv.is_bv(e1)) {
|
||||
auto& val1 = ev.wval0(e1);
|
||||
auto& val2 = ev.wval0(e2);
|
||||
if (!val1.eq(val2)) {
|
||||
val2.set(val1.bits);
|
||||
auto rep2 = ev.try_repair(to_app(e2), idx);
|
||||
if (!rep2) {
|
||||
verbose_stream() << "Not repaired " << mk_pp(e2, m) << "\n";
|
||||
}
|
||||
SASSERT(rep2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
e = bv.mk_bvsmul_no_ovfl(a, b);
|
||||
validator.check_eval(e);
|
||||
// todo:
|
||||
void test_fixed() {
|
||||
|
||||
e = bv.mk_bvsmul_no_udfl(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bvsmul_ovfl(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_bvsdiv_ovfl(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
e = bv.mk_rotate_left(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_rotate_right(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_rotate_left_ext(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
e = bv.mk_rotate_right_ext(a, b);
|
||||
validator.check_eval(e);
|
||||
|
||||
#endif
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -183,17 +177,36 @@ static void test_eval1() {
|
|||
bv::sls_test validator(m);
|
||||
|
||||
unsigned k = 0;
|
||||
for (unsigned i = 0; i < 256; ++i) {
|
||||
expr_ref a(bv.mk_numeral(rational(i), 8), m);
|
||||
for (unsigned j = 0; j < 256; ++j) {
|
||||
expr_ref b(bv.mk_numeral(rational(j), 8), m);
|
||||
|
||||
unsigned bw = 6;
|
||||
for (unsigned i = 0; i < 1ul << bw; ++i) {
|
||||
expr_ref a(bv.mk_numeral(rational(i), bw), m);
|
||||
for (unsigned j = 0; j < 1ul << bw; ++j) {
|
||||
expr_ref b(bv.mk_numeral(rational(j), bw), m);
|
||||
++k;
|
||||
if (k % 1000 == 0)
|
||||
verbose_stream() << "tests " << k << "\n";
|
||||
validator.check_eval(a, b, j);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
validator.check(a, b);
|
||||
static void test_repair1() {
|
||||
ast_manager m;
|
||||
reg_decl_plugins(m);
|
||||
bv_util bv(m);
|
||||
expr_ref e(m);
|
||||
bv::sls_test validator(m);
|
||||
|
||||
unsigned k = 0;
|
||||
unsigned bw = 6;
|
||||
for (unsigned i = 0; i < 1ul << bw; ++i) {
|
||||
expr_ref a(bv.mk_numeral(rational(i), bw), m);
|
||||
for (unsigned j = 0; j < 1ul << bw; ++j) {
|
||||
expr_ref b(bv.mk_numeral(rational(j), bw), m);
|
||||
++k;
|
||||
if (k % 1000 == 0)
|
||||
verbose_stream() << "tests " << k << "\n";
|
||||
validator.check_repair(a, b, j);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue