3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-22 11:07:51 +00:00

add bit blast optio

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2024-01-01 11:08:30 -08:00
parent 09b3d99db1
commit fb5f81cf75
5 changed files with 32 additions and 1 deletions

View file

@ -183,6 +183,8 @@ namespace polysat {
assignment& get_assignment() { return m_assignment; }
random_gen& rand() { return m_rand; }
pdd mk_ite(signed_constraint const& sc, pdd const& p, pdd const& q) { return s.mk_ite(sc, p, q); }
};
}

View file

@ -118,6 +118,8 @@ namespace polysat {
// bit blast a monomial definition
lbool monomials::bit_blast() {
// disable for now
return l_undef;
init_to_refine();
if (m_to_refine.empty())
return l_true;
@ -330,7 +332,17 @@ namespace polysat {
}
bool monomials::bit_blast(monomial const& mon) {
return false;
if (mon.size() != 2)
return false;
unsigned sz = mon.num_bits();
pdd n = mon.var.manager().mk_val(0);
pdd zero = n.manager().mk_val(0);
pdd p = mon.args[0];
pdd q = mon.args[1];
for (unsigned i = 0; i < sz; ++i)
n += c.mk_ite(C.bit(p, i), c.value(rational::power_of_two(i), sz) * q, zero);
c.add_axiom("bit-blast", { C.eq(mon.var, n) }, true);
return true;
}
std::ostream& monomials::display(std::ostream& out) const {

View file

@ -147,6 +147,7 @@ namespace polysat {
virtual void get_bitvector_sub_slices(pvar v, offset_slices& out) = 0;
virtual void get_bitvector_super_slices(pvar v, offset_slices& out) = 0;
virtual void get_fixed_bits(pvar v, fixed_bits_vector& fixed_slice) = 0;
virtual pdd mk_ite(signed_constraint const& sc, pdd const& p, pdd const& q) = 0;
virtual unsigned level(dependency const& d) = 0;
};