mirror of
https://github.com/Z3Prover/z3
synced 2025-08-21 02:30:23 +00:00
add bit blast optio
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
09b3d99db1
commit
fb5f81cf75
5 changed files with 32 additions and 1 deletions
|
@ -183,6 +183,8 @@ namespace polysat {
|
||||||
assignment& get_assignment() { return m_assignment; }
|
assignment& get_assignment() { return m_assignment; }
|
||||||
|
|
||||||
random_gen& rand() { return m_rand; }
|
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); }
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,6 +118,8 @@ namespace polysat {
|
||||||
|
|
||||||
// bit blast a monomial definition
|
// bit blast a monomial definition
|
||||||
lbool monomials::bit_blast() {
|
lbool monomials::bit_blast() {
|
||||||
|
// disable for now
|
||||||
|
return l_undef;
|
||||||
init_to_refine();
|
init_to_refine();
|
||||||
if (m_to_refine.empty())
|
if (m_to_refine.empty())
|
||||||
return l_true;
|
return l_true;
|
||||||
|
@ -330,7 +332,17 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool monomials::bit_blast(monomial const& mon) {
|
bool monomials::bit_blast(monomial const& mon) {
|
||||||
|
if (mon.size() != 2)
|
||||||
return false;
|
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 {
|
std::ostream& monomials::display(std::ostream& out) const {
|
||||||
|
|
|
@ -147,6 +147,7 @@ namespace polysat {
|
||||||
virtual void get_bitvector_sub_slices(pvar v, offset_slices& out) = 0;
|
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_bitvector_super_slices(pvar v, offset_slices& out) = 0;
|
||||||
virtual void get_fixed_bits(pvar v, fixed_bits_vector& fixed_slice) = 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;
|
virtual unsigned level(dependency const& d) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -720,6 +720,21 @@ namespace polysat {
|
||||||
mk_atom(lit.var(), sc);
|
mk_atom(lit.var(), sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pdd solver::mk_ite(signed_constraint const& sc, pdd const& p, pdd const& q) {
|
||||||
|
expr_ref cond = constraint2expr(sc);
|
||||||
|
expr_ref th = pdd2expr(p);
|
||||||
|
expr_ref el = pdd2expr(q);
|
||||||
|
expr* ite = m.mk_ite(cond, th, el);
|
||||||
|
ctx.internalize(ite);
|
||||||
|
euf::enode* n = expr2enode(ite);
|
||||||
|
if (!n->is_attached_to(get_id())) {
|
||||||
|
auto v = mk_var(n);
|
||||||
|
pvar r = m_core.add_var(bv.get_bv_size(th));
|
||||||
|
internalize_set(v, m_core.var(r));
|
||||||
|
}
|
||||||
|
return expr2pdd(ite);
|
||||||
|
}
|
||||||
|
|
||||||
dd::pdd solver::expr2pdd(expr* e) {
|
dd::pdd solver::expr2pdd(expr* e) {
|
||||||
return var2pdd(get_th_var(e));
|
return var2pdd(get_th_var(e));
|
||||||
}
|
}
|
||||||
|
|
|
@ -215,6 +215,7 @@ namespace polysat {
|
||||||
void get_bitvector_super_slices(pvar v, offset_slices& out) override;
|
void get_bitvector_super_slices(pvar v, offset_slices& out) override;
|
||||||
void get_bitvector_suffixes(pvar v, offset_slices& out) override;
|
void get_bitvector_suffixes(pvar v, offset_slices& out) override;
|
||||||
void get_fixed_bits(pvar v, fixed_bits_vector& fixed_bits) override;
|
void get_fixed_bits(pvar v, fixed_bits_vector& fixed_bits) override;
|
||||||
|
pdd mk_ite(signed_constraint const& sc, pdd const& p, pdd const& q) override;
|
||||||
unsigned level(dependency const& d) override;
|
unsigned level(dependency const& d) override;
|
||||||
dependency explain_slice(pvar v, pvar w, unsigned offset);
|
dependency explain_slice(pvar v, pvar w, unsigned offset);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue