ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
logging.c
Go to the documentation of this file.
1#include "global.h"
2
3#if defined(LOGGING) && !defined(KISSAT_QUIET)
4
5#include "colors.h"
6#include "inline.h"
7
8#include <stdarg.h>
9#include <string.h>
10
11static void begin_logging (kissat *solver, const char *prefix,
12 const char *fmt, va_list *ap) {
13 TERMINAL (stdout, 1);
15 fputs (solver->prefix, stdout);
16 COLOR (MAGENTA);
17 printf ("%s %u ", prefix, solver->level);
18 vprintf (fmt, *ap);
19}
20
21static void end_logging (void) {
22 TERMINAL (stdout, 1);
23 fputc ('\n', stdout);
24 COLOR (NORMAL);
25 fflush (stdout);
26}
27
28void kissat_begin_logging (kissat *solver, const char *prefix,
29 const char *fmt, ...) {
30 va_list ap;
31 va_start (ap, fmt);
32 begin_logging (solver, prefix, fmt, &ap);
33 va_end (ap);
34}
35
36void kissat_end_logging (void) { end_logging (); }
37
38void kissat_log_msg (kissat *solver, const char *prefix, const char *fmt,
39 ...) {
40 va_list ap;
41 va_start (ap, fmt);
42 begin_logging (solver, prefix, fmt, &ap);
43 va_end (ap);
44 end_logging ();
45}
46
47static void append_sprintf (char *str, const char *fmt, ...) {
48 va_list ap;
49 va_start (ap, fmt);
50 const size_t len = strlen (str);
51 vsprintf (str + len, fmt, ap);
52 va_end (ap);
53}
54
55const char *kissat_log_repr (kissat *solver, unsigned lit,
56 const unsigned *repr) {
58 char *res = kissat_next_format_string (&solver->format);
59 sprintf (res, "%u", lit);
60 if (!solver->compacting && GET_OPTION (log) > 1)
61 append_sprintf (res, "(%d)", kissat_export_literal (solver, lit));
62 if (repr && repr[lit] != lit) {
63 strcat (res, "[");
64 unsigned repr_lit = repr[lit];
65 append_sprintf (res, "%u", repr_lit);
66 if (!solver->compacting && GET_OPTION (log) > 1)
67 append_sprintf (res, "(%d)",
68 kissat_export_literal (solver, repr_lit));
69 strcat (res, "]");
70 }
71 if (!solver->compacting && GET_OPTION (log) > 1 && solver->values) {
72 const value value = VALUE (lit);
73 if (value) {
74 append_sprintf (res, "=%d", value);
75 if (solver->assigned)
76 append_sprintf (res, "@%u", LEVEL (lit));
77 }
78 }
80 return res;
81}
82
83const char *kissat_log_lit (kissat *solver, unsigned lit) {
84 return kissat_log_repr (solver, lit, 0);
85}
86
87const char *kissat_log_var (kissat *solver, unsigned idx) {
89 char *res = kissat_next_format_string (&solver->format);
90 const unsigned lit = LIT (idx);
91 sprintf (res, "variable %u (literal %s)", idx, LOGLIT (lit));
93 return res;
94}
95
96static void log_lits (kissat *solver, size_t size, const unsigned *lits,
97 const unsigned *counts) {
98 for (size_t i = 0; i < size; i++) {
99 const unsigned lit = lits[i];
100 fputc (' ', stdout);
101 fputs (LOGLIT (lit), stdout);
102 if (counts)
103 printf ("#%u", counts[lit]);
104 }
105}
106
107static void log_reprs (kissat *solver, size_t size, const unsigned *lits,
108 const unsigned *repr) {
109 for (size_t i = 0; i < size; i++) {
110 const unsigned lit = lits[i];
111 fputc (' ', stdout);
112 fputs (LOGREPR (lit, repr), stdout);
113 }
114}
115
116void kissat_log_lits (kissat *solver, const char *prefix, size_t size,
117 const unsigned *const lits, const char *fmt, ...) {
118 va_list ap;
119 va_start (ap, fmt);
120 begin_logging (solver, prefix, fmt, &ap);
121 va_end (ap);
122 printf (" size %zu clause", size);
123 log_lits (solver, size, lits, 0);
124 end_logging ();
125}
126
127void kissat_log_litset (kissat *solver, const char *prefix, size_t size,
128 const unsigned *const lits, const char *fmt, ...) {
129 va_list ap;
130 va_start (ap, fmt);
131 begin_logging (solver, prefix, fmt, &ap);
132 va_end (ap);
133 printf (" size %zu literal set {", size);
134 log_lits (solver, size, lits, 0);
135 fputs (" }", stdout);
136 end_logging ();
137}
138
139void kissat_log_litpart (kissat *solver, const char *prefix, size_t size,
140 const unsigned *const lits, const char *fmt, ...) {
141 va_list ap;
142 va_start (ap, fmt);
143 begin_logging (solver, prefix, fmt, &ap);
144 va_end (ap);
145 size_t classes = 0;
146 for (size_t i = 0; i < size; i++)
147 if (lits[i] == INVALID_LIT)
148 classes++;
149 printf (" %zu literals %zu classes literal partition [", size - classes,
150 classes);
151 for (size_t i = 0; i < size; i++) {
152 const unsigned lit = lits[i];
153 if (lit == INVALID_LIT) {
154 if (i + 1 != size)
155 fputs (" |", stdout);
156 } else {
157 fputc (' ', stdout);
158 fputs (LOGLIT (lit), stdout);
159 }
160 }
161 fputs (" ]", stdout);
162 end_logging ();
163}
164
165void kissat_log_counted_ref_lits (kissat *solver, const char *prefix,
166 reference ref, size_t size,
167 const unsigned *const lits,
168 const unsigned *const counts,
169 const char *fmt, ...) {
170 va_list ap;
171 va_start (ap, fmt);
172 begin_logging (solver, prefix, fmt, &ap);
173 va_end (ap);
174 printf (" size %zu clause", size);
175 printf ("[%u]", ref);
176 log_lits (solver, size, lits, counts);
177 end_logging ();
178}
179
180void kissat_log_counted_lits (kissat *solver, const char *prefix,
181 size_t size, const unsigned *const lits,
182 const unsigned *const counts, const char *fmt,
183 ...) {
184 va_list ap;
185 va_start (ap, fmt);
186 begin_logging (solver, prefix, fmt, &ap);
187 va_end (ap);
188 printf (" size %zu literals", size);
189 log_lits (solver, size, lits, counts);
190 end_logging ();
191}
192
193void kissat_log_resolvent (kissat *solver, const char *prefix,
194 const char *fmt, ...) {
195 va_list ap;
196 va_start (ap, fmt);
197 begin_logging (solver, prefix, fmt, &ap);
198 va_end (ap);
199 const size_t size = SIZE_STACK (solver->resolvent);
200 printf (" size %zu resolvent", size);
201 const unsigned *const lits = BEGIN_STACK (solver->resolvent);
202 log_lits (solver, size, lits, 0);
203 end_logging ();
204}
205
206void kissat_log_ints (kissat *solver, const char *prefix, size_t size,
207 const int *const lits, const char *fmt, ...) {
208 va_list ap;
209 va_start (ap, fmt);
210 begin_logging (solver, prefix, fmt, &ap);
211 va_end (ap);
212 printf (" size %zu external literals clause", size);
213 for (size_t i = 0; i < size; i++)
214 printf (" %d", lits[i]);
215 end_logging ();
216}
217
218void kissat_log_unsigneds (kissat *solver, const char *prefix, size_t size,
219 const unsigned *const lits, const char *fmt,
220 ...) {
221 va_list ap;
222 va_start (ap, fmt);
223 begin_logging (solver, prefix, fmt, &ap);
224 va_end (ap);
225 printf (" size %zu clause", size);
226 for (size_t i = 0; i < size; i++)
227 printf (" %u", lits[i]);
228 end_logging ();
229}
230
231static void log_gate (kissat *solver, size_t id, const char *type,
232 const char *op, const char *empty_rhs_constant,
233 const unsigned *repr, unsigned lhs, size_t size,
234 const unsigned *rhs) {
235 printf (" arity %zu %s gate", size, type);
236 if (id != INVALID_GATE_ID)
237 printf ("[%zu]", id);
238 fputc (' ', stdout);
239 if (lhs == INVALID_LIT)
240 fputs ("<LHS>", stdout);
241 else
242 fputs (LOGREPR (lhs, repr), stdout);
243 if (size)
244 for (size_t i = 0; i < size; i++) {
245 fputc (' ', stdout);
246 fputs (i ? op : ":=", stdout);
247 fputc (' ', stdout);
248 fputs (LOGREPR (rhs[i], repr), stdout);
249 }
250 else {
251 fputs (" := ", stdout);
252 fputs (empty_rhs_constant, stdout);
253 }
254}
255
256void kissat_log_and_gate (kissat *solver, const char *prefix, size_t id,
257 unsigned *repr, unsigned lhs, size_t size,
258 const unsigned *rhs, const char *fmt, ...) {
259 va_list ap;
260 va_start (ap, fmt);
261 begin_logging (solver, prefix, fmt, &ap);
262 va_end (ap);
263 log_gate (solver, id, "AND", "&", "<true>", repr, lhs, size, rhs);
264 end_logging ();
265}
266
267void kissat_log_xor_gate (kissat *solver, const char *prefix, size_t id,
268 unsigned *repr, unsigned lhs, size_t size,
269 const unsigned *rhs, const char *fmt, ...) {
270 va_list ap;
271 va_start (ap, fmt);
272 begin_logging (solver, prefix, fmt, &ap);
273 va_end (ap);
274 log_gate (solver, id, "XOR", "^", "<false>", repr, lhs, size, rhs);
275 end_logging ();
276}
277
278void kissat_log_ite_gate (kissat *solver, const char *prefix, size_t id,
279 unsigned *repr, unsigned lhs, unsigned cond,
280 unsigned then_lit, unsigned else_lit,
281 const char *fmt, ...) {
282 va_list ap;
283 va_start (ap, fmt);
284 begin_logging (solver, prefix, fmt, &ap);
285 va_end (ap);
286 printf (" ITE gate");
287 if (id != INVALID_GATE_ID)
288 printf ("[%zu]", id);
289 fputc (' ', stdout);
290 if (lhs == INVALID_LIT)
291 fputs ("<LHS>", stdout);
292 else
293 fputs (LOGREPR (lhs, repr), stdout);
294 fputs (" := ", stdout);
295 fputs (LOGREPR (cond, repr), stdout);
296 fputs (" ? ", stdout);
297 fputs (LOGREPR (then_lit, repr), stdout);
298 fputs (" : ", stdout);
299 fputs (LOGREPR (else_lit, repr), stdout);
300 end_logging ();
301}
302
303void kissat_log_extensions (kissat *solver, const char *prefix, size_t size,
304 const extension *const exts, const char *fmt,
305 ...) {
306 KISSAT_assert (size > 0);
307 va_list ap;
308 va_start (ap, fmt);
309 begin_logging (solver, prefix, fmt, &ap);
310 va_end (ap);
311 const extension *const begin = BEGIN_STACK (solver->extend);
312 const size_t pos = exts - begin;
313 printf (" extend[%zu]", pos);
314 printf (" %d", exts[0].lit);
315 if (size > 1)
316 fputs (" :", stdout);
317 for (size_t i = 1; i < size; i++)
318 printf (" %d", exts[i].lit);
319 end_logging ();
320}
321
322static void log_clause (kissat *solver, const clause *c) {
323 fputc (' ', stdout);
324 if (c == &solver->conflict) {
325 fputs ("static ", stdout);
326 fputs (c->redundant ? "redundant" : "irredundant", stdout);
327 fputs (" binary conflict clause", stdout);
328 } else {
329 if (c->redundant)
330 printf ("redundant glue %u", c->glue);
331 else
332 fputs ("irredundant", stdout);
333 printf (" size %u", c->size);
334 if (c->reason)
335 fputs (" reason", stdout);
336 if (c->garbage)
337 fputs (" garbage", stdout);
338 fputs (" clause", stdout);
339 if (kissat_clause_in_arena (solver, c)) {
340 reference ref = kissat_reference_clause (solver, c);
341 printf ("[%u]", ref);
342 }
343 }
344}
345
346void kissat_log_clause (kissat *solver, const char *prefix, const clause *c,
347 const char *fmt, ...) {
348 va_list ap;
349 va_start (ap, fmt);
350 begin_logging (solver, prefix, fmt, &ap);
351 va_end (ap);
352 log_clause (solver, c);
353 log_lits (solver, c->size, c->lits, 0);
354 end_logging ();
355}
356
357void kissat_log_counted_clause (kissat *solver, const char *prefix,
358 const clause *c, const unsigned *counts,
359 const char *fmt, ...) {
360 va_list ap;
361 va_start (ap, fmt);
362 begin_logging (solver, prefix, fmt, &ap);
363 va_end (ap);
364 log_clause (solver, c);
365 log_lits (solver, c->size, c->lits, counts);
366 end_logging ();
367}
368
369void kissat_log_repr_clause (kissat *solver, const char *prefix,
370 const clause *c, const unsigned *repr,
371 const char *fmt, ...) {
372 va_list ap;
373 va_start (ap, fmt);
374 begin_logging (solver, prefix, fmt, &ap);
375 va_end (ap);
376 log_clause (solver, c);
377 log_reprs (solver, c->size, c->lits, repr);
378 end_logging ();
379}
380
381static void log_binary (kissat *solver, unsigned a, unsigned b) {
382 printf (" binary clause %s %s", LOGLIT (a), LOGLIT (b));
383}
384
385void kissat_log_binary (kissat *solver, const char *prefix, unsigned a,
386 unsigned b, const char *fmt, ...) {
387 va_list ap;
388 va_start (ap, fmt);
389 begin_logging (solver, prefix, fmt, &ap);
390 va_end (ap);
391 log_binary (solver, a, b);
392 end_logging ();
393}
394
395void kissat_log_unary (kissat *solver, const char *prefix, unsigned a,
396 const char *fmt, ...) {
397 va_list ap;
398 va_start (ap, fmt);
399 begin_logging (solver, prefix, fmt, &ap);
400 va_end (ap);
401 printf (" unary clause %s", LOGLIT (a));
402 end_logging ();
403}
404
405static void log_ref (kissat *solver, reference ref) {
406 clause *c = kissat_dereference_clause (solver, ref);
407 log_clause (solver, c);
408 log_lits (solver, c->size, c->lits, 0);
409}
410
411void kissat_log_ref (kissat *solver, const char *prefix, reference ref,
412 const char *fmt, ...) {
413 va_list ap;
414 va_start (ap, fmt);
415 begin_logging (solver, prefix, fmt, &ap);
416 va_end (ap);
417 log_ref (solver, ref);
418 end_logging ();
419}
420
421void kissat_log_watch (kissat *solver, const char *prefix, unsigned lit,
422 watch watch, const char *fmt, ...) {
423 va_list ap;
424 va_start (ap, fmt);
425 begin_logging (solver, prefix, fmt, &ap);
426 va_end (ap);
427 if (watch.type.binary)
428 log_binary (solver, lit, watch.binary.lit);
429 else
430 log_ref (solver, watch.large.ref);
431 end_logging ();
432}
433
434void kissat_log_xor (kissat *solver, const char *prefix, unsigned lit,
435 unsigned size, const unsigned *lits, const char *fmt,
436 ...) {
437 va_list ap;
438 va_start (ap, fmt);
439 begin_logging (solver, prefix, fmt, &ap);
440 va_end (ap);
441 printf (" size %u XOR gate ", size);
442 fputs (kissat_log_lit (solver, lit), stdout);
443 printf (" =");
444 for (unsigned i = 0; i < size; i++) {
445 if (i)
446 fputs (" ^ ", stdout);
447 else
448 fputc (' ', stdout);
449 fputs (kissat_log_lit (solver, lits[i]), stdout);
450 }
451 end_logging ();
452}
453
454#else
455
457
458#endif
#define LEVEL(LIT)
Definition assign.h:34
#define BEGIN_STACK(S)
Definition stack.h:46
#define SIZE_STACK(S)
Definition stack.h:19
#define INVALID_LIT
ABC_NAMESPACE_IMPL_START typedef signed char value
#define NORMAL
Definition colors.h:18
#define COLOR(CODE)
Definition colors.h:41
#define MAGENTA
Definition colors.h:17
#define TERMINAL(F, I)
Definition colors.h:34
bool pos
Definition globals.c:30
type
CUBE COVER and CUBE typedefs ///.
Definition exor.h:90
ABC_NAMESPACE_IMPL_START char * kissat_next_format_string(kormat *format)
Definition format.c:12
#define FORMAT_STRING_SIZE
Definition format.h:13
#define vprintf
Definition fretime.h:138
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
int kissat_log_dummy_to_avoid_pedantic_warning
Definition logging.c:456
#define LOGLIT(...)
Definition logging.hpp:99
unsigned long long size
Definition giaNewBdd.h:39
unsigned short ref
Definition giaNewBdd.h:38
#define GET_OPTION(N)
Definition options.h:295
ABC_NAMESPACE_HEADER_START typedef unsigned reference
Definition reference.h:9
int lit
Definition satVec.h:130
#define LIT(IDX)
Definition literal.h:31
bool reason
Definition clause.h:27
unsigned glue
Definition clause.h:23
unsigned lits[3]
Definition clause.h:39
bool redundant
Definition clause.h:28
unsigned size
Definition clause.h:37
bool garbage
Definition clause.h:25
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
int strlen()
char * sprintf()
char * strcat()
#define VALUE(LIT)
Definition value.h:10