ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
satSolver.h
Go to the documentation of this file.
1/**************************************************************************************************
2MiniSat -- Copyright (c) 2005, Niklas Sorensson
3http://www.cs.chalmers.se/Cs/Research/FormalMethods/MiniSat/
4
5Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
6associated documentation files (the "Software"), to deal in the Software without restriction,
7including without limitation the rights to use, copy, modify, merge, publish, distribute,
8sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
9furnished to do so, subject to the following conditions:
10
11The above copyright notice and this permission notice shall be included in all copies or
12substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
15NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
16NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
17DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
18OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19**************************************************************************************************/
20// Modified to compile with MS Visual Studio 6.0 by Alan Mishchenko
21
22#ifndef ABC__sat__bsat__satSolver_h
23#define ABC__sat__bsat__satSolver_h
24
25
26#include <stdio.h>
27#include <stdlib.h>
28#include <string.h>
29#include <assert.h>
30
31#include "satVec.h"
32#include "satClause.h"
34
36
37//=================================================================================================
38// Public interface:
39
40struct sat_solver_t;
41typedef struct sat_solver_t sat_solver;
42
43extern sat_solver* sat_solver_new(void);
44extern sat_solver* zsat_solver_new_seed(double seed);
45extern void sat_solver_delete(sat_solver* s);
46
47extern int sat_solver_addclause(sat_solver* s, lit* begin, lit* end);
48extern int sat_solver_clause_new(sat_solver* s, lit* begin, lit* end, int learnt);
49extern int sat_solver_simplify(sat_solver* s);
50extern int sat_solver_solve(sat_solver* s, lit* begin, lit* end, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal);
52extern int sat_solver_solve_lexsat(sat_solver* s, int * pLits, int nLits);
53extern int sat_solver_minimize_assumptions( sat_solver* s, int * pLits, int nLits, int nConfLimit );
54extern int sat_solver_minimize_assumptions2( sat_solver* s, int * pLits, int nLits, int nConfLimit );
55extern int sat_solver_push(sat_solver* s, int p);
56extern void sat_solver_pop(sat_solver* s);
57extern void sat_solver_set_resource_limits(sat_solver* s, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal);
58extern void sat_solver_restart( sat_solver* s );
59extern void zsat_solver_restart_seed( sat_solver* s, double seed );
60extern void sat_solver_rollback( sat_solver* s );
61
62extern int sat_solver_nvars(sat_solver* s);
63extern int sat_solver_nclauses(sat_solver* s);
65extern double sat_solver_memory(sat_solver* s);
67
68extern int sat_solver_addvar(sat_solver* s);
69extern void sat_solver_setnvars(sat_solver* s,int n);
70extern int sat_solver_get_var_value(sat_solver* s, int v);
71extern void sat_solver_set_var_activity(sat_solver* s, int * pVars, int nVars);
72
73extern void Sat_SolverWriteDimacs( sat_solver * p, char * pFileName, lit* assumptionsBegin, lit* assumptionsEnd, int incrementVars );
74extern void Sat_SolverPrintStats( FILE * pFile, sat_solver * p );
75extern int * Sat_SolverGetModel( sat_solver * p, int * pVars, int nVars );
76extern void Sat_SolverDoubleClauses( sat_solver * p, int iVar );
77
78// trace recording
79extern void Sat_SolverTraceStart( sat_solver * pSat, char * pName );
80extern void Sat_SolverTraceStop( sat_solver * pSat );
81extern void Sat_SolverTraceWrite( sat_solver * pSat, int * pBeg, int * pEnd, int fRoot );
82
83// clause storage
84extern void sat_solver_store_alloc( sat_solver * s );
85extern void sat_solver_store_write( sat_solver * s, char * pFileName );
86extern void sat_solver_store_free( sat_solver * s );
89extern void * sat_solver_store_release( sat_solver * s );
90
91//=================================================================================================
92// Solver representation:
93
94//struct clause_t;
95//typedef struct clause_t clause;
96
97struct varinfo_t;
98typedef struct varinfo_t varinfo;
99
101{
102 int size; // nof variables
103 int cap; // size of varmaps
104 int qhead; // Head index of queue.
105 int qtail; // Tail index of queue.
106
107 // clauses
109 int hLearnts; // the first learnt clause
110 int hBinary; // the special binary clause
112 veci* wlists; // watcher lists
113
114 // rollback
115 int iVarPivot; // the pivot for variables
116 int iTrailPivot; // the pivot for trail
117 int hProofPivot; // the pivot for proof records
118
119 // activities
122 word var_inc; // Amount to bump next variable with.
123 word var_inc2; // Amount to bump next variable with.
124 word var_decay; // INVERSE decay factor for variable activity: stores 1/decay.
125 word* activity; // A heuristic measurement of the activity of a variable.
126 word* activity2; // backup variable activity
127 unsigned cla_inc; // Amount to bump next clause with.
128 unsigned cla_decay; // INVERSE decay factor for clause activity: stores 1/decay.
129 veci act_clas; // contain clause activities
130
131 char * pFreqs; // how many times this variable was assigned a value
133
134// varinfo * vi; // variable information
135 int* levels; //
136 char* assigns; // Current values of variables.
137 char* polarity; //
138 char* tags; //
139 char* loads; //
140
141 int* orderpos; // Index in variable order.
142 int* reasons; //
144 veci tagged; // (contains: var)
145 veci stack; // (contains: var)
146
147 veci order; // Variable order. (heap) (contains: var)
148 veci trail_lim; // Separator indices for different decision levels in 'trail'. (contains: int)
149// veci model; // If problem is solved, this vector contains the model (contains: lbool).
150 int * model; // If problem is solved, this vector contains the model (contains: lbool).
151 veci conf_final; // If problem is unsatisfiable (possibly under assumptions),
152 // this vector represent the final conflict clause expressed in the assumptions.
153
154 int root_level; // Level of first proper decision.
155 int simpdb_assigns;// Number of top-level assignments at last 'simplifyDB()'.
156 int simpdb_props; // Number of propagations before next 'simplifyDB()'.
159 int verbosity; // Verbosity level. 0=silent, 1=some progress report, 2=everything
162
164 int nLearntMax; // max number of learned clauses
165 int nLearntStart; // starting learned clause limit
166 int nLearntDelta; // delta of learned clause limit
167 int nLearntRatio; // ratio percentage of learned clauses
168 int nDBreduces; // number of DB reductions
169
170 ABC_INT64_T nConfLimit; // external limit on the number of conflicts
171 ABC_INT64_T nInsLimit; // external limit on the number of implications
172 abctime nRuntimeLimit; // external limit on runtime
173
174 veci act_vars; // variables whose activity has changed
175 double* factors; // the activity factors
176 int nRestarts; // the number of local restarts
177 int nCalls; // the number of local restarts
178 int nCalls2; // the number of local restarts
179 veci unit_lits; // variables whose activity has changed
180 veci pivot_vars; // pivot variables
181
182 int fSkipSimplify; // set to one to skip simplification of the clause database
183 int fNotUseRandom; // do not allow random decisions with a fixed probability
184 int fNoRestarts; // disables periodic restarts
185
186 int * pGlobalVars; // for experiments with global vars during interpolation
187 // clause store
188 void * pStore;
190
191 // trace recording
192 FILE * pFile;
195
196 veci temp_clause; // temporary storage for a CNF clause
197
198 // assignment storage
199 veci user_vars; // variable IDs
200 veci user_values; // values of these variables
201
202 // CNF loading
203 void * pCnfMan; // external CNF manager
204 int(*pCnfFunc)(void * p, int); // external callback
205
206 // termination callback
207 int RunId; // SAT id in this run
208 int(*pFuncStop)(int); // callback to terminate
209};
210
211static inline clause * clause_read( sat_solver * s, cla h )
212{
213 return Sat_MemClauseHand( &s->Mem, h );
214}
215
216static inline int sat_solver_var_value( sat_solver* s, int v )
217{
218 assert( v >= 0 && v < s->size );
219 return (int)(s->model[v] == l_True);
220}
221static inline int sat_solver_var_literal( sat_solver* s, int v )
222{
223 assert( v >= 0 && v < s->size );
224 return toLitCond( v, s->model[v] != l_True );
225}
226static inline void sat_solver_flip_print_clause( sat_solver* s )
227{
228 s->fPrintClause ^= 1;
229}
230static inline void sat_solver_act_var_clear(sat_solver* s)
231{
232 int i;
233 if ( s->VarActType == 0 )
234 {
235 for (i = 0; i < s->size; i++)
236 s->activity[i] = (1 << 10);
237 s->var_inc = (1 << 5);
238 }
239 else if ( s->VarActType == 1 )
240 {
241 for (i = 0; i < s->size; i++)
242 s->activity[i] = 0;
243 s->var_inc = 1;
244 }
245 else if ( s->VarActType == 2 )
246 {
247 for (i = 0; i < s->size; i++)
248 s->activity[i] = Xdbl_Const1();
249 s->var_inc = Xdbl_Const1();
250 }
251 else assert(0);
252}
253static inline void sat_solver_compress(sat_solver* s)
254{
255 if ( s->qtail != s->qhead )
256 {
257 int RetValue = sat_solver_simplify(s);
258 assert( RetValue != 0 );
259 (void) RetValue;
260 }
261}
262static inline void sat_solver_delete_p( sat_solver ** ps )
263{
264 if ( *ps )
265 sat_solver_delete( *ps );
266 *ps = NULL;
267}
268static inline void sat_solver_clean_polarity(sat_solver* s, int * pVars, int nVars )
269{
270 int i;
271 for ( i = 0; i < nVars; i++ )
272 s->polarity[pVars[i]] = 0;
273}
274static inline void sat_solver_set_polarity(sat_solver* s, int * pVars, int nVars )
275{
276 int i;
277 for ( i = 0; i < s->size; i++ )
278 s->polarity[i] = 0;
279 for ( i = 0; i < nVars; i++ )
280 s->polarity[pVars[i]] = 1;
281}
282static inline void sat_solver_set_literal_polarity(sat_solver* s, int * pLits, int nLits )
283{
284 int i;
285 for ( i = 0; i < nLits; i++ )
286 s->polarity[Abc_Lit2Var(pLits[i])] = !Abc_LitIsCompl(pLits[i]);
287}
288
289static inline int sat_solver_final(sat_solver* s, int ** ppArray)
290{
291 *ppArray = s->conf_final.ptr;
292 return s->conf_final.size;
293}
294
295static inline void sat_solver_randomize( sat_solver * pSat, int iVar, int nVars )
296{
297 int i, nPols = 0, * pVars = ABC_ALLOC( int, nVars );
298 for ( i = 0; i < nVars; i++ )
299 if ( Abc_Random(0) & 1 )
300 pVars[nPols++] = iVar + i;
301 sat_solver_set_polarity( pSat, pVars, nPols );
302 for ( i = 0; i < nVars; i++ )
303 pVars[i] = iVar + i;
304 for ( i = 0; i < nVars; i++ )
305 {
306 int j = Abc_Random(0) % nVars;
307 ABC_SWAP( int, pVars[i], pVars[j] );
308 }
309 sat_solver_set_var_activity( pSat, pVars, nVars );
310 ABC_FREE( pVars );
311}
312
313static inline abctime sat_solver_set_runtime_limit(sat_solver* s, abctime Limit)
314{
315 abctime nRuntimeLimit = s->nRuntimeLimit;
316 s->nRuntimeLimit = Limit;
317 return nRuntimeLimit;
318}
319
320static inline int sat_solver_set_random(sat_solver* s, int fNotUseRandom)
321{
322 int fNotUseRandomOld = s->fNotUseRandom;
323 s->fNotUseRandom = fNotUseRandom;
324 return fNotUseRandomOld;
325}
326
327static inline void sat_solver_bookmark(sat_solver* s)
328{
329 assert( s->qhead == s->qtail );
330 s->iVarPivot = s->size;
331 s->iTrailPivot = s->qhead;
332 Sat_MemBookMark( &s->Mem );
333 if ( s->activity2 )
334 {
335 s->var_inc2 = s->var_inc;
336 memcpy( s->activity2, s->activity, sizeof(word) * s->iVarPivot );
337 }
338}
339static inline void sat_solver_set_pivot_variables( sat_solver* s, int * pPivots, int nPivots )
340{
341 s->pivot_vars.cap = nPivots;
342 s->pivot_vars.size = nPivots;
343 s->pivot_vars.ptr = pPivots;
344}
345static inline int sat_solver_count_usedvars(sat_solver* s)
346{
347 int i, nVars = 0;
348 for ( i = 0; i < s->size; i++ )
349 if ( s->pFreqs[i] )
350 {
351 s->pFreqs[i] = 0;
352 nVars++;
353 }
354 return nVars;
355}
356static inline void sat_solver_set_runid( sat_solver *s, int id )
357{
358 s->RunId = id;
359}
360static inline void sat_solver_set_stop_func( sat_solver *s, int (*fnct)(int) )
361{
362 s->pFuncStop = fnct;
363}
364
365static inline int sat_solver_add_const( sat_solver * pSat, int iVar, int fCompl )
366{
367 lit Lits[1];
368 int Cid;
369 assert( iVar >= 0 );
370
371 Lits[0] = toLitCond( iVar, fCompl );
372 Cid = sat_solver_addclause( pSat, Lits, Lits + 1 );
373 assert( Cid );
374 return 1;
375}
376static inline int sat_solver_add_buffer( sat_solver * pSat, int iVarA, int iVarB, int fCompl )
377{
378 lit Lits[2];
379 int Cid;
380 assert( iVarA >= 0 && iVarB >= 0 );
381
382 Lits[0] = toLitCond( iVarA, 0 );
383 Lits[1] = toLitCond( iVarB, !fCompl );
384 Cid = sat_solver_addclause( pSat, Lits, Lits + 2 );
385 if ( Cid == 0 )
386 return 0;
387 assert( Cid );
388
389 Lits[0] = toLitCond( iVarA, 1 );
390 Lits[1] = toLitCond( iVarB, fCompl );
391 Cid = sat_solver_addclause( pSat, Lits, Lits + 2 );
392 if ( Cid == 0 )
393 return 0;
394 assert( Cid );
395 return 2;
396}
397static inline int sat_solver_add_buffer_enable( sat_solver * pSat, int iVarA, int iVarB, int iVarEn, int fCompl )
398{
399 lit Lits[3];
400 int Cid;
401 assert( iVarA >= 0 && iVarB >= 0 && iVarEn >= 0 );
402
403 Lits[0] = toLitCond( iVarA, 0 );
404 Lits[1] = toLitCond( iVarB, !fCompl );
405 Lits[2] = toLitCond( iVarEn, 1 );
406 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
407 assert( Cid );
408
409 Lits[0] = toLitCond( iVarA, 1 );
410 Lits[1] = toLitCond( iVarB, fCompl );
411 Lits[2] = toLitCond( iVarEn, 1 );
412 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
413 assert( Cid );
414 return 2;
415}
416static inline int sat_solver_add_and( sat_solver * pSat, int iVar, int iVar0, int iVar1, int fCompl0, int fCompl1, int fCompl )
417{
418 lit Lits[3];
419 int Cid;
420
421 Lits[0] = toLitCond( iVar, !fCompl );
422 Lits[1] = toLitCond( iVar0, fCompl0 );
423 Cid = sat_solver_addclause( pSat, Lits, Lits + 2 );
424 assert( Cid );
425
426 Lits[0] = toLitCond( iVar, !fCompl );
427 Lits[1] = toLitCond( iVar1, fCompl1 );
428 Cid = sat_solver_addclause( pSat, Lits, Lits + 2 );
429 assert( Cid );
430
431 Lits[0] = toLitCond( iVar, fCompl );
432 Lits[1] = toLitCond( iVar0, !fCompl0 );
433 Lits[2] = toLitCond( iVar1, !fCompl1 );
434 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
435 assert( Cid );
436 return 3;
437}
438static inline int sat_solver_add_xor( sat_solver * pSat, int iVarA, int iVarB, int iVarC, int fCompl )
439{
440 lit Lits[3];
441 int Cid;
442 assert( iVarA >= 0 && iVarB >= 0 && iVarC >= 0 );
443
444 Lits[0] = toLitCond( iVarA, !fCompl );
445 Lits[1] = toLitCond( iVarB, 1 );
446 Lits[2] = toLitCond( iVarC, 1 );
447 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
448 assert( Cid );
449
450 Lits[0] = toLitCond( iVarA, !fCompl );
451 Lits[1] = toLitCond( iVarB, 0 );
452 Lits[2] = toLitCond( iVarC, 0 );
453 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
454 assert( Cid );
455
456 Lits[0] = toLitCond( iVarA, fCompl );
457 Lits[1] = toLitCond( iVarB, 1 );
458 Lits[2] = toLitCond( iVarC, 0 );
459 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
460 assert( Cid );
461
462 Lits[0] = toLitCond( iVarA, fCompl );
463 Lits[1] = toLitCond( iVarB, 0 );
464 Lits[2] = toLitCond( iVarC, 1 );
465 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
466 assert( Cid );
467 return 4;
468}
469static inline int sat_solver_add_mux( sat_solver * pSat, int iVarZ, int iVarC, int iVarT, int iVarE, int iComplC, int iComplT, int iComplE, int iComplZ )
470{
471 lit Lits[3];
472 int Cid;
473 assert( iVarC >= 0 && iVarT >= 0 && iVarE >= 0 && iVarZ >= 0 );
474
475 Lits[0] = toLitCond( iVarC, 1 ^ iComplC );
476 Lits[1] = toLitCond( iVarT, 1 ^ iComplT );
477 Lits[2] = toLitCond( iVarZ, 0 );
478 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
479 assert( Cid );
480
481 Lits[0] = toLitCond( iVarC, 1 ^ iComplC );
482 Lits[1] = toLitCond( iVarT, 0 ^ iComplT );
483 Lits[2] = toLitCond( iVarZ, 1 ^ iComplZ );
484 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
485 assert( Cid );
486
487 Lits[0] = toLitCond( iVarC, 0 ^ iComplC );
488 Lits[1] = toLitCond( iVarE, 1 ^ iComplE );
489 Lits[2] = toLitCond( iVarZ, 0 ^ iComplZ );
490 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
491 assert( Cid );
492
493 Lits[0] = toLitCond( iVarC, 0 ^ iComplC );
494 Lits[1] = toLitCond( iVarE, 0 ^ iComplE );
495 Lits[2] = toLitCond( iVarZ, 1 ^ iComplZ );
496 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
497 assert( Cid );
498
499 if ( iVarT == iVarE )
500 return 4;
501
502 Lits[0] = toLitCond( iVarT, 0 ^ iComplT );
503 Lits[1] = toLitCond( iVarE, 0 ^ iComplE );
504 Lits[2] = toLitCond( iVarZ, 1 ^ iComplZ );
505 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
506 assert( Cid );
507
508 Lits[0] = toLitCond( iVarT, 1 ^ iComplT );
509 Lits[1] = toLitCond( iVarE, 1 ^ iComplE );
510 Lits[2] = toLitCond( iVarZ, 0 ^ iComplZ );
511 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
512 assert( Cid );
513 return 6;
514}
515static inline int sat_solver_add_mux41( sat_solver * pSat, int iVarZ, int iVarC0, int iVarC1, int iVarD0, int iVarD1, int iVarD2, int iVarD3 )
516{
517 lit Lits[4];
518 int Cid;
519 assert( iVarC0 >= 0 && iVarC1 >= 0 && iVarD0 >= 0 && iVarD1 >= 0 && iVarD2 >= 0 && iVarD3 >= 0 && iVarZ >= 0 );
520
521 Lits[0] = toLitCond( iVarD0, 1 );
522 Lits[1] = toLitCond( iVarC0, 0 );
523 Lits[2] = toLitCond( iVarC1, 0 );
524 Lits[3] = toLitCond( iVarZ, 0 );
525 Cid = sat_solver_addclause( pSat, Lits, Lits + 4 );
526 assert( Cid );
527
528 Lits[0] = toLitCond( iVarD1, 1 );
529 Lits[1] = toLitCond( iVarC0, 1 );
530 Lits[2] = toLitCond( iVarC1, 0 );
531 Lits[3] = toLitCond( iVarZ, 0 );
532 Cid = sat_solver_addclause( pSat, Lits, Lits + 4 );
533 assert( Cid );
534
535 Lits[0] = toLitCond( iVarD2, 1 );
536 Lits[1] = toLitCond( iVarC0, 0 );
537 Lits[2] = toLitCond( iVarC1, 1 );
538 Lits[3] = toLitCond( iVarZ, 0 );
539 Cid = sat_solver_addclause( pSat, Lits, Lits + 4 );
540 assert( Cid );
541
542 Lits[0] = toLitCond( iVarD3, 1 );
543 Lits[1] = toLitCond( iVarC0, 1 );
544 Lits[2] = toLitCond( iVarC1, 1 );
545 Lits[3] = toLitCond( iVarZ, 0 );
546 Cid = sat_solver_addclause( pSat, Lits, Lits + 4 );
547 assert( Cid );
548
549
550 Lits[0] = toLitCond( iVarD0, 0 );
551 Lits[1] = toLitCond( iVarC0, 0 );
552 Lits[2] = toLitCond( iVarC1, 0 );
553 Lits[3] = toLitCond( iVarZ, 1 );
554 Cid = sat_solver_addclause( pSat, Lits, Lits + 4 );
555 assert( Cid );
556
557 Lits[0] = toLitCond( iVarD1, 0 );
558 Lits[1] = toLitCond( iVarC0, 1 );
559 Lits[2] = toLitCond( iVarC1, 0 );
560 Lits[3] = toLitCond( iVarZ, 1 );
561 Cid = sat_solver_addclause( pSat, Lits, Lits + 4 );
562 assert( Cid );
563
564 Lits[0] = toLitCond( iVarD2, 0 );
565 Lits[1] = toLitCond( iVarC0, 0 );
566 Lits[2] = toLitCond( iVarC1, 1 );
567 Lits[3] = toLitCond( iVarZ, 1 );
568 Cid = sat_solver_addclause( pSat, Lits, Lits + 4 );
569 assert( Cid );
570
571 Lits[0] = toLitCond( iVarD3, 0 );
572 Lits[1] = toLitCond( iVarC0, 1 );
573 Lits[2] = toLitCond( iVarC1, 1 );
574 Lits[3] = toLitCond( iVarZ, 1 );
575 Cid = sat_solver_addclause( pSat, Lits, Lits + 4 );
576 assert( Cid );
577 return 8;
578}
579static inline int sat_solver_add_xor_and( sat_solver * pSat, int iVarF, int iVarA, int iVarB, int iVarC )
580{
581 // F = (a (+) b) * c
582 lit Lits[4];
583 int Cid;
584 assert( iVarF >= 0 && iVarA >= 0 && iVarB >= 0 && iVarC >= 0 );
585
586 Lits[0] = toLitCond( iVarF, 1 );
587 Lits[1] = toLitCond( iVarA, 1 );
588 Lits[2] = toLitCond( iVarB, 1 );
589 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
590 assert( Cid );
591
592 Lits[0] = toLitCond( iVarF, 1 );
593 Lits[1] = toLitCond( iVarA, 0 );
594 Lits[2] = toLitCond( iVarB, 0 );
595 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
596 assert( Cid );
597
598 Lits[0] = toLitCond( iVarF, 1 );
599 Lits[1] = toLitCond( iVarC, 0 );
600 Cid = sat_solver_addclause( pSat, Lits, Lits + 2 );
601 assert( Cid );
602
603 Lits[0] = toLitCond( iVarF, 0 );
604 Lits[1] = toLitCond( iVarA, 1 );
605 Lits[2] = toLitCond( iVarB, 0 );
606 Lits[3] = toLitCond( iVarC, 1 );
607 Cid = sat_solver_addclause( pSat, Lits, Lits + 4 );
608 assert( Cid );
609
610 Lits[0] = toLitCond( iVarF, 0 );
611 Lits[1] = toLitCond( iVarA, 0 );
612 Lits[2] = toLitCond( iVarB, 1 );
613 Lits[3] = toLitCond( iVarC, 1 );
614 Cid = sat_solver_addclause( pSat, Lits, Lits + 4 );
615 assert( Cid );
616 return 5;
617}
618static inline int sat_solver_add_constraint( sat_solver * pSat, int iVar, int iVar2, int fCompl )
619{
620 lit Lits[2];
621 int Cid;
622 assert( iVar >= 0 );
623
624 Lits[0] = toLitCond( iVar, fCompl );
625 Lits[1] = toLitCond( iVar2, 0 );
626 Cid = sat_solver_addclause( pSat, Lits, Lits + 2 );
627 assert( Cid );
628
629 Lits[0] = toLitCond( iVar, fCompl );
630 Lits[1] = toLitCond( iVar2, 1 );
631 Cid = sat_solver_addclause( pSat, Lits, Lits + 2 );
632 assert( Cid );
633 return 2;
634}
635
636static inline int sat_solver_add_half_sorter( sat_solver * pSat, int iVarA, int iVarB, int iVar0, int iVar1 )
637{
638 lit Lits[3];
639 int Cid;
640
641 Lits[0] = toLitCond( iVarA, 0 );
642 Lits[1] = toLitCond( iVar0, 1 );
643 Cid = sat_solver_addclause( pSat, Lits, Lits + 2 );
644 assert( Cid );
645
646 Lits[0] = toLitCond( iVarA, 0 );
647 Lits[1] = toLitCond( iVar1, 1 );
648 Cid = sat_solver_addclause( pSat, Lits, Lits + 2 );
649 assert( Cid );
650
651 Lits[0] = toLitCond( iVarB, 0 );
652 Lits[1] = toLitCond( iVar0, 1 );
653 Lits[2] = toLitCond( iVar1, 1 );
654 Cid = sat_solver_addclause( pSat, Lits, Lits + 3 );
655 assert( Cid );
656 return 3;
657}
658
659
661
662#endif
#define ABC_SWAP(Type, a, b)
Definition abc_global.h:253
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
unsigned Abc_Random(int fReset)
Definition utilSort.c:1004
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
#define l_True
Definition bmcBmcS.c:35
#define sat_solver_addclause
Definition cecSatG2.c:37
#define sat_solver_addvar
Definition cecSatG2.c:40
#define sat_solver_add_and
Definition cecSatG2.c:38
#define sat_solver_add_xor
Definition cecSatG2.c:39
#define sat_solver
Definition cecSatG2.c:34
#define sat_solver_solve
Definition cecSatG2.c:45
Cube * p
Definition exorList.c:222
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
struct Sat_Mem_t_ Sat_Mem_t
Definition satClause.h:70
sat_solver * sat_solver_new(void)
Definition satSolver.c:1137
int sat_solver_get_var_value(sat_solver *s, int v)
Definition satSolver.c:118
int sat_solver_solve_internal(sat_solver *s)
Definition satSolver.c:1942
void sat_solver_store_mark_clauses_a(sat_solver *s)
Definition satSolver.c:2417
int sat_solver_simplify(sat_solver *s)
Definition satSolver.c:1515
void sat_solver_restart(sat_solver *s)
Definition satSolver.c:1389
int sat_solver_nconflicts(sat_solver *s)
Definition satSolver.c:2381
void sat_solver_store_free(sat_solver *s)
Definition satSolver.c:2400
int sat_solver_nclauses(sat_solver *s)
Definition satSolver.c:2375
void zsat_solver_restart_seed(sat_solver *s, double seed)
Definition satSolver.c:1435
void sat_solver_store_write(sat_solver *s, char *pFileName)
Definition satSolver.c:2395
void sat_solver_set_var_activity(sat_solver *s, int *pVars, int nVars)
Definition satSolver.c:218
void sat_solver_setnvars(sat_solver *s, int n)
Definition satSolver.c:1272
int * Sat_SolverGetModel(sat_solver *p, int *pVars, int nVars)
Definition satUtil.c:270
void sat_solver_store_alloc(sat_solver *s)
Definition satSolver.c:2389
int sat_solver_nvars(sat_solver *s)
Definition satSolver.c:2369
void Sat_SolverDoubleClauses(sat_solver *p, int iVar)
Definition satUtil.c:312
void sat_solver_rollback(sat_solver *s)
Definition satSolver.c:1643
sat_solver * zsat_solver_new_seed(double seed)
Definition satSolver.c:1202
int sat_solver_push(sat_solver *s, int p)
Definition satSolver.c:2002
void Sat_SolverWriteDimacs(sat_solver *p, char *pFileName, lit *assumptionsBegin, lit *assumptionsEnd, int incrementVars)
Definition satUtil.c:74
void Sat_SolverTraceStart(sat_solver *pSat, char *pName)
DECLARATIONS ///.
Definition satTrace.c:53
int sat_solver_clause_new(sat_solver *s, lit *begin, lit *end, int learnt)
Definition satSolver.c:533
void Sat_SolverTraceStop(sat_solver *pSat)
Definition satTrace.c:73
void sat_solver_store_mark_roots(sat_solver *s)
Definition satSolver.c:2412
int sat_solver_count_assigned(sat_solver *s)
Definition satSolver.c:744
void sat_solver_pop(sat_solver *s)
Definition satSolver.c:2045
void Sat_SolverPrintStats(FILE *pFile, sat_solver *p)
Definition satUtil.c:193
void * sat_solver_store_release(sat_solver *s)
Definition satSolver.c:2422
int sat_solver_minimize_assumptions2(sat_solver *s, int *pLits, int nLits, int nConfLimit)
Definition satSolver.c:2284
void sat_solver_set_resource_limits(sat_solver *s, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal)
Definition satSolver.c:2051
struct varinfo_t varinfo
Definition satSolver.h:98
void sat_solver_delete(sat_solver *s)
Definition satSolver.c:1341
void Sat_SolverTraceWrite(sat_solver *pSat, int *pBeg, int *pEnd, int fRoot)
Definition satTrace.c:95
int sat_solver_solve_lexsat(sat_solver *s, int *pLits, int nLits)
Definition satSolver.c:2143
int sat_solver_minimize_assumptions(sat_solver *s, int *pLits, int nLits, int nConfLimit)
Definition satSolver.c:2209
double sat_solver_memory(sat_solver *s)
Definition satSolver.c:1479
int lit
Definition satVec.h:130
int cla
Definition satVec.h:131
struct veci_t veci
Definition satVec.h:36
char * tags
Definition satSolver.h:138
ABC_INT64_T nInsLimit
Definition satSolver.h:171
double * factors
Definition satSolver.h:175
int * pGlobalVars
Definition satSolver.h:186
int(* pCnfFunc)(void *p, int)
Definition satSolver.h:204
void * pCnfMan
Definition satSolver.h:203
int * orderpos
Definition satSolver.h:141
double random_seed
Definition satSolver.h:157
unsigned cla_inc
Definition satSolver.h:127
word * activity
Definition satSolver.h:125
veci conf_final
Definition satSolver.h:151
int simpdb_assigns
Definition satSolver.h:155
Sat_Mem_t Mem
Definition satSolver.h:108
ABC_INT64_T nConfLimit
Definition satSolver.h:170
unsigned cla_decay
Definition satSolver.h:128
int fNotUseRandom
Definition satSolver.h:183
int(* pFuncStop)(int)
Definition satSolver.h:208
char * assigns
Definition satSolver.h:136
char * polarity
Definition satSolver.h:137
void * pStore
Definition satSolver.h:188
int fSkipSimplify
Definition satSolver.h:182
abctime nRuntimeLimit
Definition satSolver.h:172
clause * binary
Definition satSolver.h:111
veci * wlists
Definition satSolver.h:112
veci temp_clause
Definition satSolver.h:196
double progress_estimate
Definition satSolver.h:158
stats_t stats
Definition satSolver.h:163
word * activity2
Definition satSolver.h:126
veci user_values
Definition satSolver.h:200
int * reasons
Definition satSolver.h:142
char * pFreqs
Definition satSolver.h:131
char * loads
Definition satSolver.h:139
veci pivot_vars
Definition satSolver.h:180
FILE * pFile
Definition satSolver.h:192
int size
Definition satVec.h:33
int * ptr
Definition satVec.h:34
int cap
Definition satVec.h:32
#define assert(ex)
Definition util_old.h:213
char * memcpy()