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

Go to the source code of this file.

Functions

bool kissat_minimize_literal (kissat *solver, unsigned lit, bool lit_in_clause)
 
void kissat_reset_poisoned (kissat *solver)
 
void kissat_minimize_clause (kissat *solver)
 

Function Documentation

◆ kissat_minimize_clause()

void kissat_minimize_clause ( kissat * solver)

Definition at line 157 of file minimize.c.

157 {
158 START (minimize);
159
160 KISSAT_assert (EMPTY_STACK (solver->minimize));
161 KISSAT_assert (EMPTY_STACK (solver->removable));
162 KISSAT_assert (EMPTY_STACK (solver->poisoned));
163 KISSAT_assert (!EMPTY_STACK (solver->clause));
164
165 unsigned *lits = BEGIN_STACK (solver->clause);
166 unsigned *end = END_STACK (solver->clause);
167
168 assigned *assigned = solver->assigned;
169#ifndef KISSAT_NDEBUG
170 KISSAT_assert (lits < end);
171 const unsigned not_uip = lits[0];
172 KISSAT_assert (assigned[IDX (not_uip)].level == solver->level);
173#endif
174 for (const unsigned *p = lits; p != end; p++)
175 kissat_push_removable (solver, assigned, IDX (*p));
176
177 if (GET_OPTION (shrink) > 2) {
178 STOP (minimize);
179 return;
180 }
181
182 unsigned minimized = 0;
183
184 for (unsigned *p = end; --p > lits;) {
185 const unsigned lit = *p;
186 KISSAT_assert (lit != not_uip);
187 if (minimize_literal (solver, true, assigned, lit, 0)) {
188 LOG ("minimized literal %s", LOGLIT (lit));
189 *p = INVALID_LIT;
190 minimized++;
191 } else
192 LOG ("keeping literal %s", LOGLIT (lit));
193 }
194
195 unsigned *q = lits;
196 for (const unsigned *p = lits; p != end; p++) {
197 const unsigned lit = *p;
198 if (lit != INVALID_LIT)
199 *q++ = lit;
200 }
201 KISSAT_assert (q + minimized == end);
202 SET_END_OF_STACK (solver->clause, q);
203 LOG ("clause minimization removed %u literals", minimized);
204
205 KISSAT_assert (!solver->probing);
206 ADD (literals_minimized, minimized);
207
208 LOGTMP ("minimized learned");
209
211
212 STOP (minimize);
213}
#define BEGIN_STACK(S)
Definition stack.h:46
#define EMPTY_STACK(S)
Definition stack.h:18
#define SET_END_OF_STACK(S, P)
Definition stack.h:62
#define END_STACK(S)
Definition stack.h:48
#define INVALID_LIT
#define ADD(NAME, DELTA)
#define LOG(...)
Cube * p
Definition exorList.c:222
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define LOGTMP(...)
Definition logging.h:463
#define LOGLIT(...)
Definition logging.hpp:99
void kissat_reset_poisoned(kissat *solver)
Definition minimize.c:145
#define GET_OPTION(N)
Definition options.h:295
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
int lit
Definition satVec.h:130
#define IDX(LIT)
Definition literal.h:28
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kissat_minimize_literal()

bool kissat_minimize_literal ( kissat * solver,
unsigned lit,
bool lit_in_clause )

Definition at line 138 of file minimize.c.

139 {
140 KISSAT_assert (EMPTY_STACK (solver->minimize));
141 return minimize_literal (solver, false, solver->assigned, lit,
142 !lit_in_clause);
143}

◆ kissat_reset_poisoned()

void kissat_reset_poisoned ( kissat * solver)

Definition at line 145 of file minimize.c.

145 {
146 LOG ("reset %zu poisoned variables", SIZE_STACK (solver->poisoned));
147 assigned *assigned = solver->assigned;
148 for (all_stack (unsigned, idx, solver->poisoned)) {
149 KISSAT_assert (idx < VARS);
150 struct assigned *a = assigned + idx;
152 a->poisoned = false;
153 }
154 CLEAR_STACK (solver->poisoned);
155}
#define all_stack(T, E, S)
Definition stack.h:94
#define SIZE_STACK(S)
Definition stack.h:19
#define CLEAR_STACK(S)
Definition stack.h:50
#define VARS
Definition internal.h:250
bool poisoned
Definition assign.h:24
Here is the caller graph for this function: