ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
eliminate.c File Reference
#include "eliminate.h"
#include "allocate.h"
#include "backtrack.h"
#include "collect.h"
#include "dense.h"
#include "forward.h"
#include "inline.h"
#include "inlineheap.h"
#include "kitten.h"
#include "print.h"
#include "propdense.h"
#include "report.h"
#include "resolve.h"
#include "terminate.h"
#include "trail.h"
#include "weaken.h"
#include <inttypes.h>
#include <math.h>
Include dependency graph for eliminate.c:

Go to the source code of this file.

Functions

ABC_NAMESPACE_IMPL_START bool kissat_eliminating (kissat *solver)
 
void kissat_update_variable_score (kissat *solver, unsigned idx)
 
void kissat_eliminate_binary (kissat *solver, unsigned lit, unsigned other)
 
void kissat_eliminate_clause (kissat *solver, clause *c, unsigned lit)
 
void kissat_flush_units_while_connected (kissat *solver)
 
int kissat_eliminate (kissat *solver)
 

Function Documentation

◆ kissat_eliminate()

int kissat_eliminate ( kissat * solver)

Definition at line 597 of file eliminate.c.

597 {
598 KISSAT_assert (!solver->inconsistent);
599 INC (eliminations);
600 eliminate (solver);
602 UPDATE_CONFLICT_LIMIT (eliminate, eliminations, NLOG2N, true);
603 solver->last.ticks.eliminate = solver->statistics_.search_ticks;
604 return solver->inconsistent ? 20 : 0;
605}
#define INC(NAME)
ABC_NAMESPACE_IMPL_START void kissat_classify(struct kissat *solver)
Definition classify.c:7
#define NLOG2N(COUNT)
Definition kimits.h:110
#define UPDATE_CONFLICT_LIMIT(NAME, COUNT, SCALE_COUNT_FUNCTION, SCALE_DELTA)
Definition kimits.h:115
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kissat_eliminate_binary()

void kissat_eliminate_binary ( kissat * solver,
unsigned lit,
unsigned other )

Definition at line 121 of file eliminate.c.

122 {
123 kissat_disconnect_binary (solver, other, lit);
125 update_after_removing_variable (solver, IDX (other));
126}
void kissat_delete_binary(kissat *solver, unsigned a, unsigned b)
Definition clause.c:181
int lit
Definition satVec.h:130
#define IDX(LIT)
Definition literal.h:28
Here is the call graph for this function:

◆ kissat_eliminate_clause()

void kissat_eliminate_clause ( kissat * solver,
clause * c,
unsigned lit )

Definition at line 128 of file eliminate.c.

128 {
130 update_after_removing_clause (solver, c, lit);
131}
void kissat_mark_clause_as_garbage(kissat *solver, clause *c)
Definition clause.c:164
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kissat_eliminating()

ABC_NAMESPACE_IMPL_START bool kissat_eliminating ( kissat * solver)

Definition at line 23 of file eliminate.c.

23 {
24 if (!solver->enabled.eliminate)
25 return false;
26 statistics *statistics = &solver->statistics_;
27 if (!statistics->clauses_irredundant)
28 return false;
29 const uint64_t conflicts = statistics->conflicts;
30 if (solver->last.conflicts.reduce == conflicts)
31 return false;
32 limits *limits = &solver->limits;
33 if (limits->eliminate.conflicts > conflicts)
34 return false;
35 if (limits->eliminate.variables.eliminate <
36 statistics->variables_eliminate)
37 return true;
38 if (limits->eliminate.variables.subsume < statistics->variables_subsume)
39 return true;
40 return false;
41}
uint64_t eliminate
Definition kimits.h:39
Here is the caller graph for this function:

◆ kissat_flush_units_while_connected()

void kissat_flush_units_while_connected ( kissat * solver)

Definition at line 162 of file eliminate.c.

162 {
163 const unsigned *propagate = solver->propagate;
164 const unsigned *end_trail = END_ARRAY (solver->trail);
165 KISSAT_assert (propagate <= end_trail);
166 const size_t units = end_trail - propagate;
167 if (!units)
168 return;
169#ifdef LOGGING
170 LOG ("propagating and flushing %zu units", units);
171#endif
173 return;
174 LOG ("marking and flushing unit satisfied clauses");
175
176 end_trail = END_ARRAY (solver->trail);
177 while (propagate != end_trail) {
178 const unsigned unit = *propagate++;
179 watches *unit_watches = &WATCHES (unit);
180 watch *begin = BEGIN_WATCHES (*unit_watches), *q = begin;
181 const watch *const end = END_WATCHES (*unit_watches), *p = q;
182 if (begin == end)
183 continue;
184 LOG ("marking %s satisfied clauses as garbage", LOGLIT (unit));
185 while (p != end) {
186 const watch watch = *q++ = *p++;
187 if (watch.type.binary) {
188 const unsigned other = watch.binary.lit;
189 if (!solver->values[other])
190 update_after_removing_variable (solver, IDX (other));
191 } else {
192 const reference ref = watch.large.ref;
193 clause *c = kissat_dereference_clause (solver, ref);
194 if (!c->garbage)
197 q--;
198 }
199 }
200 KISSAT_assert (q <= end);
201 size_t flushed = end - q;
202 if (!flushed)
203 continue;
204 LOG ("flushing %zu references satisfied by %s", flushed, LOGLIT (unit));
205 SET_END_OF_WATCHES (*unit_watches, q);
206 }
207}
#define END_ARRAY
Definition array.h:51
#define LOG(...)
void kissat_eliminate_clause(kissat *solver, clause *c, unsigned lit)
Definition eliminate.c:128
Cube * p
Definition exorList.c:222
#define LOGLIT(...)
Definition logging.hpp:99
unsigned short ref
Definition giaNewBdd.h:38
bool kissat_dense_propagate(kissat *solver)
Definition propdense.c:88
ABC_NAMESPACE_HEADER_START typedef unsigned reference
Definition reference.h:9
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
#define BEGIN_WATCHES(WS)
Definition watch.h:115
#define END_WATCHES(WS)
Definition watch.h:118
#define SET_END_OF_WATCHES(WS, P)
Definition watch.h:128
vector watches
Definition watch.h:49
#define WATCHES(LIT)
Definition watch.h:137
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kissat_update_variable_score()

void kissat_update_variable_score ( kissat * solver,
unsigned idx )

Definition at line 82 of file eliminate.c.

82 {
83 update_variable_score (solver, &solver->schedule, idx);
84}
Here is the caller graph for this function: