ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
deduce.c File Reference
#include "deduce.h"
#include "inline.h"
#include "promote.h"
#include "strengthen.h"
Include dependency graph for deduce.c:

Go to the source code of this file.

Functions

bool kissat_recompute_and_promote (kissat *solver, clause *c)
 
clausekissat_deduce_first_uip_clause (kissat *solver, clause *conflict)
 

Function Documentation

◆ kissat_deduce_first_uip_clause()

clause * kissat_deduce_first_uip_clause ( kissat * solver,
clause * conflict )

Definition at line 72 of file deduce.c.

72 {
73 START (deduce);
74 KISSAT_assert (EMPTY_STACK (solver->analyzed));
77#if defined(LOGGING) || !defined(KISSAT_NDEBUG)
78 CLEAR_STACK (solver->resolvent);
79#endif
80 if (conflict->size > 2)
81 mark_clause_as_used (solver, conflict);
82 PUSH_STACK (solver->clause, INVALID_LIT);
83 solver->antecedent_size = 0;
84 solver->resolvent_size = 0;
85 unsigned unresolved_on_current_level = 0, conflict_size = 0;
86 assigned *all_assigned = solver->assigned;
87 frame *frames = BEGIN_STACK (solver->frames);
88 for (all_literals_in_clause (lit, conflict)) {
89 KISSAT_assert (VALUE (lit) < 0);
90 if (LEVEL (lit))
91 conflict_size++;
92 if (analyze_literal (solver, all_assigned, frames, lit))
93 unresolved_on_current_level++;
94 }
95 KISSAT_assert (unresolved_on_current_level > 1);
96 LOG ("starting with %u unresolved literals on current decision level",
97 unresolved_on_current_level);
98 KISSAT_assert (solver->antecedent_size == solver->resolvent_size);
99 LOGRES2 ("initial");
100 const bool otfs = GET_OPTION (otfs);
101 unsigned const *t = END_ARRAY (solver->trail);
102 unsigned uip = INVALID_LIT;
103 unsigned resolved = 0;
104 assigned *a = 0;
105 for (;;) {
106 do {
107 KISSAT_assert (t > BEGIN_ARRAY (solver->trail));
108 uip = *--t;
109 a = ASSIGNED (uip);
110 } while (!a->analyzed || a->level != solver->level);
111 if (unresolved_on_current_level == 1)
112 break;
114 KISSAT_assert (a->level == solver->level);
115 solver->antecedent_size = 1;
116 resolved++;
117 if (a->binary) {
118 const unsigned other = a->reason;
119 LOGBINARY (uip, other, "resolving %s reason", LOGLIT (uip));
120 if (analyze_literal (solver, all_assigned, frames, other))
121 unresolved_on_current_level++;
122 } else {
123 const reference ref = a->reason;
124 LOGREF (ref, "resolving %s reason", LOGLIT (uip));
125 clause *reason = kissat_dereference_clause (solver, ref);
126 for (all_literals_in_clause (lit, reason))
127 if (lit != uip &&
128 analyze_literal (solver, all_assigned, frames, lit))
129 unresolved_on_current_level++;
130 mark_clause_as_used (solver, reason);
131 }
132 KISSAT_assert (unresolved_on_current_level > 0);
133 unresolved_on_current_level--;
134 LOG ("after resolving %s there are %u literals left "
135 "on current decision level",
136 LOGLIT (uip), unresolved_on_current_level);
137 KISSAT_assert (solver->resolvent_size > 0);
138 solver->resolvent_size--;
139#if defined(LOGGING) || !defined(KISSAT_NDEBUG)
140 LOG2 ("actual antecedent size %u", solver->antecedent_size);
141 REMOVE_STACK (unsigned, solver->resolvent, NOT (uip));
142 KISSAT_assert (SIZE_STACK (solver->resolvent) == solver->resolvent_size);
143 LOGRES2 ("new");
144#endif
145 if (otfs && solver->antecedent_size > 2 &&
146 solver->resolvent_size < solver->antecedent_size) {
147 KISSAT_assert (!a->binary);
148 KISSAT_assert (solver->antecedent_size && solver->resolvent_size + 1);
149 clause *reason = kissat_dereference_clause (solver, a->reason);
150 KISSAT_assert (!reason->garbage);
151 clause *res = kissat_on_the_fly_strengthen (solver, reason, uip);
152 if (resolved == 1 && solver->resolvent_size < conflict_size) {
153 KISSAT_assert (!conflict->garbage);
154 KISSAT_assert (conflict_size > 2);
155 kissat_on_the_fly_subsume (solver, res, conflict);
156 }
157 STOP (deduce);
158 return res;
159 }
160 }
161 KISSAT_assert (uip != INVALID_LIT);
162 LOG ("first unique implication point %s (1st UIP)", LOGLIT (uip));
163 KISSAT_assert (PEEK_STACK (solver->clause, 0) == INVALID_LIT);
164 POKE_STACK (solver->clause, 0, NOT (uip));
165 LOGTMP ("deduced not yet minimized 1st UIP");
166 if (!solver->probing)
167 ADD (literals_deduced, SIZE_STACK (solver->clause));
168 STOP (deduce);
169 return 0;
170}
#define BEGIN_ARRAY
Definition array.h:50
#define END_ARRAY
Definition array.h:51
#define DECISION_REASON
Definition assign.h:9
#define ASSIGNED(LIT)
Definition assign.h:31
#define LEVEL(LIT)
Definition assign.h:34
#define BEGIN_STACK(S)
Definition stack.h:46
#define REMOVE_STACK(T, S, E)
Definition stack.h:77
#define POKE_STACK(S, N, E)
Definition stack.h:32
#define SIZE_STACK(S)
Definition stack.h:19
#define EMPTY_STACK(S)
Definition stack.h:18
#define CLEAR_STACK(S)
Definition stack.h:50
#define PUSH_STACK(S, E)
Definition stack.h:39
#define PEEK_STACK(S, N)
Definition stack.h:29
#define INVALID_LIT
#define ADD(NAME, DELTA)
#define LOG(...)
#define all_literals_in_clause(LIT, C)
Definition clause.h:47
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define LOGREF(...)
Definition logging.h:433
#define LOGBINARY(...)
Definition logging.h:442
#define LOG2(...)
Definition logging.h:352
#define LOGTMP(...)
Definition logging.h:463
#define LOGRES2(...)
Definition logging.h:367
#define LOGLIT(...)
Definition logging.hpp:99
unsigned short ref
Definition giaNewBdd.h:38
#define GET_OPTION(N)
Definition options.h:295
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
ABC_NAMESPACE_HEADER_START typedef unsigned reference
Definition reference.h:9
int lit
Definition satVec.h:130
#define NOT(LIT)
Definition literal.h:33
void kissat_on_the_fly_subsume(kissat *solver, clause *c, clause *d)
Definition strengthen.c:158
clause * kissat_on_the_fly_strengthen(kissat *solver, clause *c, unsigned lit)
Definition strengthen.c:144
bool binary
Definition assign.h:23
bool analyzed
Definition assign.h:22
unsigned reason
Definition assign.h:28
unsigned level
Definition assign.h:19
unsigned size
Definition clause.h:37
bool garbage
Definition clause.h:25
Definition frames.h:15
#define VALUE(LIT)
Definition value.h:10
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kissat_recompute_and_promote()

bool kissat_recompute_and_promote ( kissat * solver,
clause * c )

Definition at line 31 of file deduce.c.

31 {
33 const unsigned old_glue = c->glue;
34 const unsigned new_glue = kissat_recompute_glue (solver, c, old_glue);
35 if (new_glue >= old_glue)
36 return false;
37 kissat_promote_clause (solver, c, new_glue);
38 return true;
39}
ABC_NAMESPACE_IMPL_START void kissat_promote_clause(kissat *solver, clause *c, unsigned new_glue)
Definition promote.c:7
unsigned glue
Definition clause.h:23
bool redundant
Definition clause.h:28
Here is the call graph for this function: