3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 09:35:32 +00:00

Add helper for creating op_constraints

This commit is contained in:
Jakob Rath 2022-11-17 12:59:37 +01:00
parent 38a43bd087
commit b4ee8cef1a
2 changed files with 17 additions and 29 deletions

View file

@ -243,12 +243,8 @@ namespace polysat {
return { dedup(alloc(smul_fl_constraint, *this, a, b, false)), true };
}
signed_constraint constraint_manager::lshr(pdd const& p, pdd const& q, pdd const& r) {
return { dedup(alloc(op_constraint, *this, op_constraint::code::lshr_op, p, q, r)), true };
}
signed_constraint constraint_manager::band(pdd const& p, pdd const& q, pdd const& r) {
return { dedup(alloc(op_constraint, *this, op_constraint::code::and_op, p, q, r)), true };
signed_constraint constraint_manager::mk_op_constraint(op_constraint::code op, pdd const& p, pdd const& q, pdd const& r) {
return { dedup(alloc(op_constraint, *this, op, p, q, r)), true };
}
// To do signed comparison of bitvectors, flip the msb and do unsigned comparison:
@ -310,31 +306,15 @@ namespace polysat {
return {q, r};
}
pdd constraint_manager::lshr(pdd const& p, pdd const& q) {
auto& m = p.manager();
unsigned sz = m.power_of_2();
op_constraint_args const args(op_constraint::code::lshr_op, p, q);
auto it = m_dedup.op_constraint_expr.find_iterator(args);
if (it != m_dedup.op_constraint_expr.end())
return m.mk_var(it->m_value);
pdd r = m.mk_var(s.add_var(sz));
m_dedup.op_constraint_expr.insert(args, r.var());
s.assign_eh(lshr(p, q, r), null_dependency);
return r;
}
pdd constraint_manager::bnot(pdd const& p) {
return -p - 1;
}
pdd constraint_manager::band(pdd const& p, pdd const& q) {
pdd constraint_manager::mk_op_term(op_constraint::code op, pdd const& p, pdd const& q) {
auto& m = p.manager();
unsigned sz = m.power_of_2();
op_constraint_args const args(op_constraint::code::and_op, p, q);
op_constraint_args const args(op, p, q);
auto it = m_dedup.op_constraint_expr.find_iterator(args);
if (it != m_dedup.op_constraint_expr.end())
return m.mk_var(it->m_value);
@ -342,10 +322,18 @@ namespace polysat {
pdd r = m.mk_var(s.add_var(sz));
m_dedup.op_constraint_expr.insert(args, r.var());
s.assign_eh(band(p, q, r), null_dependency);
s.assign_eh(mk_op_constraint(op, p, q, r), null_dependency);
return r;
}
pdd constraint_manager::lshr(pdd const& p, pdd const& q) {
return mk_op_term(op_constraint::code::lshr_op, p, q);
}
pdd constraint_manager::band(pdd const& p, pdd const& q) {
return mk_op_term(op_constraint::code::and_op, p, q);
}
pdd constraint_manager::bor(pdd const& p, pdd const& q) {
// From "Hacker's Delight", section 2-2. Addition Combined with Logical Operations;
// found via Int-Blasting paper; see https://doi.org/10.1007/978-3-030-94583-1_24

View file

@ -82,6 +82,9 @@ namespace polysat {
void ensure_bvar(constraint* c);
void erase_bvar(constraint* c);
signed_constraint mk_op_constraint(op_constraint::code op, pdd const& p, pdd const& q, pdd const& r);
pdd mk_op_term(op_constraint::code op, pdd const& p, pdd const& q);
public:
constraint_manager(solver& s);
~constraint_manager();
@ -107,14 +110,11 @@ namespace polysat {
signed_constraint smul_ovfl(pdd const& p, pdd const& q);
signed_constraint smul_udfl(pdd const& p, pdd const& q);
signed_constraint bit(pdd const& p, unsigned i);
signed_constraint lshr(pdd const& p, pdd const& q, pdd const& r);
signed_constraint band(pdd const& p, pdd const& q, pdd const& r);
std::pair<pdd, pdd> quot_rem(pdd const& a, pdd const& b);
pdd lshr(pdd const& p, pdd const& q);
pdd bnot(pdd const& p);
pdd lshr(pdd const& p, pdd const& q);
pdd band(pdd const& p, pdd const& q);
pdd bor(pdd const& p, pdd const& q);
pdd bxor(pdd const& p, pdd const& q);