ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
inline.h
Go to the documentation of this file.
1#ifndef _inline_h_INCLUDED
2#define _inline_h_INCLUDED
3
4#include "inlinevector.h"
5#include "logging.h"
6
7#include "global.h"
9
10#ifdef METRICS
11
12static inline size_t kissat_allocated (kissat *solver) {
13 return solver->statistics.allocated_current;
14}
15
16#endif
17
18static inline bool kissat_propagated (kissat *solver) {
19 KISSAT_assert (BEGIN_ARRAY (solver->trail) <= solver->propagate);
20 KISSAT_assert (solver->propagate <= END_ARRAY (solver->trail));
21 return solver->propagate == END_ARRAY (solver->trail);
22}
23
24static inline bool kissat_trail_flushed (kissat *solver) {
25 return !solver->unflushed && EMPTY_ARRAY (solver->trail);
26}
27
28static inline void kissat_reset_propagate (kissat *solver) {
29 solver->propagate = BEGIN_ARRAY (solver->trail);
30}
31
32static inline value kissat_fixed (kissat *solver, unsigned lit) {
34 const value res = solver->values[lit];
35 if (!res)
36 return 0;
37 if (LEVEL (lit))
38 return 0;
39 return res;
40}
41
42static inline void kissat_mark_removed_literal (kissat *solver,
43 unsigned lit) {
44 const unsigned idx = IDX (lit);
45 flags *flags = FLAGS (idx);
46 if (flags->fixed)
47 return;
48 if (!flags->eliminate) {
49 LOG ("marking %s to be eliminated", LOGVAR (idx));
50 flags->eliminate = true;
51 INC (variables_eliminate);
52 }
53}
54
55static inline void kissat_mark_added_literal (kissat *solver,
56 unsigned lit) {
57 const unsigned idx = IDX (lit);
58 flags *flags = FLAGS (idx);
59 if (!flags->subsume) {
60 LOG ("marking %s to forward subsume", LOGVAR (idx));
61 flags->subsume = true;
62 INC (variables_subsume);
63 }
64 const unsigned bit = 1u << NEGATED (lit);
65 if (!(flags->factor & bit)) {
66 flags->factor |= bit;
67 LOG ("marking literal %s to factor", LOGLIT (lit));
68 INC (literals_factor);
69 }
70}
71
72static inline void
73kissat_push_large_watch (kissat *solver, watches *watches, reference ref) {
74 const watch watch = kissat_large_watch (ref);
76}
77
78static inline void kissat_push_binary_watch (kissat *solver,
80 unsigned other) {
81 const watch watch = kissat_binary_watch (other);
83}
84
85static inline void kissat_push_blocking_watch (kissat *solver,
87 unsigned blocking,
88 reference ref) {
89 KISSAT_assert (solver->watching);
90 const watch head = kissat_blocking_watch (blocking);
91 PUSH_WATCHES (*watches, head);
92 const watch tail = kissat_large_watch (ref);
93 PUSH_WATCHES (*watches, tail);
94}
95
96static inline void kissat_watch_other (kissat *solver, unsigned lit,
97 unsigned other) {
98 LOGBINARY (lit, other, "watching %s blocking %s in", LOGLIT (lit),
99 LOGLIT (other));
101 kissat_push_binary_watch (solver, watches, other);
102}
103
104static inline void kissat_watch_binary (kissat *solver, unsigned a,
105 unsigned b) {
106 kissat_watch_other (solver, a, b);
107 kissat_watch_other (solver, b, a);
108}
109
110static inline void kissat_watch_blocking (kissat *solver, unsigned lit,
111 unsigned blocking,
112 reference ref) {
113 KISSAT_assert (solver->watching);
114 LOGREF3 (ref, "watching %s blocking %s in", LOGLIT (lit),
115 LOGLIT (blocking));
117 kissat_push_blocking_watch (solver, watches, blocking, ref);
118}
119
120static inline void kissat_unwatch_blocking (kissat *solver, unsigned lit,
121 reference ref) {
122 KISSAT_assert (solver->watching);
123 LOGREF3 (ref, "unwatching %s in", LOGLIT (lit));
126}
127
128static inline void kissat_disconnect_binary (kissat *solver, unsigned lit,
129 unsigned other) {
130 KISSAT_assert (!solver->watching);
132 const watch watch = kissat_binary_watch (other);
134}
135
136static inline void
137kissat_disconnect_reference (kissat *solver, unsigned lit, reference ref) {
138 KISSAT_assert (!solver->watching);
139 LOGREF3 (ref, "disconnecting %s in", LOGLIT (lit));
140 const watch watch = kissat_large_watch (ref);
143}
144
145static inline void kissat_watch_reference (kissat *solver, unsigned a,
146 unsigned b, reference ref) {
147 KISSAT_assert (solver->watching);
148 kissat_watch_blocking (solver, a, b, ref);
149 kissat_watch_blocking (solver, b, a, ref);
150}
151
152static inline void kissat_connect_literal (kissat *solver, unsigned lit,
153 reference ref) {
154 KISSAT_assert (!solver->watching);
155 LOGREF3 (ref, "connecting %s in", LOGLIT (lit));
157 kissat_push_large_watch (solver, watches, ref);
158}
159
160static inline clause *kissat_unchecked_dereference_clause (kissat *solver,
161 reference ref) {
162 return (clause *) &PEEK_STACK (solver->arena, ref);
163}
164
165static inline clause *kissat_dereference_clause (kissat *solver,
166 reference ref) {
167 clause *res = kissat_unchecked_dereference_clause (solver, ref);
168 KISSAT_assert (kissat_clause_in_arena (solver, res));
169 return res;
170}
171
172static inline reference kissat_reference_clause (kissat *solver,
173 const clause *c) {
174 KISSAT_assert (kissat_clause_in_arena (solver, c));
175 return (ward *) c - BEGIN_STACK (solver->arena);
176}
177
178static inline void kissat_inlined_connect_clause (kissat *solver,
179 watches *all_watches,
180 clause *c,
181 reference ref) {
182 KISSAT_assert (!solver->watching);
183 KISSAT_assert (ref == kissat_reference_clause (solver, c));
184 KISSAT_assert (c == kissat_dereference_clause (solver, ref));
185 for (all_literals_in_clause (lit, c)) {
186 KISSAT_assert (!solver->watching);
187 LOGREF3 (ref, "connecting %s in", LOGLIT (lit));
189 watches *lit_watches = all_watches + lit;
190 kissat_push_large_watch (solver, lit_watches, ref);
191 }
192}
193
194static inline void kissat_watch_clause (kissat *solver, clause *c) {
195 KISSAT_assert (c->searched < c->size);
196 const reference ref = kissat_reference_clause (solver, c);
197 kissat_watch_reference (solver, c->lits[0], c->lits[1], ref);
198}
199
200static inline int kissat_export_literal (kissat *solver, unsigned ilit) {
201 const unsigned iidx = IDX (ilit);
202 KISSAT_assert (iidx < (unsigned) INT_MAX);
203 int elit = PEEK_STACK (solver->export_, iidx);
204 if (!elit)
205 return 0;
206 if (NEGATED (ilit))
207 elit = -elit;
209 return elit;
210}
211
212static inline unsigned kissat_map_literal (kissat *solver, unsigned ilit,
213 bool map) {
214 if (!map)
215 return ilit;
216 int elit = kissat_export_literal (solver, ilit);
217 if (!elit)
218 return INVALID_LIT;
219 const unsigned eidx = ABS (elit);
220 const import *const import = &PEEK_STACK (solver->import, eidx);
221 if (import->eliminated)
222 return INVALID_LIT;
223 unsigned mlit = import->lit;
224 if (elit < 0)
225 mlit = NOT (mlit);
226 return mlit;
227}
228
229static inline clause *kissat_last_irredundant_clause (kissat *solver) {
230 return (solver->last_irredundant == INVALID_REF)
231 ? 0
232 : kissat_dereference_clause (solver, solver->last_irredundant);
233}
234
235static inline clause *kissat_binary_conflict (kissat *solver, unsigned a,
236 unsigned b) {
237 LOGBINARY (a, b, "conflicting");
238 clause *res = &solver->conflict;
239 res->size = 2;
240 unsigned *lits = res->lits;
241 lits[0] = a;
242 lits[1] = b;
243 return res;
244}
245
246static inline void kissat_push_analyzed (kissat *solver, assigned *assigned,
247 unsigned idx) {
248 KISSAT_assert (idx < VARS);
249 struct assigned *a = assigned + idx;
251 a->analyzed = true;
252 PUSH_STACK (solver->analyzed, idx);
253 LOG2 ("%s analyzed", LOGVAR (idx));
254}
255
256static inline bool kissat_analyzed (kissat *solver) {
257 return !EMPTY_STACK (solver->analyzed);
258}
259
260static inline void
261kissat_push_removable (kissat *solver, assigned *assigned, unsigned idx) {
262 KISSAT_assert (idx < VARS);
263 struct assigned *a = assigned + idx;
265 a->removable = true;
266 PUSH_STACK (solver->removable, idx);
267 LOG2 ("%s removable", LOGVAR (idx));
268}
269
270static inline void kissat_push_poisoned (kissat *solver, assigned *assigned,
271 unsigned idx) {
272 KISSAT_assert (idx < VARS);
273 struct assigned *a = assigned + idx;
275 a->poisoned = true;
276 PUSH_STACK (solver->poisoned, idx);
277 LOG2 ("%s poisoned", LOGVAR (idx));
278}
279
280static inline void
281kissat_push_shrinkable (kissat *solver, assigned *assigned, unsigned idx) {
282 KISSAT_assert (idx < VARS);
283 struct assigned *a = assigned + idx;
285 a->shrinkable = true;
286 PUSH_STACK (solver->shrinkable, idx);
287 LOG2 ("%s shrinkable", LOGVAR (idx));
288}
289
290static inline int kissat_checking (kissat *solver) {
291#ifndef KISSAT_NDEBUG
292#ifdef KISSAT_NOPTIONS
293 (void) solver;
294#endif
295 return GET_OPTION (check);
296#else
297 (void) solver;
298 return 0;
299#endif
300}
301
302static inline bool kissat_logging (kissat *solver) {
303#ifdef LOGGING
304#ifdef KISSAT_NOPTIONS
305 (void) solver;
306#endif
307 return GET_OPTION (log) > 0;
308#else
309 (void) solver;
310 return false;
311#endif
312}
313
314static inline bool kissat_proving (kissat *solver) {
315#ifdef KISSAT_NPROOFS
316 (void) solver;
317 return false;
318#else
319 return solver->proof != 0;
320#endif
321}
322
323static inline bool kissat_checking_or_proving (kissat *solver) {
324 return kissat_checking (solver) || kissat_proving (solver);
325}
326
327#if !defined(KISSAT_NDEBUG) || !defined(KISSAT_NPROOFS)
328#define CHECKING_OR_PROVING
329#endif
330
332
333#endif
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
ABC_NAMESPACE_HEADER_START typedef word ward
Definition arena.h:12
#define EMPTY_ARRAY
Definition array.h:23
#define BEGIN_ARRAY
Definition array.h:50
#define END_ARRAY
Definition array.h:51
#define LEVEL(LIT)
Definition assign.h:34
#define BEGIN_STACK(S)
Definition stack.h:46
#define EMPTY_STACK(S)
Definition stack.h:18
#define PUSH_STACK(S, E)
Definition stack.h:39
#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
void map()
#define VARS
Definition internal.h:250
#define LITS
Definition internal.h:251
#define all_literals_in_clause(LIT, C)
Definition clause.h:47
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define LOGBINARY(...)
Definition logging.h:442
#define LOG2(...)
Definition logging.h:352
#define LOGREF3(...)
Definition logging.h:439
#define LOGLIT(...)
Definition logging.hpp:99
unsigned short ref
Definition giaNewBdd.h:38
#define GET_OPTION(N)
Definition options.h:295
#define INVALID_REF
Definition reference.h:16
ABC_NAMESPACE_HEADER_START typedef unsigned reference
Definition reference.h:9
int lit
Definition satVec.h:130
#define VALID_EXTERNAL_LITERAL(LIT)
Definition literal.h:25
#define NEGATED(LIT)
Definition literal.h:35
#define IDX(LIT)
Definition literal.h:28
#define NOT(LIT)
Definition literal.h:33
bool analyzed
Definition assign.h:22
bool removable
Definition assign.h:25
bool poisoned
Definition assign.h:24
bool shrinkable
Definition assign.h:26
unsigned lits[3]
Definition clause.h:39
unsigned searched
Definition clause.h:36
unsigned size
Definition clause.h:37
Definition flags.h:11
bool eliminate
Definition flags.h:15
unsigned factor
Definition flags.h:17
bool fixed
Definition flags.h:18
bool subsume
Definition flags.h:19
bool eliminated
Definition internal.h:52
Definition watch.h:41
#define ABS(a)
Definition util_old.h:250
void kissat_remove_blocking_watch(kissat *solver, watches *watches, reference ref)
Definition watch.c:46
#define PUSH_WATCHES(W, E)
Definition watch.h:106
#define REMOVE_WATCHES(W, E)
Definition watch.h:134
vector watches
Definition watch.h:49
#define WATCHES(LIT)
Definition watch.h:137