mirror of
https://github.com/Z3Prover/z3
synced 2025-07-29 23:43:15 +00:00
Add helper for creating op_constraints
This commit is contained in:
parent
38a43bd087
commit
b4ee8cef1a
2 changed files with 17 additions and 29 deletions
|
@ -243,12 +243,8 @@ namespace polysat {
|
||||||
return { dedup(alloc(smul_fl_constraint, *this, a, b, false)), true };
|
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) {
|
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_constraint::code::lshr_op, p, q, r)), true };
|
return { dedup(alloc(op_constraint, *this, 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 };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// To do signed comparison of bitvectors, flip the msb and do unsigned comparison:
|
// To do signed comparison of bitvectors, flip the msb and do unsigned comparison:
|
||||||
|
@ -310,31 +306,15 @@ namespace polysat {
|
||||||
return {q, r};
|
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) {
|
pdd constraint_manager::bnot(pdd const& p) {
|
||||||
return -p - 1;
|
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();
|
auto& m = p.manager();
|
||||||
unsigned sz = m.power_of_2();
|
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);
|
auto it = m_dedup.op_constraint_expr.find_iterator(args);
|
||||||
if (it != m_dedup.op_constraint_expr.end())
|
if (it != m_dedup.op_constraint_expr.end())
|
||||||
return m.mk_var(it->m_value);
|
return m.mk_var(it->m_value);
|
||||||
|
@ -342,10 +322,18 @@ namespace polysat {
|
||||||
pdd r = m.mk_var(s.add_var(sz));
|
pdd r = m.mk_var(s.add_var(sz));
|
||||||
m_dedup.op_constraint_expr.insert(args, r.var());
|
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;
|
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) {
|
pdd constraint_manager::bor(pdd const& p, pdd const& q) {
|
||||||
// From "Hacker's Delight", section 2-2. Addition Combined with Logical Operations;
|
// 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
|
// found via Int-Blasting paper; see https://doi.org/10.1007/978-3-030-94583-1_24
|
||||||
|
|
|
@ -82,6 +82,9 @@ namespace polysat {
|
||||||
void ensure_bvar(constraint* c);
|
void ensure_bvar(constraint* c);
|
||||||
void erase_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:
|
public:
|
||||||
constraint_manager(solver& s);
|
constraint_manager(solver& s);
|
||||||
~constraint_manager();
|
~constraint_manager();
|
||||||
|
@ -107,14 +110,11 @@ namespace polysat {
|
||||||
signed_constraint smul_ovfl(pdd const& p, pdd const& q);
|
signed_constraint smul_ovfl(pdd const& p, pdd const& q);
|
||||||
signed_constraint smul_udfl(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 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);
|
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 bnot(pdd const& p);
|
||||||
|
pdd lshr(pdd const& p, pdd const& q);
|
||||||
pdd band(pdd const& p, pdd const& q);
|
pdd band(pdd const& p, pdd const& q);
|
||||||
pdd bor(pdd const& p, pdd const& q);
|
pdd bor(pdd const& p, pdd const& q);
|
||||||
pdd bxor(pdd const& p, pdd const& q);
|
pdd bxor(pdd const& p, pdd const& q);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue