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:
parent
0ed38ed59b
commit
cc5d719d9e
15 changed files with 208 additions and 55 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue