3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 01:25:31 +00:00

enable incremental bit-vector solving

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2015-09-01 09:48:35 -07:00
parent 0ed38ed59b
commit cc5d719d9e
15 changed files with 208 additions and 55 deletions

View file

@ -73,5 +73,22 @@ void expr2var::reset() {
dec_ref_map_keys(m(), m_mapping);
SASSERT(m_mapping.empty());
m_recent_exprs.reset();
m_recent_lim.reset();
m_interpreted_vars = false;
}
void expr2var::push() {
m_recent_lim.push_back(m_recent_exprs.size());
}
void expr2var::pop(unsigned num_scopes) {
if (num_scopes > 0) {
unsigned sz = m_recent_lim[m_recent_lim.size() - num_scopes];
for (unsigned i = sz; i < m_recent_exprs.size(); ++i) {
m_mapping.erase(m_recent_exprs[i]);
m().dec_ref(m_recent_exprs[i]);
}
m_recent_exprs.shrink(sz);
m_recent_lim.shrink(m_recent_lim.size() - num_scopes);
}
}

View file

@ -39,6 +39,7 @@ protected:
ast_manager & m_manager;
expr2var_mapping m_mapping;
ptr_vector<expr> m_recent_exprs;
unsigned_vector m_recent_lim;
bool m_interpreted_vars;
public:
expr2var(ast_manager & m);
@ -62,7 +63,7 @@ public:
iterator begin() const { return m_mapping.begin(); }
iterator end() const { return m_mapping.end(); }
void reset_recent() { m_recent_exprs.reset(); }
void reset_recent() { SASSERT(m_recent_lim.empty()); m_recent_exprs.reset(); }
// Iterators for traversing the recently registered expressions.
// The set of recent registered expressions is reset by using reset_recent().
@ -70,6 +71,9 @@ public:
recent_iterator end_recent() const { return m_recent_exprs.end(); }
void reset();
void push();
void pop(unsigned num_scopes);
};
#endif

View file

@ -92,6 +92,9 @@ struct blaster_rewriter_cfg : public default_rewriter_cfg {
expr_ref_vector m_out;
obj_map<func_decl, expr*> m_const2bits;
expr_ref_vector m_bindings;
func_decl_ref_vector m_keys;
expr_ref_vector m_values;
unsigned_vector m_keyval_lim;
bool m_blast_mul;
bool m_blast_add;
@ -116,12 +119,13 @@ struct blaster_rewriter_cfg : public default_rewriter_cfg {
m_in1(m),
m_in2(m),
m_out(m),
m_bindings(m) {
m_bindings(m),
m_keys(m),
m_values(m) {
updt_params(p);
}
~blaster_rewriter_cfg() {
dec_ref_map_key_values(m_manager, m_const2bits);
}
void updt_params(params_ref const & p) {
@ -157,6 +161,24 @@ struct blaster_rewriter_cfg : public default_rewriter_cfg {
}
}
void push() {
m_keyval_lim.push_back(m_keys.size());
}
void pop(unsigned num_scopes) {
if (num_scopes > 0) {
unsigned new_sz = m_keyval_lim.size() - num_scopes;
unsigned lim = m_keyval_lim[new_sz];
for (unsigned i = m_keys.size(); i > lim; ) {
--i;
m_const2bits.remove(m_keys[i].get());
}
m_keys.resize(lim);
m_values.resize(lim);
m_keyval_lim.resize(new_sz);
}
}
template<typename V>
app * mk_mkbv(V const & bits) {
return m().mk_app(butil().get_family_id(), OP_MKBV, bits.size(), bits.c_ptr());
@ -180,8 +202,8 @@ struct blaster_rewriter_cfg : public default_rewriter_cfg {
}
r = mk_mkbv(m_out);
m_const2bits.insert(f, r);
m_manager.inc_ref(f);
m_manager.inc_ref(r);
m_keys.push_back(f);
m_values.push_back(r);
result = r;
}
@ -611,6 +633,8 @@ struct bit_blaster_rewriter::imp : public rewriter_tpl<blaster_rewriter_cfg> {
m_cfg(m, m_blaster, p) {
SASSERT(m_blaster.butil().get_family_id() == m.get_family_id("bv"));
}
void push() { m_cfg.push(); }
void pop(unsigned s) { m_cfg.pop(s); }
};
bit_blaster_rewriter::bit_blaster_rewriter(ast_manager & m, params_ref const & p):
@ -630,6 +654,14 @@ void bit_blaster_rewriter::set_cancel(bool f) {
m_imp->m_blaster.set_cancel(f);
}
void bit_blaster_rewriter::push() {
m_imp->push();
}
void bit_blaster_rewriter::pop(unsigned num_scopes) {
m_imp->pop(num_scopes);
}
ast_manager & bit_blaster_rewriter::m() const {
return m_imp->m();
}

View file

@ -36,6 +36,8 @@ public:
void cleanup();
obj_map<func_decl, expr*> const& const2bits() const;
void operator()(expr * e, expr_ref & result, proof_ref & result_proof);
void push();
void pop(unsigned num_scopes);
};
#endif