ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
compact.h File Reference
#include "global.h"
Include dependency graph for compact.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

unsigned kissat_compact_literals (struct kissat *, unsigned *mfixed_ptr)
 
void kissat_finalize_compacting (struct kissat *, unsigned vars, unsigned mfixed)
 

Function Documentation

◆ kissat_compact_literals()

unsigned kissat_compact_literals ( struct kissat * solver,
unsigned * mfixed_ptr )

Definition at line 21 of file compact.c.

21 {
22 INC (compacted);
23#if !defined(KISSAT_QUIET) || !defined(KISSAT_NDEBUG)
24 const unsigned active = solver->active;
25#ifndef KISSAT_QUIET
26 const unsigned inactive = solver->vars - active;
27 kissat_phase (solver, "compact", GET (compacted),
28 "compacting garbage collection "
29 "(%u inactive variables %.2f%%)",
30 inactive, kissat_percent (inactive, solver->vars));
31#endif
32#endif
33#ifdef LOGGING
34 KISSAT_assert (!solver->compacting);
35 solver->compacting = true;
36#endif
37 unsigned mfixed = INVALID_LIT;
38 unsigned vars = 0;
39 for (all_variables (iidx)) {
40 const flags *const flags = FLAGS (iidx);
41 if (flags->eliminated)
42 continue;
43 const unsigned ilit = LIT (iidx);
44 unsigned mlit;
45 if (flags->fixed) {
46 const value value = kissat_fixed (solver, ilit);
48 if (mfixed == INVALID_LIT) {
49 mlit = mfixed = LIT (vars);
50 LOG2 ("first fixed %u mapped to %u assigned to %d", ilit, mfixed,
51 value);
52 if (value < 0)
53 mfixed = NOT (mfixed);
54 LOG2 ("all other fixed mapped to %u", mfixed);
55 vars++;
56 } else if (value < 0) {
57 mlit = NOT (mfixed);
58 LOG2 ("negatively fixed %u mapped to %u", ilit, mlit);
59 } else {
60 mlit = mfixed;
61 LOG2 ("positively fixed %u mapped to %u", ilit, mlit);
62 }
63 } else if (flags->active) {
65 mlit = LIT (vars);
66 LOG2 ("remapping %u to %u", ilit, mlit);
67 vars++;
68 } else {
69 const int elit = PEEK_STACK (solver->export_, iidx);
70 if (elit) {
71 const unsigned eidx = ABS (elit);
72 import *import = &PEEK_STACK (solver->import, eidx);
75 import->imported = false;
76 LOG2 ("external variable %d not imported anymore", eidx);
77 POKE_STACK (solver->export_, iidx, 0);
78 } else
79 LOG2 ("skipping inactive %u", ilit);
80 continue;
81 }
82 KISSAT_assert (mlit <= ilit);
83 KISSAT_assert (mlit != NOT (ilit));
84 if (mlit == ilit)
85 continue;
86 const int elit = PEEK_STACK (solver->export_, iidx);
87 const unsigned eidx = ABS (elit);
88 if (elit < 0)
89 mlit = NOT (mlit);
90 reimport_literal (solver, eidx, mlit);
91 }
92 *mfixed_ptr = mfixed;
93 LOG ("compacting to %u variables %.2f%% from %u", vars,
94 kissat_percent (vars, solver->vars), solver->vars);
95 KISSAT_assert (vars == active || vars == active + 1);
96 return vars;
97}
#define POKE_STACK(S, N, E)
Definition stack.h:32
#define PEEK_STACK(S, N)
Definition stack.h:29
#define INVALID_LIT
#define INC(NAME)
#define LOG(...)
ABC_NAMESPACE_IMPL_START typedef signed char value
#define FLAGS
#define all_variables(IDX)
Definition internal.h:269
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define LOG2(...)
Definition logging.h:352
#define kissat_phase(...)
Definition print.h:48
#define LIT(IDX)
Definition literal.h:31
#define NOT(LIT)
Definition literal.h:33
#define GET(NAME)
Definition statistics.h:416
Definition flags.h:11
bool active
Definition flags.h:12
bool fixed
Definition flags.h:18
bool eliminated
Definition flags.h:16
bool eliminated
Definition internal.h:52
bool imported
Definition internal.h:51
#define ABS(a)
Definition util_old.h:250
Here is the caller graph for this function:

◆ kissat_finalize_compacting()

void kissat_finalize_compacting ( struct kissat * solver,
unsigned vars,
unsigned mfixed )

Definition at line 322 of file compact.c.

323 {
324 LOG ("finalizing compacting");
325 KISSAT_assert (vars <= solver->vars);
326#ifdef LOGGING
327 KISSAT_assert (solver->compacting);
328#endif
329 if (vars == solver->vars) {
330#ifdef LOGGING
331 solver->compacting = false;
332 LOG ("number of variables does not change");
333#endif
334 return;
335 }
336
337 unsigned reduced = solver->vars - vars;
338 LOG ("compacted number of variables from %u to %u", solver->vars, vars);
339
340 bool first = true;
341 for (all_variables (iidx)) {
342 flags *flags = FLAGS (iidx);
343 if (flags->fixed && first)
344 first = false;
345 else if (!flags->active)
346 POKE_STACK (solver->export_, iidx, 0);
347 }
348
349 compact_trail (solver);
350
351 for (all_variables (iidx)) {
352 const unsigned ilit = LIT (iidx);
353 const unsigned mlit = kissat_map_literal (solver, ilit, true);
354 if (mlit != INVALID_LIT && ilit != mlit)
355 compact_literal (solver, mlit, ilit);
356 }
357
358 if (mfixed != INVALID_LIT)
359 compact_units (solver, mfixed);
360
361 memset (solver->assigned + vars, 0, reduced * sizeof (assigned));
362 memset (solver->flags + vars, 0, reduced * sizeof (flags));
363 memset (solver->values + 2 * vars, 0, 2 * reduced * sizeof (value));
364 memset (solver->watches + 2 * vars, 0, 2 * reduced * sizeof (watches));
365
366 compact_queue (solver);
367 compact_stack (solver, &solver->sweep_schedule);
368 compact_scores (solver, SCORES, vars);
369 compact_frames (solver);
370 compact_export (solver, vars);
371 compact_best_and_target_values (solver, vars);
372
373 solver->vars = vars;
374#ifdef LOGGING
375 solver->compacting = false;
376#endif
378}
#define SCORES
Definition internal.h:262
void kissat_decrease_size(kissat *solver)
Definition resize.c:82
char * memset()
vector watches
Definition watch.h:49
Here is the call graph for this function:
Here is the caller graph for this function: