mirror of
https://github.com/Z3Prover/z3
synced 2025-04-29 20:05:51 +00:00
smul no overflow
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
89d6f1c191
commit
8c9835bca6
24 changed files with 376 additions and 63 deletions
|
@ -20,11 +20,12 @@ Author:
|
|||
|
||||
namespace polysat {
|
||||
|
||||
enum ckind_t { ule_t, mul_ovfl_t, op_t };
|
||||
enum ckind_t { ule_t, mul_ovfl_t, smul_ovfl_t, op_t };
|
||||
|
||||
class constraint;
|
||||
class ule_constraint;
|
||||
class mul_ovfl_constraint;
|
||||
class smul_ovfl_constraint;
|
||||
class op_constraint;
|
||||
class signed_constraint;
|
||||
|
||||
|
@ -98,6 +99,7 @@ namespace polysat {
|
|||
signed_constraint sle(pdd const& a, pdd const& b);
|
||||
signed_constraint slt(pdd const& a, pdd const& b);
|
||||
signed_constraint mul_ovfl(pdd const& p, pdd const& q);
|
||||
signed_constraint smul_ovfl(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);
|
||||
|
@ -139,6 +141,7 @@ namespace polysat {
|
|||
friend class clause;
|
||||
friend class ule_constraint;
|
||||
friend class mul_ovfl_constraint;
|
||||
friend class smul_ovfl_constraint;
|
||||
friend class op_constraint;
|
||||
|
||||
// constraint_manager* m_manager;
|
||||
|
@ -167,6 +170,7 @@ namespace polysat {
|
|||
virtual bool is_diseq() const { return false; }
|
||||
bool is_ule() const { return m_kind == ckind_t::ule_t; }
|
||||
bool is_mul_ovfl() const { return m_kind == ckind_t::mul_ovfl_t; }
|
||||
bool is_smul_ovfl() const { return m_kind == ckind_t::smul_ovfl_t; }
|
||||
bool is_op() const { return m_kind == ckind_t::op_t; }
|
||||
ckind_t kind() const { return m_kind; }
|
||||
virtual std::ostream& display(std::ostream& out, lbool status) const = 0;
|
||||
|
@ -179,13 +183,15 @@ namespace polysat {
|
|||
virtual bool is_currently_true(solver& s, bool is_positive) const = 0;
|
||||
virtual bool is_currently_false(solver& s, assignment_t const& sub, bool is_positive) const = 0;
|
||||
virtual bool is_currently_true(solver& s, assignment_t const& sub, bool is_positive) const = 0;
|
||||
virtual void narrow(solver& s, bool is_positive) = 0;
|
||||
virtual void narrow(solver& s, bool is_positive, bool first) = 0;
|
||||
virtual inequality as_inequality(bool is_positive) const = 0;
|
||||
|
||||
ule_constraint& to_ule();
|
||||
ule_constraint const& to_ule() const;
|
||||
mul_ovfl_constraint& to_mul_ovfl();
|
||||
mul_ovfl_constraint const& to_mul_ovfl() const;
|
||||
smul_ovfl_constraint& to_smul_ovfl();
|
||||
smul_ovfl_constraint const& to_smul_ovfl() const;
|
||||
op_constraint& to_op();
|
||||
op_constraint const& to_op() const;
|
||||
unsigned_vector& vars() { return m_vars; }
|
||||
|
@ -246,7 +252,7 @@ namespace polysat {
|
|||
bool is_currently_false(solver& s, assignment_t const& sub) const { return get()->is_currently_false(s, sub, is_positive()); }
|
||||
lbool bvalue(solver& s) const;
|
||||
unsigned level(solver& s) const { return get()->level(s); }
|
||||
void narrow(solver& s) { get()->narrow(s, is_positive()); }
|
||||
void narrow(solver& s, bool first) { get()->narrow(s, is_positive(), first); }
|
||||
inequality as_inequality() const { return get()->as_inequality(is_positive()); }
|
||||
|
||||
sat::bool_var bvar() const { return m_constraint->bvar(); }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue