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:
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 };
|
||||
}
|
||||
|
||||
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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue