3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-13 12:28:44 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2020-02-19 09:52:09 -08:00
parent a4d81b2847
commit ff436ecb10
3 changed files with 20 additions and 9 deletions

View file

@ -433,8 +433,10 @@ namespace qe {
s.m_solver.vars(l, vs);
TRACE("qe", s.m_solver.display(tout << vs << " ", l) << "\n";);
for (unsigned v : vs) {
level.merge(s.m_rvar2level.get(v, max_level()));
level.merge(s.m_rvar2level.get(v, max_level()));
}
if (level == max_level())
throw default_exception("level not in NRA");
set_level(l.var(), level);
return level;
}

View file

@ -372,7 +372,7 @@ namespace sat {
literal r = m_roots[i].second;
literal rr = to_root[r.var()];
to_root[v] = r.sign() ? ~rr : rr;
if (rr != r) std::cout << v << " -> " << to_root[v] << "\n";
// if (rr != r) std::cout << v << " -> " << to_root[v] << "\n";
}
for (unsigned i = 0; i < m_aig.size(); ++i) {
// invalidate nodes that have been rooted
@ -439,23 +439,31 @@ namespace sat {
bool aig_cuts::eq(node const& a, node const& b) {
if (a.is_valid() != b.is_valid()) return false;
if (!a.is_valid()) return true;
if (a.op() != b.op() || a.sign() != b.sign() || a.size() != b.size()) return false;
for (unsigned i = 0; i < a.size(); ++i) {
if (m_literals[a.offset() + i] != m_literals[b.offset() + i]) return false;
if (a.op() != b.op() || a.sign() != b.sign() || a.size() != b.size())
return false;
for (unsigned i = a.size(); i-- > 0; ) {
if (m_literals[a.offset() + i] != m_literals[b.offset() + i])
return false;
}
return true;
}
bool aig_cuts::similar(node const& a, node const& b) {
bool sim = true;
sim = a.is_lut() && !b.is_lut() && a.size() == b.size();
for (unsigned i = a.size(); sim && i-- > 0; ) {
sim = m_literals[a.offset() + i].var() == m_literals[b.offset() + i].var();
}
return sim;
}
bool aig_cuts::insert_aux(unsigned v, node const& n) {
if (!m_config.m_full) return false;
unsigned num_gt = 0, num_eq = 0;
for (node const& n2 : m_aig[v]) {
if (eq(n, n2)) return false;
if (eq(n, n2) || similar(n, n2)) return false;
else if (n.size() < n2.size()) num_gt++;
else if (n.size() == n2.size()) num_eq++;
// avoid inserting LUTs that are likely to collide
if (n.is_lut() && !n2.is_lut() && n.size() == n2.size())
return false;
}
if (m_aig[v].size() < m_config.m_max_aux) {
on_node_add(v, n);

View file

@ -124,6 +124,7 @@ namespace sat {
void init_cut_set(unsigned id);
bool eq(node const& a, node const& b);
bool similar(node const& a, node const& b);
unsigned_vector filter_valid_nodes() const;
void augment(unsigned_vector const& ids);