ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
definition.c
Go to the documentation of this file.
1#include "definition.h"
2#include "allocate.h"
3#include "gates.h"
4#include "inline.h"
5#include "kitten.h"
6#include "print.h"
7
9
11
17
18static void traverse_definition_core (void *state, unsigned id) {
19 definition_extractor *extractor = (definition_extractor*)state;
20 kissat *solver = extractor->solver;
22 watches *watches0 = extractor->watches[0];
23 watches *watches1 = extractor->watches[1];
24 const size_t size_watches0 = SIZE_WATCHES (*watches0);
25 KISSAT_assert (size_watches0 <= UINT_MAX);
26 unsigned sign;
27 if (id < size_watches0) {
28 watch = BEGIN_WATCHES (*watches0)[id];
29 LOGWATCH (extractor->lit, watch, "gate[0]");
30 sign = 0;
31 } else {
32 unsigned tmp = id - size_watches0;
33#ifndef KISSAT_NDEBUG
34 const size_t size_watches1 = SIZE_WATCHES (*watches1);
35 KISSAT_assert (size_watches1 <= UINT_MAX);
36 KISSAT_assert (tmp < size_watches1);
37#endif
38 watch = BEGIN_WATCHES (*watches1)[tmp];
39 LOGWATCH (NOT (extractor->lit), watch, "gate[1]");
40 sign = 1;
41 }
42 PUSH_STACK (solver->gates[sign], watch);
43}
44
45#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS)
46
47typedef struct lemma_extractor lemma_extractor;
48
49struct lemma_extractor {
51 unsigned lemmas;
52 unsigned unit;
53};
54
55static void traverse_one_sided_core_lemma (void *state, bool learned,
56 size_t size,
57 const unsigned *lits) {
58 if (!learned)
59 return;
60 lemma_extractor *extractor = (lemma_extractor*)state;
61 kissat *solver = extractor->solver;
62 const unsigned unit = extractor->unit;
63 unsigneds *added = &solver->added;
64 KISSAT_assert (extractor->lemmas || EMPTY_STACK (*added));
65 if (size) {
66 PUSH_STACK (*added, size + 1);
67 const size_t offset = SIZE_STACK (*added);
68 PUSH_STACK (*added, unit);
69 const unsigned *end = lits + size;
70 for (const unsigned *p = lits; p != end; p++)
71 PUSH_STACK (*added, *p);
72 unsigned *extended = &PEEK_STACK (*added, offset);
73 KISSAT_assert (offset + size + 1 == SIZE_STACK (*added));
74 CHECK_AND_ADD_LITS (size + 1, extended);
75 ADD_LITS_TO_PROOF (size + 1, extended);
76 } else {
78 const unsigned *end = END_STACK (*added);
79 unsigned *begin = BEGIN_STACK (*added);
80 for (unsigned *p = begin, size; p != end; p += size) {
81 size = *p++;
82 KISSAT_assert (p + size <= end);
83 REMOVE_CHECKER_LITS (size, p);
85 }
86 CLEAR_STACK (*added);
87 }
88 extractor->lemmas++;
89}
90
91#endif
92
94 if (!GET_OPTION (definitions))
95 return false;
96 START (definition);
97 struct kitten *kitten = solver->kitten;
100 const unsigned not_lit = NOT (lit);
101 definition_extractor extractor;
102 extractor.lit = lit;
103 extractor.solver = solver;
104 extractor.watches[0] = &WATCHES (lit);
105 extractor.watches[1] = &WATCHES (not_lit);
107 unsigned exported = 0;
108#if !defined(KISSAT_QUIET) || !defined(KISSAT_NDEBUG)
109 size_t occs[2] = {0, 0};
110#endif
111 for (unsigned sign = 0; sign < 2; sign++) {
112 const unsigned except = sign ? not_lit : lit;
113 for (all_binary_large_watches (watch, *extractor.watches[sign])) {
114 if (watch.type.binary) {
115 const unsigned other = watch.binary.lit;
116 kitten_clause_with_id_and_exception (kitten, exported, 1, &other,
118 } else {
119 const reference ref = watch.large.ref;
120 clause *c = kissat_dereference_clause (solver, ref);
122 c->lits, except);
123 }
124#if !defined(KISSAT_QUIET) || !defined(KISSAT_NDEBUG)
125 occs[sign]++;
126#endif
127 exported++;
128 }
129 }
130 bool res = false;
131 LOG ("exported %u = %zu + %zu environment clauses to sub-solver",
132 exported, occs[0], occs[1]);
133 INC (definitions_checked);
134 const size_t limit = GET_OPTION (definitionticks);
136 int status = kitten_solve (kitten);
137 if (status == 20) {
138 LOG ("sub-solver result UNSAT shows definition exists");
139 uint64_t learned;
140 unsigned reduced = kitten_compute_clausal_core (kitten, &learned);
141 LOG ("1st sub-solver core of size %u original clauses out of %u",
142 reduced, exported);
143 for (int i = 2; i <= GET_OPTION (definitioncores); i++) {
146 kitten_set_ticks_limit (kitten, 10 * limit);
147 int tmp = kitten_solve (kitten);
148 KISSAT_assert (!tmp || tmp == 20);
149 if (!tmp) {
150 LOG ("aborting core extraction");
151 goto ABORT;
152 }
153#ifndef KISSAT_NDEBUG
154 unsigned previous = reduced;
155#endif
157 LOG ("%s sub-solver core of size %u original clauses out of %u",
158 FORMAT_ORDINAL (i), reduced, exported);
159 KISSAT_assert (reduced <= previous);
160#if defined(KISSAT_QUIET) && defined(KISSAT_NDEBUG)
161 (void) reduced;
162#endif
163 }
164 INC (definitions_extracted);
165 kitten_traverse_core_ids (kitten, &extractor, traverse_definition_core);
166 size_t size[2];
167 size[0] = SIZE_STACK (solver->gates[0]);
168 size[1] = SIZE_STACK (solver->gates[1]);
169#if !defined(KISSAT_QUIET) || !defined(KISSAT_NDEBUG)
170 KISSAT_assert (reduced == size[0] + size[1]);
171#ifdef METRICS
173 solver,
174 "definition extracted[%" PRIu64 "] "
175 "size %u = %zu + %zu clauses %.0f%% "
176 "of %u = %zu + %zu (checked %" PRIu64 ")",
177 solver->statistics.definitions_extracted, reduced, size[0], size[1],
178 kissat_percent (reduced, exported), exported, occs[0], occs[1],
179 solver->statistics.definitions_checked);
180#else
182 "definition extracted with core "
183 "size %u = %zu + %zu clauses %.0f%% "
184 "of %u = %zu + %zu",
185 reduced, size[0], size[1],
186 kissat_percent (reduced, exported), exported,
187 occs[0], occs[1]);
188#endif
189#endif
190 unsigned unit = INVALID_LIT;
191 if (!size[0]) {
192 unit = not_lit;
193 KISSAT_assert (size[1]);
194 } else if (!size[1])
195 unit = lit;
196
197 if (unit != INVALID_LIT) {
198 INC (definition_units);
199
200 kissat_extremely_verbose (solver, "one sided core "
201 "definition extraction yields "
202 "failed literal");
203#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS)
204 if (false
205#ifndef KISSAT_NDEBUG
206 || GET_OPTION (check) > 1
207#endif
208#ifndef KISSAT_NPROOFS
209 || solver->proof
210#endif
211 ) {
212 lemma_extractor extractor;
213 extractor.solver = solver;
214 extractor.unit = unit;
215 extractor.lemmas = 0;
217 traverse_one_sided_core_lemma);
218 } else
219#endif
221 }
222 solver->gate_eliminated = GATE_ELIMINATED (definitions);
223 solver->resolve_gate = true;
224 res = true;
225 } else {
226 ABORT:
227 LOG ("sub-solver failed to show that definition exists");
228 }
229 CLEAR_STACK (solver->analyzed);
230 STOP (definition);
231 return res;
232}
233
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void kissat_learned_unit(kissat *solver, unsigned lit)
Definition assign.c:18
#define BEGIN_STACK(S)
Definition stack.h:46
#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 END_STACK(S)
Definition stack.h:48
#define INVALID_LIT
#define INC(NAME)
#define LOG(...)
#define CHECK_AND_ADD_LITS(...)
Definition check.h:149
#define REMOVE_CHECKER_LITS(...)
Definition check.h:170
bool kissat_find_definition(kissat *solver, unsigned lit)
Definition definition.c:93
Cube * p
Definition exorList.c:222
#define FORMAT_ORDINAL(WORD)
Definition format.h:35
#define GATE_ELIMINATED(...)
Definition gates.h:20
#define KISSAT_assert(ignore)
Definition global.h:13
#define KISSAT_NPROOFS
Definition global.h:9
#define KISSAT_NDEBUG
Definition global.h:5
typedefABC_NAMESPACE_HEADER_START struct kissat kissat
Definition kissat.h:7
int kitten_solve(kitten *kitten)
Definition kitten.c:1818
void kitten_shrink_to_clausal_core(kitten *kitten)
Definition kitten.c:2022
void kitten_traverse_core_clauses(kitten *kitten, void *state, void(*traverse)(void *, bool, size_t, const unsigned *))
Definition kitten.c:1989
void kitten_traverse_core_ids(kitten *kitten, void *state, void(*traverse)(void *, unsigned))
Definition kitten.c:1964
#define solver
Definition kitten.c:211
void kitten_track_antecedents(kitten *kitten)
Definition kitten.c:680
void kitten_clause_with_id_and_exception(kitten *kitten, unsigned id, size_t size, const unsigned *elits, unsigned except)
Definition kitten.c:1772
void kitten_set_ticks_limit(kitten *kitten, uint64_t delta)
Definition kitten.c:749
unsigned kitten_compute_clausal_core(kitten *kitten, uint64_t *learned_ptr)
Definition kitten.c:1872
void kitten_shuffle_clauses(kitten *kitten)
Definition kitten.c:825
void kitten_clear(kitten *kitten)
Definition kitten.c:986
#define LOGWATCH(...)
Definition logging.h:454
bool sign(Lit p)
Definition SolverTypes.h:63
unsigned long long size
Definition giaNewBdd.h:39
#define GET_OPTION(N)
Definition options.h:295
#define kissat_extremely_verbose(...)
Definition print.h:53
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
#define DELETE_LITS_FROM_PROOF(...)
Definition proof.h:158
#define ADD_LITS_TO_PROOF(...)
Definition proof.h:132
ABC_NAMESPACE_HEADER_START typedef unsigned reference
Definition reference.h:9
int lit
Definition satVec.h:130
#define NOT(LIT)
Definition literal.h:33
unsigned lits[3]
Definition clause.h:39
unsigned size
Definition clause.h:37
watches * watches[2]
Definition definition.c:15
int status
Definition kitten.c:216
size_t size
Definition kitten.c:246
bool learned
Definition kitten.c:222
Definition watch.h:41
large_watch large
Definition watch.h:45
watch_type type
Definition watch.h:42
binary_watch binary
Definition watch.h:43
#define SIZE_WATCHES(W)
Definition watch.h:104
#define BEGIN_WATCHES(WS)
Definition watch.h:115
vector watches
Definition watch.h:49
#define all_binary_large_watches(WATCH, WATCHES)
Definition watch.h:158
#define WATCHES(LIT)
Definition watch.h:137