ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
inlineassign.h
Go to the documentation of this file.
1#ifndef _inlineassign_h_INLCUDED
2#define _inlineassign_h_INLCUDED
3
4#include "global.h"
6
7#ifdef FAST_ASSIGN
8#define kissat_assign kissat_fast_assign
9#endif
10
11static inline void kissat_assign (kissat *solver, const bool probing,
12 const unsigned level,
13#ifdef FAST_ASSIGN
14 value *values, assigned *assigned,
15#endif
16 bool binary, unsigned lit,
17 unsigned reason) {
18 const unsigned not_lit = NOT (lit);
19
20 watches watches = WATCHES (not_lit);
21 if (!kissat_empty_vector (&watches)) {
23#ifndef WIN32
24 __builtin_prefetch (w, 0, 1);
25#endif
26 }
27
28#ifndef FAST_ASSIGN
29 value *values = solver->values;
30#endif
31 KISSAT_assert (!values[lit]);
32 KISSAT_assert (!values[not_lit]);
33
34 values[lit] = 1;
35 values[not_lit] = -1;
36
37 KISSAT_assert (solver->unassigned > 0);
38 solver->unassigned--;
39
40 if (!level) {
42 KISSAT_assert (solver->unflushed < UINT_MAX);
43 solver->unflushed++;
44 if (reason != UNIT_REASON) {
47 reason = UNIT_REASON;
48 binary = false;
49 }
50 }
51
52 const size_t trail = SIZE_ARRAY (solver->trail);
53 PUSH_ARRAY (solver->trail, lit);
54
55 const unsigned idx = IDX (lit);
56
57#if !defined(PROBING_PROPAGATION)
58 if (!probing) {
59 const bool negated = NEGATED (lit);
60 const value new_value = BOOL_TO_VALUE (negated);
61 value *saved = &SAVED (idx);
62 *saved = new_value;
63 }
64#endif
65
66 struct assigned b;
67
68 b.level = level;
69 b.trail = trail;
70
71 b.analyzed = false;
72 b.binary = binary;
73 b.poisoned = false;
74 b.reason = reason;
75 b.removable = false;
76 b.shrinkable = false;
77
78#ifndef FAST_ASSIGN
79 assigned *assigned = solver->assigned;
80#endif
81 struct assigned *a = assigned + idx;
82 *a = b;
83}
84
85static inline unsigned
86kissat_assignment_level (kissat *solver, value *values, assigned *assigned,
87 unsigned lit, clause *reason) {
88 unsigned res = 0;
89 for (all_literals_in_clause (other, reason)) {
90 if (other == lit)
91 continue;
92 KISSAT_assert (values[other] < 0), (void) values;
93 const unsigned other_idx = IDX (other);
94 struct assigned *a = assigned + other_idx;
95 const unsigned level = a->level;
96 if (res < level)
97 res = level;
98 }
99#ifdef KISSAT_NDEBUG
100 (void) solver;
101#endif
102 return res;
103}
104
106
107#endif
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
#define SIZE_ARRAY
Definition array.h:24
#define PUSH_ARRAY(A, E)
Definition array.h:26
#define UNIT_REASON
Definition assign.h:10
ABC_NAMESPACE_IMPL_START typedef signed char value
#define CHECK_AND_ADD_UNIT(...)
Definition check.h:155
#define FAST_ASSIGN
Definition fastassign.h:4
void kissat_mark_fixed_literal(kissat *solver, unsigned lit)
Definition flags.c:62
#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 SAVED(IDX)
Definition phases.h:20
#define ADD_UNIT_TO_PROOF(...)
Definition proof.h:141
int lit
Definition satVec.h:130
#define NEGATED(LIT)
Definition literal.h:35
#define IDX(LIT)
Definition literal.h:28
#define NOT(LIT)
Definition literal.h:33
bool binary
Definition assign.h:23
unsigned trail
Definition assign.h:20
unsigned reason
Definition assign.h:28
unsigned level
Definition assign.h:19
Definition watch.h:41
#define BOOL_TO_VALUE(B)
Definition value.h:14
#define BEGIN_WATCHES(WS)
Definition watch.h:115
vector watches
Definition watch.h:49
#define WATCHES(LIT)
Definition watch.h:137