ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
definition.c File Reference
#include "definition.h"
#include "allocate.h"
#include "gates.h"
#include "inline.h"
#include "kitten.h"
#include "print.h"
Include dependency graph for definition.c:

Go to the source code of this file.

Classes

struct  definition_extractor
 

Typedefs

typedef typedefABC_NAMESPACE_IMPL_START struct definition_extractor definition_extractor
 

Functions

bool kissat_find_definition (kissat *solver, unsigned lit)
 

Typedef Documentation

◆ definition_extractor

typedef typedefABC_NAMESPACE_IMPL_START struct definition_extractor definition_extractor

Definition at line 10 of file definition.c.

Function Documentation

◆ kissat_find_definition()

bool kissat_find_definition ( kissat * solver,
unsigned lit )

Definition at line 93 of file definition.c.

93 {
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}
void kissat_learned_unit(kissat *solver, unsigned lit)
Definition assign.c:18
#define SIZE_STACK(S)
Definition stack.h:19
#define CLEAR_STACK(S)
Definition stack.h:50
#define INVALID_LIT
#define INC(NAME)
#define LOG(...)
#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
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
bool sign(Lit p)
Definition SolverTypes.h:63
unsigned short ref
Definition giaNewBdd.h:38
#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
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 all_binary_large_watches(WATCH, WATCHES)
Definition watch.h:158
#define WATCHES(LIT)
Definition watch.h:137
Here is the call graph for this function:
Here is the caller graph for this function: