ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
extend.c File Reference
#include "colors.h"
#include "inline.h"
Include dependency graph for extend.c:

Go to the source code of this file.

Functions

void kissat_extend (kissat *solver)
 

Function Documentation

◆ kissat_extend()

void kissat_extend ( kissat * solver)

Definition at line 46 of file extend.c.

46 {
47 KISSAT_assert (!EMPTY_STACK (solver->extend));
48 KISSAT_assert (!solver->extended);
49
50 START (extend);
51 solver->extended = true;
52
53 undo_eliminated_assignment (solver);
54
55 LOG ("extending solution with reconstruction stack of size %zu",
56 SIZE_STACK (solver->extend));
57
58 value *evalues = BEGIN_STACK (solver->eliminated);
59 value *ivalues = solver->values;
60
61 const import *const imports = BEGIN_STACK (solver->import);
62
63 const extension *const begin = BEGIN_STACK (solver->extend);
64 extension const *p = END_STACK (solver->extend);
65
66#ifdef LOGGING
67 size_t assigned = 0;
68 size_t flipped = 0;
69#endif
70
71 while (p != begin) {
72 unsigned pos = UINT_MAX;
73 bool satisfied = false;
74
75 int eliminated = 0;
76 int blocking = 0;
77
78 size_t size = 0;
79#ifndef LOGGING
80 (void) size;
81#endif
82 do {
83 size++;
84 KISSAT_assert (begin < p);
85 const extension ext = *--p;
86 const int elit = ext.lit;
87 if (ext.blocking)
88 blocking = elit;
89
90 if (satisfied)
91 continue;
92
93 KISSAT_assert (elit != INT_MIN);
94 const unsigned eidx = ABS (elit);
95 KISSAT_assert (eidx < SIZE_STACK (solver->import));
96 const import *const import = imports + eidx;
98
99 if (import->eliminated) {
100 const unsigned tmp = import->lit;
101 KISSAT_assert (tmp < SIZE_STACK (solver->eliminated));
102 value value = evalues[tmp];
103
104 if (elit < 0)
105 value = -value;
106
107 if (value > 0) {
108 LOG2 ("previously assigned eliminated literal %d "
109 "satisfies clause",
110 elit);
111 satisfied = true;
112 } else if (!value && (!eliminated || pos < tmp)) {
113#ifdef LOGGING
114 if (eliminated)
115 LOG2 ("earlier unassigned eliminated literal %d", elit);
116 else
117 LOG2 ("found unassigned eliminated literal %d", elit);
118#endif
119 eliminated = elit;
120 pos = tmp;
121 }
122 } else {
123 const unsigned ilit = import->lit;
124 value value = ivalues[ilit];
126
127 if (elit < 0)
128 value = -value;
129
130 if (value > 0) {
131 LOG2 ("internal literal %s satisfies clause", LOGLIT (ilit));
132 satisfied = true;
133 }
134 }
135 } while (!blocking);
136
137 if (satisfied) {
138 LOGEXT2 (size, p, "satisfied");
139 continue;
140 }
141
142 if (eliminated && eliminated != blocking) {
143 LOGEXT2 (size, p,
144 "assigning eliminated unassigned external literal %d "
145 "to satisfy size %zu witness labelled clause at",
146 eliminated, size);
147 extend_assign (solver, evalues, eliminated);
148#ifdef LOGGING
149 assigned++;
150#endif
151 continue;
152 }
153
154#ifdef LOGGING
155 const unsigned blocking_idx = ABS (blocking);
156 KISSAT_assert (blocking_idx < SIZE_STACK (solver->import));
157 KISSAT_assert (imports[blocking_idx].eliminated);
158 const unsigned blocking_pos = imports[blocking_idx].lit;
159 KISSAT_assert (blocking_pos < SIZE_STACK (solver->eliminated));
160 const value blocking_value = evalues[blocking_pos];
161 LOGEXT2 (size, p,
162 "%s blocking external literal %d "
163 "to satisfy size %zu witness labelled clause at",
164 blocking_value ? "flipping" : "assigning", blocking, size);
165 if (blocking_value)
166 flipped++;
167 else
168 assigned++;
169#endif
170 extend_assign (solver, evalues, blocking);
171 }
172
173#ifdef LOGGING
174 size_t total = SIZE_STACK (solver->eliminated);
175 LOG ("assigned %zu external variables %.0f%% out of %zu eliminated",
176 assigned, kissat_percent (assigned, total), total);
177 LOG ("flipped %zu external variables %.0f%% out of %zu assigned", flipped,
178 kissat_percent (flipped, assigned), assigned);
179 LOG ("extended assignment complete");
180#endif
181
182 STOP (extend);
183}
#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 END_STACK(S)
Definition stack.h:48
#define LOG(...)
ABC_NAMESPACE_IMPL_START typedef signed char value
bool pos
Definition globals.c:30
Cube * p
Definition exorList.c:222
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define LOG2(...)
Definition logging.h:352
#define LOGEXT2(...)
Definition logging.h:391
#define LOGLIT(...)
Definition logging.hpp:99
unsigned long long size
Definition giaNewBdd.h:39
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
signed int lit
Definition extend.h:13
bool blocking
Definition extend.h:14
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: