ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
dump.c
Go to the documentation of this file.
1#include "global.h"
2
3#ifndef KISSAT_NDEBUG
4
5#include "inline.h"
6
7#include <inttypes.h>
8
10
11static void dump_literal (kissat *solver, unsigned ilit) {
12 const int elit = kissat_export_literal (solver, ilit);
13 printf ("%u(%d)", ilit, elit);
14 const int value = VALUE (ilit);
15 if (value) {
16 const unsigned ilit_level = LEVEL (ilit);
17 printf ("@%u=%d", ilit_level, value);
18 }
19}
20
21static void dump_binary (kissat *solver, unsigned a, unsigned b) {
22 printf ("binary clause ");
23 dump_literal (solver, a);
24 fputc (' ', stdout);
25 dump_literal (solver, b);
26 fputc ('\n', stdout);
27}
28
29static void dump_clause (kissat *solver, clause *c) {
30 if (c->redundant)
31 printf ("redundant glue %u", c->glue);
32 else
33 printf ("irredundant");
34 const reference ref = kissat_reference_clause (solver, c);
35 if (c->garbage)
36 printf (" garbage");
37 printf (" clause[%u]", ref);
38 for (all_literals_in_clause (lit, c)) {
39 fputc (' ', stdout);
40 dump_literal (solver, lit);
41 }
42 fputc ('\n', stdout);
43}
44
45static void dump_ref (kissat *solver, reference ref) {
46 clause *c = kissat_dereference_clause (solver, ref);
47 dump_clause (solver, c);
48}
49
50static void dump_trail (kissat *solver) {
51 unsigned prev = 0;
52 for (unsigned level = 0; level <= solver->level; level++) {
53 frame *frame = &FRAME (level);
54 unsigned next;
55 if (level < solver->level)
56 next = frame[1].trail;
57 else
58 next = SIZE_ARRAY (solver->trail);
59 if (next == prev)
60 printf ("frame[%u] has no assignments\n", level);
61 else {
62 printf ("frame[%u] has %u assignments\n", level, next - prev);
63 if (prev < next)
64 printf ("block[%u] = trail[%u..%u]\n", level, prev, next - 1);
65 }
66 for (unsigned i = prev; i < next; i++) {
67 printf ("trail[%u] ", i);
68 const unsigned lit = PEEK_ARRAY (solver->trail, i);
69 dump_literal (solver, lit);
70 const unsigned lit_level = LEVEL (lit);
71 KISSAT_assert (lit_level <= level);
72 if (lit_level < level)
73 printf (" out-of-order");
74 assigned *a = ASSIGNED (lit);
75 if (!lit_level) {
76 printf (" UNIT\n");
79 } else {
80 fputc (' ', stdout);
81 if (a->binary) {
82 const unsigned other = a->reason;
83 dump_binary (solver, lit, other);
84 } else if (a->reason == DECISION_REASON)
85 printf ("DECISION\n");
86 else {
88 const reference ref = a->reason;
89 dump_ref (solver, ref);
90 }
91 }
92 }
93 prev = next;
94 }
95}
96
97static void dump_values (kissat *solver) {
98 for (unsigned idx = 0; idx < VARS; idx++) {
99 unsigned lit = LIT (idx);
100 int value = solver->values[lit];
101 printf ("val[%u] = ", lit);
102 if (!value)
103 printf ("unassigned\n");
104 else
105 printf ("%d\n", value);
106 }
107}
108
109static void dump_queue (kissat *solver) {
110 const queue *const queue = &solver->queue;
111 printf ("queue: first %u, last %u, stamp %u, search %u (stamp %u)\n",
114 const links *const links = solver->links;
115 for (unsigned idx = queue->first; !DISCONNECTED (idx);
116 idx = links[idx].next) {
117 const struct links *l = links + idx;
118 printf ("%u ( prev %u, next %u, stamp %u )\n", idx, l->prev, l->next,
119 l->stamp);
120 }
121}
122
123static void dump_scores (kissat *solver) {
124 heap *heap = SCORES;
125 printf ("scores.vars = %u\n", heap->vars);
126 printf ("scores.size = %u\n", heap->size);
127 for (unsigned i = 0; i < SIZE_STACK (heap->stack); i++)
128 printf ("scores.stack[%u] = %u\n", i, PEEK_STACK (heap->stack, i));
129 for (unsigned i = 0; i < heap->vars; i++)
130 printf ("scores.score[%u] = %g\n", i, heap->score[i]);
131 for (unsigned i = 0; i < heap->vars; i++)
132 printf ("scores.pos[%u] = %u\n", i, heap->pos[i]);
133}
134
135static void dump_export (kissat *solver) {
136 const unsigned size = SIZE_STACK (solver->export_);
137 for (unsigned idx = 0; idx < size; idx++)
138 printf ("export[%u] = %u\n", LIT (idx),
139 PEEK_STACK (solver->export_, idx));
140}
141
142void dump_map (kissat *solver) {
143 const unsigned size = SIZE_STACK (solver->export_);
144 unsigned first = INVALID_LIT;
145 for (unsigned idx = 0; idx < size; idx++) {
146 const unsigned ilit = LIT (idx);
147 const int elit = PEEK_STACK (solver->export_, idx);
148 printf ("map[%u] -> %d", ilit, elit);
149 if (elit) {
150 const unsigned eidx = ABS (elit);
151 const import *const import = &PEEK_STACK (solver->import, eidx);
152 if (import->eliminated)
153 printf (" -> eliminated[%u]", import->lit);
154 else {
155 unsigned mlit = import->lit;
156 if (elit < 0)
157 mlit = NOT (mlit);
158 printf (" -> %u", mlit);
159 }
160 }
161 if (!LEVEL (ilit) && VALUE (ilit)) {
162 if (first == INVALID_LIT) {
163 first = ilit;
164 printf (" #");
165 } else
166 printf (" *");
167 }
168 fputc ('\n', stdout);
169 }
170}
171
172static void dump_import (kissat *solver) {
173 const unsigned size = SIZE_STACK (solver->import);
174 for (unsigned idx = 1; idx < size; idx++) {
175 import *import = &PEEK_STACK (solver->import, idx);
176 printf ("import[%u] = ", idx);
177 if (!import->imported)
178 printf ("undefined\n");
179 else if (import->eliminated) {
180 unsigned pos = import->lit;
181 printf ("eliminated[%u]", pos);
182 if (pos < SIZE_STACK (solver->eliminated)) {
183 int value = PEEK_STACK (solver->eliminated, pos);
184 if (value)
185 printf (" (assigned to %d)", value);
186 }
187 fputc ('\n', stdout);
188 } else
189 printf ("%u\n", import->lit);
190 }
191}
192
193static void dump_etrail (kissat *solver) {
194 for (unsigned i = 0; i < SIZE_STACK (solver->etrail); i++)
195 printf ("etrail[%u] = %d\n", i, (int) PEEK_STACK (solver->etrail, i));
196}
197
198static void dump_extend (kissat *solver) {
199 const extension *const begin = BEGIN_STACK (solver->extend);
200 const extension *const end = END_STACK (solver->extend);
201 for (const extension *p = begin, *q; p != end; p = q) {
202 KISSAT_assert (p->blocking);
203 printf ("extend[%zu] %d", (size_t) (p - begin), p->lit);
204 if (!p[1].blocking)
205 fputs (" :", stdout);
206 for (q = p + 1; q != end && !q->blocking; q++)
207 printf (" %d", q->lit);
208 fputc ('\n', stdout);
209 }
210}
211
212static void dump_binaries (kissat *solver) {
213 for (all_literals (lit)) {
214 if (solver->watching) {
216 if (!watch.type.binary)
217 continue;
218 const unsigned other = watch.binary.lit;
219 if (lit > other)
220 continue;
221 dump_binary (solver, lit, other);
222 }
223 } else {
225 if (!watch.type.binary)
226 continue;
227 const unsigned other = watch.binary.lit;
228 if (lit > other)
229 continue;
230 dump_binary (solver, lit, other);
231 }
232 }
233 }
234}
235
236static void dump_clauses (kissat *solver) {
237 for (all_clauses (c))
238 dump_clause (solver, c);
239}
240
241void kissat_dump_vectors (kissat *solver) {
242 vectors *vectors = &solver->vectors;
243 unsigneds *stack = &vectors->stack;
244 printf ("vectors.size = %zu\n", SIZE_STACK (*stack));
245 printf ("vectors.capacity = %zu\n", CAPACITY_STACK (*stack));
246 printf ("vectors.usable = %zu\n", vectors->usable);
247 const unsigned *const begin = BEGIN_STACK (*stack);
248 const unsigned *const end = END_STACK (*stack);
249 if (begin == end)
250 return;
251 fputc ('-', stdout);
252 for (const unsigned *p = begin + 1; p != end; p++)
253 if (*p == INVALID_LIT)
254 fputs (" -", stdout);
255 else
256 printf (" %u", *p);
257 fputc ('\n', stdout);
258}
259
260int kissat_dump (kissat *solver) {
261 if (!solver)
262 return 0;
263 printf ("vars = %u\n", solver->vars);
264 printf ("size = %u\n", solver->size);
265 printf ("level = %u\n", solver->level);
266 printf ("active = %u\n", solver->active);
267 printf ("assigned = %u\n", kissat_assigned (solver));
268 printf ("unassigned = %u\n", solver->unassigned);
269 dump_import (solver);
270 dump_export (solver);
271#ifdef LOGGING
272 if (solver->compacting)
273 dump_map (solver);
274#endif
275 dump_etrail (solver);
276 dump_extend (solver);
277 dump_trail (solver);
278 printf ("stable = %u\n", (unsigned) solver->stable);
279 if (solver->stable)
280 dump_scores (solver);
281 else
282 dump_queue (solver);
283 dump_values (solver);
284 printf ("binary = %" PRIu64 "\n", solver->statistics_.clauses_binary);
285 printf ("irredundant = %" PRIu64 "\n",
286 solver->statistics_.clauses_irredundant);
287 printf ("redundant = %" PRIu64 "\n",
288 solver->statistics_.clauses_redundant);
289 dump_binaries (solver);
290 dump_clauses (solver);
291 dump_extend (solver);
292 return 0;
293}
294
296
297#else
301#endif
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define SIZE_ARRAY
Definition array.h:24
#define PEEK_ARRAY
Definition array.h:47
#define DECISION_REASON
Definition assign.h:9
#define ASSIGNED(LIT)
Definition assign.h:31
#define UNIT_REASON
Definition assign.h:10
#define LEVEL(LIT)
Definition assign.h:34
#define BEGIN_STACK(S)
Definition stack.h:46
#define CAPACITY_STACK(S)
Definition stack.h:20
#define SIZE_STACK(S)
Definition stack.h:19
#define PEEK_STACK(S, N)
Definition stack.h:29
#define END_STACK(S)
Definition stack.h:48
#define INVALID_LIT
ABC_NAMESPACE_IMPL_START typedef signed char value
ABC_NAMESPACE_IMPL_START int kissat_dump_dummy_to_avoid_warning
Definition dump.c:299
bool pos
Definition globals.c:30
Cube * p
Definition exorList.c:222
#define FRAME(LEVEL)
Definition frames.h:33
#define VARS
Definition internal.h:250
#define all_literals(LIT)
Definition internal.h:274
#define all_clauses(C)
Definition internal.h:279
#define SCORES
Definition internal.h:262
#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
unsigned long long size
Definition giaNewBdd.h:39
unsigned short ref
Definition giaNewBdd.h:38
#define DISCONNECTED(IDX)
Definition queue.h:8
ABC_NAMESPACE_HEADER_START typedef unsigned reference
Definition reference.h:9
int lit
Definition satVec.h:130
#define LIT(IDX)
Definition literal.h:31
#define NOT(LIT)
Definition literal.h:33
bool binary
Definition assign.h:23
unsigned reason
Definition assign.h:28
unsigned glue
Definition clause.h:23
bool redundant
Definition clause.h:28
bool garbage
Definition clause.h:25
bool blocking
Definition extend.h:14
Definition frames.h:15
unsigned trail
Definition frames.h:18
Definition heap.h:19
unsigneds stack
Definition heap.h:23
unsigned * pos
Definition heap.h:25
double * score
Definition heap.h:24
unsigned vars
Definition heap.h:21
unsigned size
Definition heap.h:22
bool eliminated
Definition internal.h:52
bool imported
Definition internal.h:51
unsigned lit
Definition internal.h:49
Definition queue.h:20
unsigned last
Definition queue.h:21
unsigned idx
Definition queue.h:23
unsigned first
Definition queue.h:21
unsigned stamp
Definition queue.h:21
struct queue::@155145366230376277010262212306311251364106156233 search
unsigneds stack
Definition vector.h:28
size_t usable
Definition vector.h:29
Definition watch.h:41
watch_type type
Definition watch.h:42
binary_watch binary
Definition watch.h:43
#define ABS(a)
Definition util_old.h:250
#define VALUE(LIT)
Definition value.h:10
#define all_binary_blocking_watches(WATCH, WATCHES)
Definition watch.h:151
#define all_binary_large_watches(WATCH, WATCHES)
Definition watch.h:158
#define WATCHES(LIT)
Definition watch.h:137