mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +00:00
merge with pull request #1557
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
commit
2dc92e2b94
93 changed files with 526 additions and 548 deletions
|
@ -298,11 +298,11 @@ class sort_size {
|
|||
SS_FINITE_VERY_BIG,
|
||||
SS_INFINITE
|
||||
} m_kind;
|
||||
uint64 m_size; // It is only meaningful if m_kind == SS_FINITE
|
||||
sort_size(kind_t k, uint64 r):m_kind(k), m_size(r) {}
|
||||
uint64_t m_size; // It is only meaningful if m_kind == SS_FINITE
|
||||
sort_size(kind_t k, uint64_t r):m_kind(k), m_size(r) {}
|
||||
public:
|
||||
sort_size():m_kind(SS_INFINITE) {}
|
||||
sort_size(uint64 const & sz):m_kind(SS_FINITE), m_size(sz) {}
|
||||
sort_size(uint64_t const & sz):m_kind(SS_FINITE), m_size(sz) {}
|
||||
sort_size(sort_size const& other): m_kind(other.m_kind), m_size(other.m_size) {}
|
||||
explicit sort_size(rational const& r) {
|
||||
if (r.is_uint64()) {
|
||||
|
@ -316,7 +316,7 @@ public:
|
|||
}
|
||||
static sort_size mk_infinite() { return sort_size(SS_INFINITE, 0); }
|
||||
static sort_size mk_very_big() { return sort_size(SS_FINITE_VERY_BIG, 0); }
|
||||
static sort_size mk_finite(uint64 r) { return sort_size(SS_FINITE, r); }
|
||||
static sort_size mk_finite(uint64_t r) { return sort_size(SS_FINITE, r); }
|
||||
|
||||
bool is_infinite() const { return m_kind == SS_INFINITE; }
|
||||
bool is_very_big() const { return m_kind == SS_FINITE_VERY_BIG; }
|
||||
|
@ -324,7 +324,7 @@ public:
|
|||
|
||||
static bool is_very_big_base2(unsigned power) { return power >= 64; }
|
||||
|
||||
uint64 size() const { SASSERT(is_finite()); return m_size; }
|
||||
uint64_t size() const { SASSERT(is_finite()); return m_size; }
|
||||
};
|
||||
|
||||
std::ostream& operator<<(std::ostream& out, sort_size const & ss);
|
||||
|
@ -346,7 +346,7 @@ public:
|
|||
decl_info(family_id, k, num_parameters, parameters, private_parameters) {
|
||||
}
|
||||
|
||||
sort_info(family_id family_id, decl_kind k, uint64 num_elements,
|
||||
sort_info(family_id family_id, decl_kind k, uint64_t num_elements,
|
||||
unsigned num_parameters = 0, parameter const * parameters = nullptr, bool private_parameters = false):
|
||||
decl_info(family_id, k, num_parameters, parameters, private_parameters), m_num_elements(num_elements) {
|
||||
}
|
||||
|
|
|
@ -387,7 +387,7 @@ format * smt2_pp_environment::pp_string_literal(app * t) {
|
|||
}
|
||||
|
||||
format * smt2_pp_environment::pp_datalog_literal(app * t) {
|
||||
uint64 v;
|
||||
uint64_t v;
|
||||
VERIFY (get_dlutil().is_numeral(t, v));
|
||||
std::ostringstream buffer;
|
||||
buffer << v;
|
||||
|
|
|
@ -384,7 +384,7 @@ public:
|
|||
|
||||
app * mk_numeral(rational const & val, sort* s) const;
|
||||
app * mk_numeral(rational const & val, unsigned bv_size) const;
|
||||
app * mk_numeral(uint64 u, unsigned bv_size) const { return mk_numeral(rational(u, rational::ui64()), bv_size); }
|
||||
app * mk_numeral(uint64_t u, unsigned bv_size) const { return mk_numeral(rational(u, rational::ui64()), bv_size); }
|
||||
sort * mk_sort(unsigned bv_size);
|
||||
|
||||
unsigned get_bv_size(sort const * s) const {
|
||||
|
|
|
@ -652,9 +652,9 @@ namespace datalog {
|
|||
|
||||
// create a constant belonging to a given finite domain.
|
||||
|
||||
app* dl_decl_util::mk_numeral(uint64 value, sort* s) {
|
||||
app* dl_decl_util::mk_numeral(uint64_t value, sort* s) {
|
||||
if (is_finite_sort(s)) {
|
||||
uint64 sz = 0;
|
||||
uint64_t sz = 0;
|
||||
if (try_get_size(s, sz) && sz <= value) {
|
||||
m.raise_exception("value is out of bounds");
|
||||
}
|
||||
|
@ -680,7 +680,7 @@ namespace datalog {
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
bool dl_decl_util::is_numeral(const expr* e, uint64& v) const {
|
||||
bool dl_decl_util::is_numeral(const expr* e, uint64_t& v) const {
|
||||
if (is_numeral(e)) {
|
||||
const app* c = to_app(e);
|
||||
SASSERT(c->get_decl()->get_num_parameters() == 2);
|
||||
|
@ -693,7 +693,7 @@ namespace datalog {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool dl_decl_util::is_numeral_ext(expr* e, uint64& v) const {
|
||||
bool dl_decl_util::is_numeral_ext(expr* e, uint64_t& v) const {
|
||||
if (is_numeral(e, v)) {
|
||||
return true;
|
||||
}
|
||||
|
@ -724,7 +724,7 @@ namespace datalog {
|
|||
return m.is_true(c) || m.is_false(c);
|
||||
}
|
||||
|
||||
sort* dl_decl_util::mk_sort(const symbol& name, uint64 domain_size) {
|
||||
sort* dl_decl_util::mk_sort(const symbol& name, uint64_t domain_size) {
|
||||
if (domain_size == 0) {
|
||||
std::stringstream sstm;
|
||||
sstm << "Domain size of sort '" << name << "' may not be 0";
|
||||
|
@ -734,7 +734,7 @@ namespace datalog {
|
|||
return m.mk_sort(m_fid, DL_FINITE_SORT, 2, params);
|
||||
}
|
||||
|
||||
bool dl_decl_util::try_get_size(const sort * s, uint64& size) const {
|
||||
bool dl_decl_util::try_get_size(const sort * s, uint64_t& size) const {
|
||||
sort_size sz = s->get_info()->get_num_elements();
|
||||
if (sz.is_finite()) {
|
||||
size = sz.size();
|
||||
|
|
|
@ -122,7 +122,7 @@ namespace datalog {
|
|||
// Contract for func_decl:
|
||||
// parameters[0] - array sort
|
||||
// Contract for OP_DL_CONSTANT:
|
||||
// parameters[0] - rational containing uint64 with constant value
|
||||
// parameters[0] - rational containing uint64_t with constant value
|
||||
// parameters[1] - a DL_FINITE_SORT sort of the constant
|
||||
// Contract for others:
|
||||
// no parameters
|
||||
|
@ -166,7 +166,7 @@ namespace datalog {
|
|||
dl_decl_util(ast_manager& m);
|
||||
// create a constant belonging to a given finite domain.
|
||||
// the options include the DL_FINITE_SORT, BV_SORT, and BOOL_SORT
|
||||
app* mk_numeral(uint64 value, sort* s);
|
||||
app* mk_numeral(uint64_t value, sort* s);
|
||||
|
||||
app* mk_lt(expr* a, expr* b);
|
||||
|
||||
|
@ -176,19 +176,19 @@ namespace datalog {
|
|||
|
||||
bool is_numeral(const expr* c) const { return is_app_of(c, m_fid, OP_DL_CONSTANT); }
|
||||
|
||||
bool is_numeral(const expr* e, uint64& v) const;
|
||||
bool is_numeral(const expr* e, uint64_t& v) const;
|
||||
|
||||
//
|
||||
// Utilities for extracting constants
|
||||
// from bit-vectors and finite domains.
|
||||
//
|
||||
bool is_numeral_ext(expr* c, uint64& v) const;
|
||||
bool is_numeral_ext(expr* c, uint64_t& v) const;
|
||||
|
||||
bool is_numeral_ext(expr* c) const;
|
||||
|
||||
sort* mk_sort(const symbol& name, uint64 domain_size);
|
||||
sort* mk_sort(const symbol& name, uint64_t domain_size);
|
||||
|
||||
bool try_get_size(const sort *, uint64& size) const;
|
||||
bool try_get_size(const sort *, uint64_t& size) const;
|
||||
|
||||
bool is_finite_sort(sort* s) const {
|
||||
return is_sort_of(s, m_fid, DL_FINITE_SORT);
|
||||
|
|
|
@ -1071,7 +1071,7 @@ void fpa2bv_converter::mk_rem(sort * s, expr_ref & x, expr_ref & y, expr_ref & r
|
|||
SASSERT(m_mpz_manager.is_int64(max_exp_diff));
|
||||
SASSERT(m_mpz_manager.get_uint64(max_exp_diff) <= UINT_MAX);
|
||||
|
||||
uint64 max_exp_diff_ui64 = m_mpz_manager.get_uint64(max_exp_diff);
|
||||
uint64_t max_exp_diff_ui64 = m_mpz_manager.get_uint64(max_exp_diff);
|
||||
SASSERT(max_exp_diff_ui64 <= UINT_MAX);
|
||||
unsigned max_exp_diff_ui = (unsigned)max_exp_diff_ui64;
|
||||
m_mpz_manager.del(max_exp_diff);
|
||||
|
|
|
@ -680,8 +680,8 @@ br_status bv_rewriter::mk_extract(unsigned high, unsigned low, expr * arg, expr_
|
|||
if (v.is_neg())
|
||||
mod(v, rational::power_of_two(sz), v);
|
||||
if (v.is_uint64()) {
|
||||
uint64 u = v.get_uint64();
|
||||
uint64 e = shift_right(u, low) & (shift_left(1ull, sz) - 1ull);
|
||||
uint64_t u = v.get_uint64();
|
||||
uint64_t e = shift_right(u, low) & (shift_left(1ull, sz) - 1ull);
|
||||
result = mk_numeral(numeral(e, numeral::ui64()), sz);
|
||||
return BR_DONE;
|
||||
}
|
||||
|
@ -811,7 +811,7 @@ br_status bv_rewriter::mk_bv_shl(expr * arg1, expr * arg2, expr_ref & result) {
|
|||
SASSERT(r1.is_uint64() && r2.is_uint64());
|
||||
SASSERT(r2.get_uint64() < bv_size);
|
||||
|
||||
uint64 r = shift_left(r1.get_uint64(), r2.get_uint64());
|
||||
uint64_t r = shift_left(r1.get_uint64(), r2.get_uint64());
|
||||
numeral rn(r, numeral::ui64());
|
||||
rn = m_util.norm(rn, bv_size);
|
||||
result = mk_numeral(rn, bv_size);
|
||||
|
@ -860,7 +860,7 @@ br_status bv_rewriter::mk_bv_lshr(expr * arg1, expr * arg2, expr_ref & result) {
|
|||
if (bv_size <= 64) {
|
||||
SASSERT(r1.is_uint64());
|
||||
SASSERT(r2.is_uint64());
|
||||
uint64 r = shift_right(r1.get_uint64(), r2.get_uint64());
|
||||
uint64_t r = shift_right(r1.get_uint64(), r2.get_uint64());
|
||||
numeral rn(r, numeral::ui64());
|
||||
rn = m_util.norm(rn, bv_size);
|
||||
result = mk_numeral(rn, bv_size);
|
||||
|
@ -902,11 +902,11 @@ br_status bv_rewriter::mk_bv_ashr(expr * arg1, expr * arg2, expr_ref & result) {
|
|||
bool is_num1 = is_numeral(arg1, r1, bv_size);
|
||||
|
||||
if (bv_size <= 64 && is_num1 && is_num2) {
|
||||
uint64 n1 = r1.get_uint64();
|
||||
uint64 n2_orig = r2.get_uint64();
|
||||
uint64 n2 = n2_orig % bv_size;
|
||||
uint64_t n1 = r1.get_uint64();
|
||||
uint64_t n2_orig = r2.get_uint64();
|
||||
uint64_t n2 = n2_orig % bv_size;
|
||||
SASSERT(n2 < bv_size);
|
||||
uint64 r = shift_right(n1, n2);
|
||||
uint64_t r = shift_right(n1, n2);
|
||||
bool sign = (n1 & shift_left(1ull, bv_size - 1ull)) != 0;
|
||||
if (n2_orig > n2) {
|
||||
if (sign) {
|
||||
|
@ -917,9 +917,9 @@ br_status bv_rewriter::mk_bv_ashr(expr * arg1, expr * arg2, expr_ref & result) {
|
|||
}
|
||||
}
|
||||
else if (sign) {
|
||||
uint64 allone = shift_left(1ull, bv_size) - 1ull;
|
||||
uint64 mask = ~(shift_left(1ull, bv_size - n2) - 1ull);
|
||||
mask &= allone;
|
||||
uint64_t allone = shift_left(1ull, bv_size) - 1ull;
|
||||
uint64_t mask = ~(shift_left(1ull, bv_size - n2) - 1ull);
|
||||
mask &= allone;
|
||||
r |= mask;
|
||||
}
|
||||
result = mk_numeral(numeral(r, numeral::ui64()), bv_size);
|
||||
|
@ -2021,7 +2021,7 @@ br_status bv_rewriter::mk_bv_ext_rotate_left(expr * arg1, expr * arg2, expr_ref
|
|||
numeral r2;
|
||||
unsigned bv_size;
|
||||
if (is_numeral(arg2, r2, bv_size)) {
|
||||
unsigned shift = static_cast<unsigned>((r2 % numeral(bv_size)).get_uint64() % static_cast<uint64>(bv_size));
|
||||
unsigned shift = static_cast<unsigned>((r2 % numeral(bv_size)).get_uint64() % static_cast<uint64_t>(bv_size));
|
||||
return mk_bv_rotate_left(shift, arg1, result);
|
||||
}
|
||||
return BR_FAILED;
|
||||
|
@ -2031,7 +2031,7 @@ br_status bv_rewriter::mk_bv_ext_rotate_right(expr * arg1, expr * arg2, expr_ref
|
|||
numeral r2;
|
||||
unsigned bv_size;
|
||||
if (is_numeral(arg2, r2, bv_size)) {
|
||||
unsigned shift = static_cast<unsigned>((r2 % numeral(bv_size)).get_uint64() % static_cast<uint64>(bv_size));
|
||||
unsigned shift = static_cast<unsigned>((r2 % numeral(bv_size)).get_uint64() % static_cast<uint64_t>(bv_size));
|
||||
return mk_bv_rotate_right(shift, arg1, result);
|
||||
}
|
||||
return BR_FAILED;
|
||||
|
|
|
@ -22,7 +22,7 @@ Revision History:
|
|||
br_status dl_rewriter::mk_app_core(
|
||||
func_decl * f, unsigned num_args, expr* const* args, expr_ref& result) {
|
||||
ast_manager& m = result.get_manager();
|
||||
uint64 v1, v2;
|
||||
uint64_t v1, v2;
|
||||
switch(f->get_decl_kind()) {
|
||||
case datalog::OP_DL_LT:
|
||||
if (m_util.is_numeral_ext(args[0], v1) &&
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue