28 for (
const auto &
lit : *c) {
31 const signed char tmp =
val (
lit);
47 if (second == INT_MIN)
52 LOG (c,
"found binary");
54 LOG (c,
"found actual binary %d %d", first, second);
67 for (
const auto &
lit : *c) {
70 const signed char tmp =
val (
lit);
85 if (second == INT_MIN)
97 if (
occs (first).size () >
occs (second).size ()) {
101 for (
auto c :
occs (best))
119 if (!eliminator.
gates.empty ())
126 for (
const auto &c : os) {
133 const int tmp =
marked (second);
137 LOG (
"found binary resolved unit %d", first);
141 for (
auto &
lit : *d) {
142 if (
lit == first ||
lit == -second)
154 for (
auto &
lit : *c) {
155 if (
lit == first ||
lit == second)
178 LOG (c,
"duplicated actual binary clause");
183 eliminator.
marked.push_back (second);
185 LOG (
"marked second literal %d in binary clause %d %d", second, first,
194 for (
const auto &
lit : eliminator.
marked)
196 eliminator.
marked.clear ();
206 if (!
opts.elimequivs)
215 if (!eliminator.
gates.empty ())
222 for (
const auto &c :
occs (-pivot)) {
231 const int tmp =
marked (second);
233 LOG (
"found binary resolved unit %d", second);
239 for (
auto &
lit : *d) {
240 if (
lit == pivot ||
lit == second)
252 for (
auto &
lit : *c) {
253 if (
lit == -pivot ||
lit == second)
281 LOG (
"found equivalence %d = %d", pivot, -second);
285 LOG (c,
"first gate clause");
288 eliminator.
gates.push_back (c);
292 for (
const auto &e : ps) {
297 if (other == -second) {
304 LOG (d,
"second gate clause");
307 eliminator.
gates.push_back (d);
334 if (!eliminator.
gates.empty ())
341 for (
const auto &c :
occs (-pivot)) {
348 bool all_literals_marked =
true;
352 for (
const auto &
lit : *c) {
356 signed char tmp =
val (
lit);
368 all_literals_marked =
false;
372 if (!all_literals_marked)
376 LOG (c,
"satisfied by %d candidate base clause",
satisfied);
383 Logger::print_log_prefix (
this);
385 printf (
"found arity %u AND gate %d = ", arity, -pivot);
387 for (
const auto &
lit : *c) {
392 fputs (
" & ", stdout);
396 fputc (
'\n', stdout);
408 eliminator.
gates.push_back (c);
409 for (
const auto &
lit : *c) {
413 signed char tmp =
val (
lit);
422 for (
const auto &d :
occs (pivot)) {
429 const int tmp =
marked (other);
432 LOG (d,
"AND gate binary side clause");
435 eliminator.
gates.push_back (d);
459 for (
const auto &
lit : *d) {
480 for (
const auto &
lit : *d) {
491 if (
occs (b).size () >
occs (c).size ())
493 if (
occs (a).size () >
occs (b).size ())
495 for (
auto d :
occs (a))
516 if (!eliminator.
gates.empty ())
520 const auto end = os.end ();
521 for (
auto i = os.begin (); i != end; i++) {
531 for (
auto j = i + 1; j != end; j++) {
541 if (abs (bi) == abs (cj))
543 if (abs (ci) == abs (cj))
553 LOG (di,
"1st if-then-else");
554 LOG (dj,
"2nd if-then-else");
555 LOG (d1,
"3rd if-then-else");
556 LOG (d2,
"4th if-then-else");
557 LOG (
"found ITE gate %d == (%d ? %d : %d)", pivot, -bi, -ci, -cj);
566 eliminator.
gates.push_back (di);
567 eliminator.
gates.push_back (dj);
568 eliminator.
gates.push_back (d1);
569 eliminator.
gates.push_back (d2);
586 for (
const auto &
lit : *c) {
603 int size =
lits.size ();
607 for (
const auto &
lit : *c) {
612 const auto it = find (
lits.begin (),
lits.end (),
lit);
613 if (it ==
lits.end ())
618 return found == size;
626 if (best && l >= len)
630 for (
auto c :
occs (best))
647 if (!eliminator.
gates.empty ())
652 for (
auto d :
occs (pivot)) {
657 const int size =
lits.size ();
658 const int arity = size - 1;
662 if (arity >
opts.elimxorlim)
667 unsigned needed = (1u << arity) - 1;
671 const unsigned prev = signs;
674 for (
int j = 0; j < size; j++) {
675 const unsigned bit = 1u << j;
677 if ((prev & bit) != (signs & bit))
683 eliminator.
gates.push_back (e);
687 eliminator.
gates.clear ();
691 eliminator.
gates.push_back (d);
696 Logger::print_log_prefix (
this);
698 printf (
"found arity %u XOR gate %d = ", arity, -pivot);
700 for (
const auto &
lit : *d) {
705 fputs (
" ^ ", stdout);
709 fputc (
'\n', stdout);
716 const auto end = eliminator.
gates.end ();
717 auto j = eliminator.
gates.begin ();
718 for (
auto i = j; i != end; i++) {
723 LOG (e,
"contributing");
726 eliminator.
gates.resize (j - eliminator.
gates.begin ());
759 LOG (
"unmarking %zd gate clauses", eliminator.
gates.
size ());
760 for (
const auto &c : eliminator.
gates) {
764 eliminator.
gates.clear ();
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define CADICAL_assert(ignore)
bool get_clause(Clause *, vector< int > &)
Clause * find_binary_clause(int, int)
void mark_garbage(Clause *)
vector< int64_t > lrat_chain
int second_literal_in_binary_clause(Eliminator &, Clause *, int first)
bool get_ternary_clause(Clause *, int &, int &, int &)
void find_if_then_else(Eliminator &, int pivot)
void find_equivalence(Eliminator &, int pivot)
void find_gate_clauses(Eliminator &, int pivot)
bool is_clause(Clause *, const vector< int > &)
void assign_unit(int lit)
void find_and_gate(Eliminator &, int pivot)
Clause * find_clause(const vector< int > &)
signed char val(int lit) const
signed char marked(int lit) const
int64_t unit_id(int lit) const
void unmark_gate_clauses(Eliminator &)
void unmark_binary_literals(Eliminator &)
void find_xor_gate(Eliminator &, int pivot)
void elim_update_removed_clause(Eliminator &, Clause *, int except=0)
vector< signed char > marks
void mark_binary_literals(Eliminator &, int pivot)
void clear_analyzed_literals()
bool match_ternary_clause(Clause *, int, int, int)
Clause * find_ternary_clause(int, int, int)
int second_literal_in_binary_clause_lrat(Clause *, int first)
void elim_propagate(Eliminator &, int unit)
void find_definition(Eliminator &, int)