ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
solver.h
Go to the documentation of this file.
1//===--- solver.h -----------------------------------------------------------===
2//
3// satoko: Satisfiability solver
4//
5// This file is distributed under the BSD 2-Clause License.
6// See LICENSE for details.
7//
8//===------------------------------------------------------------------------===
9#ifndef satoko__solver_h
10#define satoko__solver_h
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15#include <assert.h>
16
17#include "clause.h"
18#include "cdb.h"
19#include "satoko.h"
20#include "types.h"
21#include "watch_list.h"
22#include "utils/b_queue.h"
23#include "utils/heap.h"
24#include "utils/mem.h"
25#include "utils/misc.h"
26#include "utils/vec/vec_char.h"
27#include "utils/vec/vec_sdbl.h"
28#include "utils/vec/vec_uint.h"
29
32
33
34
35#define UNDEF 0xFFFFFFFF
36
37typedef struct solver_t_ solver_t;
38struct solver_t_ {
39 int status;
40 /* User data */
43
44 /* Clauses Database */
49
50 /* Activity heuristic */
51 act_t var_act_inc; /* Amount to bump next variable with. */
52 clause_act_t clause_act_inc; /* Amount to bump next clause with. */
53
54 /* Variable Information */
55 vec_act_t *activity; /* A heuristic measurement of the activity of a variable. */
57 vec_uint_t *levels; /* Decision level of the current assignment */
58 vec_uint_t *reasons; /* Reason (clause) of the current assignment */
61
62 /* Assignments */
64 vec_uint_t *trail_lim; /* Separator indices for different decision levels in 'trail'. */
65 unsigned i_qhead; /* Head of propagation queue (as index into the trail). */
66 unsigned n_assigns_simplify; /* Number of top-level assignments since
67 last execution of 'simplify()'. */
68 long n_props_simplify; /* Remaining number of propagations that
69 must be made before next execution of
70 'simplify()'. */
71
72 /* Temporary data used by Analyze */
75 vec_uint_t *tagged; /* Stack */
78
79 /* Temporary data used by Search method */
82 long RC1;
83 long RC2;
85 float sum_lbd;
86
87 /* Misc temporary */
88 unsigned cur_stamp; /* Used for marking literals and levels of interest */
89 vec_uint_t *stamps; /* Multipurpose stamp used to calculate LBD and
90 * clauses minimization with binary resolution */
91
92 /* Bookmark */
93 unsigned book_cl_orig; /* Bookmark for orignal problem clauses vector */
94 unsigned book_cl_lrnt; /* Bookmark for learnt clauses vector */
95 unsigned book_cdb; /* Bookmark clause database size */
96 unsigned book_vars; /* Bookmark number of variables */
97 unsigned book_trail; /* Bookmark trail size */
98 // unsigned book_qhead; /* Bookmark propagation queue head */
99
100 /* Temporary data used for solving cones */
102
103 /* Callbacks to stop the solver */
105 int *pstop;
106 int RunId;
107 int (*pFuncStop)(int);
108
111};
112
113//===------------------------------------------------------------------------===
114extern unsigned solver_clause_create(solver_t *, vec_uint_t *, unsigned);
115extern char solver_search(solver_t *);
116extern void solver_cancel_until(solver_t *, unsigned);
117extern unsigned solver_propagate(solver_t *);
118
119/* Debuging */
120extern void solver_debug_check(solver_t *, int);
123
124//===------------------------------------------------------------------------===
125// Inline var/lit functions
126//===------------------------------------------------------------------------===
127static inline unsigned var2lit(unsigned var, char polarity)
128{
129 return var + var + ((unsigned) polarity != 0);
130}
131
132static inline unsigned lit2var(unsigned lit)
133{
134 return lit >> 1;
135}
136//===------------------------------------------------------------------------===
137// Inline var functions
138//===------------------------------------------------------------------------===
139static inline char var_value(solver_t *s, unsigned var)
140{
141 return vec_char_at(s->assigns, var);
142}
143
144static inline unsigned var_dlevel(solver_t *s, unsigned var)
145{
146 return vec_uint_at(s->levels, var);
147}
148
149static inline unsigned var_reason(solver_t *s, unsigned var)
150{
151 return vec_uint_at(s->reasons, var);
152}
153static inline int var_mark(solver_t *s, unsigned var)
154{
155 return (int)vec_char_at(s->marks, var);
156}
157static inline void var_set_mark(solver_t *s, unsigned var)
158{
159 vec_char_assign(s->marks, var, 1);
160}
161static inline void var_clean_mark(solver_t *s, unsigned var)
162{
163 vec_char_assign(s->marks, var, 0);
164}
165//===------------------------------------------------------------------------===
166// Inline lit functions
167//===------------------------------------------------------------------------===
168static inline unsigned lit_compl(unsigned lit)
169{
170 return lit ^ 1;
171}
172
173static inline char lit_polarity(unsigned lit)
174{
175 return (char)(lit & 1);
176}
177
178static inline char lit_value(solver_t *s, unsigned lit)
179{
180 return lit_polarity(lit) ^ vec_char_at(s->assigns, lit2var(lit));
181}
182
183static inline unsigned lit_dlevel(solver_t *s, unsigned lit)
184{
185 return vec_uint_at(s->levels, lit2var(lit));
186}
187
188static inline unsigned lit_reason(solver_t *s, unsigned lit)
189{
190 return vec_uint_at(s->reasons, lit2var(lit));
191}
192//===------------------------------------------------------------------------===
193// Inline solver minor functions
194//===------------------------------------------------------------------------===
195static inline unsigned solver_check_limits(solver_t *s)
196{
197 return (s->opts.conf_limit == 0 || s->opts.conf_limit >= s->stats.n_conflicts) &&
198 (s->opts.prop_limit == 0 || s->opts.prop_limit >= s->stats.n_propagations);
199}
200
202static inline unsigned solver_dlevel(solver_t *s)
203{
204 return vec_uint_size(s->trail_lim);
205}
206
207static inline int solver_enqueue(solver_t *s, unsigned lit, unsigned reason)
208{
209 unsigned var = lit2var(lit);
210
211 vec_char_assign(s->assigns, var, lit_polarity(lit));
212 vec_char_assign(s->polarity, var, lit_polarity(lit));
213 vec_uint_assign(s->levels, var, solver_dlevel(s));
214 vec_uint_assign(s->reasons, var, reason);
215 vec_uint_push_back(s->trail, lit);
216 return SATOKO_OK;
217}
218
219static inline int solver_has_marks(satoko_t *s)
220{
221 return (int)(s->marks != NULL);
222}
223
224static inline int solver_stop(satoko_t *s)
225{
226 return s->pstop && *s->pstop;
227}
228
229//===------------------------------------------------------------------------===
230// Inline clause functions
231//===------------------------------------------------------------------------===
232static inline struct clause *clause_fetch(solver_t *s, unsigned cref)
233{
234 return cdb_handler(s->all_clauses, cref);
235}
236
237static inline void clause_watch(solver_t *s, unsigned cref)
238{
239 struct clause *clause = cdb_handler(s->all_clauses, cref);
240 struct watcher w1;
241 struct watcher w2;
242
243 w1.cref = cref;
244 w2.cref = cref;
245 w1.blocker = clause->data[1].lit;
246 w2.blocker = clause->data[0].lit;
247 watch_list_push(vec_wl_at(s->watches, lit_compl(clause->data[0].lit)), w1, (clause->size == 2));
248 watch_list_push(vec_wl_at(s->watches, lit_compl(clause->data[1].lit)), w2, (clause->size == 2));
249}
250
251static inline void clause_unwatch(solver_t *s, unsigned cref)
252{
253 struct clause *clause = cdb_handler(s->all_clauses, cref);
254 watch_list_remove(vec_wl_at(s->watches, lit_compl(clause->data[0].lit)), cref, (clause->size == 2));
255 watch_list_remove(vec_wl_at(s->watches, lit_compl(clause->data[1].lit)), cref, (clause->size == 2));
256}
257
259#endif /* satoko__solver_h */
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_HEADER_START struct b_queue_t_ b_queue_t
Definition b_queue.h:18
unsigned short var
Definition giaNewBdd.h:35
int lit
Definition satVec.h:130
char solver_search(solver_t *)
Definition solver.c:627
struct solver_t_ solver_t
Definition solver.h:37
unsigned solver_clause_create(solver_t *, vec_uint_t *, unsigned)
Definition solver.c:483
void solver_debug_check_clauses(solver_t *)
Definition solver.c:725
void solver_cancel_until(solver_t *, unsigned)
Definition solver.c:515
unsigned solver_propagate(solver_t *)
Definition solver.c:534
void solver_debug_check_trail(solver_t *)
Definition solver.c:696
void solver_debug_check(solver_t *, int)
Definition solver.c:749
typedefABC_NAMESPACE_HEADER_START struct heap_t_ heap_t
Definition heap.h:21
struct solver_t_ satoko_t
Definition satoko.h:35
@ SATOKO_OK
Definition satoko.h:19
Definition cdb.h:18
union clause::@075032140136325172206014200035176200302203305006 data[0]
unsigned size
Definition clause.h:37
unsigned lit
Definition clause.h:25
long prop_limit
Definition satoko.h:41
long conf_limit
Definition satoko.h:40
long n_conflicts
Definition satoko.h:81
long n_propagations
Definition satoko.h:78
vec_char_t * assigns
Definition solver.h:59
vec_char_t * seen
Definition solver.h:74
vec_uint_t * final_conflict
Definition solver.h:42
struct satoko_opts opts
Definition solver.h:110
b_queue_t * bq_lbd
Definition solver.h:81
vec_uint_t * stack
Definition solver.h:76
vec_uint_t * levels
Definition solver.h:57
unsigned book_cl_orig
Definition solver.h:93
unsigned book_vars
Definition solver.h:96
long n_props_simplify
Definition solver.h:68
int status
Definition solver.h:39
unsigned cur_stamp
Definition solver.h:88
vec_uint_t * trail_lim
Definition solver.h:64
vec_uint_t * originals
Definition solver.h:47
unsigned book_trail
Definition solver.h:97
act_t var_act_inc
Definition solver.h:51
vec_uint_t * learnts
Definition solver.h:46
unsigned i_qhead
Definition solver.h:65
vec_char_t * polarity
Definition solver.h:60
vec_uint_t * assumptions
Definition solver.h:41
vec_uint_t * stamps
Definition solver.h:89
vec_uint_t * trail
Definition solver.h:63
int(* pFuncStop)(int)
Definition solver.h:107
struct cdb * all_clauses
Definition solver.h:45
vec_uint_t * tagged
Definition solver.h:75
unsigned n_assigns_simplify
Definition solver.h:66
long RC2
Definition solver.h:83
vec_char_t * marks
Definition solver.h:101
abctime nRuntimeLimit
Definition solver.h:104
b_queue_t * bq_trail
Definition solver.h:80
int RunId
Definition solver.h:106
vec_uint_t * reasons
Definition solver.h:58
vec_act_t * activity
Definition solver.h:55
vec_wl_t * watches
Definition solver.h:48
long RC1
Definition solver.h:82
float sum_lbd
Definition solver.h:85
vec_uint_t * temp_lits
Definition solver.h:73
clause_act_t clause_act_inc
Definition solver.h:52
int * pstop
Definition solver.h:105
vec_uint_t * last_dlevel
Definition solver.h:77
long n_confl_bfr_reduce
Definition solver.h:84
struct satoko_stats stats
Definition solver.h:109
heap_t * var_order
Definition solver.h:56
unsigned book_cdb
Definition solver.h:95
unsigned book_cl_lrnt
Definition solver.h:94
unsigned cref
Definition watch_list.h:19
unsigned clause_act_t
Definition types.h:36
vec_sdbl_t vec_act_t
Definition types.h:24
sdbl_t act_t
Definition types.h:23
typedefABC_NAMESPACE_HEADER_START struct vec_char_t_ vec_char_t
Definition vec_char.h:21
typedefABC_NAMESPACE_HEADER_START struct vec_uint_t_ vec_uint_t
Definition vec_uint.h:21
struct vec_wl_t_ vec_wl_t
Definition watch_list.h:30