3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-11 13:40:52 +00:00

make cutset maintainance incremental, expose option for goal2sat to populate aig

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2020-01-08 16:39:49 -08:00
parent 301f9598a4
commit ca243428f8
7 changed files with 188 additions and 156 deletions

View file

@ -35,6 +35,7 @@ Notes:
#include "ast/for_each_expr.h"
#include "sat/tactic/goal2sat.h"
#include "sat/ba_solver.h"
#include "sat/sat_aig_simplifier.h"
#include "model/model_evaluator.h"
#include "model/model_v2_pp.h"
#include "tactic/tactic.h"
@ -53,6 +54,7 @@ struct goal2sat::imp {
ast_manager & m;
pb_util pb;
sat::ba_solver* m_ext;
sat::aig_simplifier* m_aig;
svector<frame> m_frame_stack;
svector<sat::literal> m_result_stack;
obj_map<app, sat::literal> m_cache;
@ -73,6 +75,7 @@ struct goal2sat::imp {
m(_m),
pb(m),
m_ext(nullptr),
m_aig(nullptr),
m_solver(s),
m_map(map),
m_dep2asm(dep2asm),
@ -82,6 +85,7 @@ struct goal2sat::imp {
m_is_lemma(false) {
updt_params(p);
m_true = sat::null_literal;
m_aig = s.get_aig_simplifier();
}
void updt_params(params_ref const & p) {
@ -252,6 +256,9 @@ struct goal2sat::imp {
sat::literal l(k, false);
m_cache.insert(t, l);
sat::literal * lits = m_result_stack.end() - num;
if (m_aig) m_aig->add_or(l, num, lits);
for (unsigned i = 0; i < num; i++) {
mk_clause(~lits[i], l);
}
@ -290,8 +297,11 @@ struct goal2sat::imp {
sat::bool_var k = m_solver.add_var(false);
sat::literal l(k, false);
m_cache.insert(t, l);
// l => /\ lits
sat::literal * lits = m_result_stack.end() - num;
if (m_aig) m_aig->add_and(l, num, lits);
// l => /\ lits
for (unsigned i = 0; i < num; i++) {
mk_clause(~l, lits[i]);
}
@ -341,6 +351,7 @@ struct goal2sat::imp {
mk_clause(~t, ~e, l, false);
mk_clause(t, e, ~l, false);
}
if (m_aig) m_aig->add_ite(l, c, t, e);
m_result_stack.shrink(sz-3);
if (sign)
l.neg();
@ -374,6 +385,7 @@ struct goal2sat::imp {
mk_clause(~l, ~l1, l2);
mk_clause(l, l1, l2);
mk_clause(l, ~l1, ~l2);
if (m_aig) m_aig->add_iff(l, l1, l2);
m_result_stack.shrink(sz-2);
if (sign)
l.neg();
@ -400,6 +412,7 @@ struct goal2sat::imp {
}
ensure_extension();
m_ext->add_xr(lits);
if (m_aig) m_aig->add_xor(~lits.back(), lits.size() - 1, lits.c_ptr() + 1);
sat::literal lit(v, sign);
if (root) {
m_result_stack.reset();
@ -634,7 +647,7 @@ struct goal2sat::imp {
m_ext = alloc(sat::ba_solver);
m_solver.set_extension(m_ext);
}
}
}
}
void convert(app * t, bool root, bool sign) {