3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-28 08:58:44 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2023-05-31 22:09:29 +02:00
parent 88c982ff0b
commit ee216b5274
3 changed files with 17 additions and 17 deletions

View file

@ -1169,7 +1169,7 @@ void bit_blaster_tpl<Cfg>::mk_const_case1_multiplier(unsigned sz, expr * const *
if (!m().is_true(a_bits[i])) if (!m().is_true(a_bits[i]))
continue; continue;
ptr_buffer<expr, 128> one, sbits; ptr_buffer<expr, 128> kbits, ibits;
expr_ref_vector out_bits1(m()); expr_ref_vector out_bits1(m());
unsigned k = 0; unsigned k = 0;
@ -1189,8 +1189,8 @@ void bit_blaster_tpl<Cfg>::mk_const_case1_multiplier(unsigned sz, expr * const *
// shift by k+1, subtract x // shift by k+1, subtract x
out_bits.reset(); out_bits.reset();
mul2_i(k + 1, sbits); mul2_i(k + 1, kbits);
mk_adder(sz, out_bits.data(), sbits.data(), out_bits1); mk_adder(sz, out_bits.data(), kbits.data(), out_bits1);
out_bits.reset(); out_bits.reset();
out_bits.append(out_bits1); out_bits.append(out_bits1);
out_bits1.reset(); out_bits1.reset();
@ -1201,18 +1201,25 @@ void bit_blaster_tpl<Cfg>::mk_const_case1_multiplier(unsigned sz, expr * const *
out_bits.append(out_bits1); out_bits.append(out_bits1);
out_bits1.reset(); out_bits1.reset();
} }
else if (i == k) { else if (i <= k && k <= i + 1) {
mul2_i(i, sbits); mul2_i(i, ibits);
mk_adder(sz, out_bits.data(), sbits.data(), out_bits1); mk_adder(sz, out_bits.data(), ibits.data(), out_bits1);
out_bits.reset(); out_bits.reset();
out_bits.append(out_bits1); out_bits.append(out_bits1);
out_bits1.reset(); out_bits1.reset();
if (i + 1 == k) {
mul2_i(k, kbits);
mk_adder(sz, out_bits.data(), kbits.data(), out_bits1);
out_bits.reset();
out_bits.append(out_bits1);
out_bits1.reset();
}
} }
else if (k == sz - 1) { else if (k == sz - 1) {
// 2^sz - 2^i = - 2^i // 2^sz - 2^i = - 2^i
// -= x*2^i // -= x*2^i
mul2_i(i, sbits); mul2_i(i, ibits);
mk_subtracter(sz, out_bits.data(), sbits.data(), out_bits1, cout); mk_subtracter(sz, out_bits.data(), ibits.data(), out_bits1, cout);
out_bits.reset(); out_bits.reset();
out_bits.append(out_bits1); out_bits.append(out_bits1);
} }

View file

@ -1943,7 +1943,7 @@ public:
final_check_status final_check_eh() { final_check_status final_check_eh() {
verbose_stream() << "final " << ctx().get_scope_level() << " " << ctx().assigned_literals().size() << "\n"; // verbose_stream() << "final " << ctx().get_scope_level() << " " << ctx().assigned_literals().size() << "\n";
//ctx().display(verbose_stream()); //ctx().display(verbose_stream());
//exit(0); //exit(0);

View file

@ -195,12 +195,6 @@ void tst_const_multiplier(ast_manager& m, bit_blaster & blaster, unsigned sz) {
expr_ref_vector c(m), out1(m), out2(m); expr_ref_vector c(m), out1(m), out2(m);
for (unsigned j = 0; j < sz; ++j) for (unsigned j = 0; j < sz; ++j)
c.push_back((i & (1ul << j)) ? m.mk_true() : m.mk_false()); c.push_back((i & (1ul << j)) ? m.mk_true() : m.mk_false());
for (auto xi : x)
verbose_stream() << mk_pp(xi, m);
verbose_stream() << " ";
for (auto ci : c)
verbose_stream() << mk_pp(ci, m);
verbose_stream() << "\n";
blaster.mk_const_case1_multiplier(sz, c.data(), x.data(), out1); blaster.mk_const_case1_multiplier(sz, c.data(), x.data(), out1);
blaster.mk_generic_multiplier(sz, c.data(), x.data(), out2); blaster.mk_generic_multiplier(sz, c.data(), x.data(), out2);
@ -211,7 +205,6 @@ void tst_const_multiplier(ast_manager& m, bit_blaster & blaster, unsigned sz) {
smt::kernel solver(m, fp); smt::kernel solver(m, fp);
solver.assert_expr(m.mk_not(fml)); solver.assert_expr(m.mk_not(fml));
auto r = solver.check(); auto r = solver.check();
verbose_stream() << r << "\n";
VERIFY(r == l_false); VERIFY(r == l_false);
expr_mark vis1, vis2; expr_mark vis1, vis2;
unsigned sz1 = 0, sz2 = 0; unsigned sz1 = 0, sz2 = 0;
@ -272,7 +265,7 @@ void tst_bit_blaster() {
bit_blaster_params params; bit_blaster_params params;
bit_blaster blaster(m, params); bit_blaster blaster(m, params);
tst_const_multiplier(m, blaster, 7); tst_const_multiplier(m, blaster, 8);
tst_adder(m, blaster); tst_adder(m, blaster);
tst_multiplier(m, blaster); tst_multiplier(m, blaster);
tst_le(m, 4); tst_le(m, 4);