ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
msatClause.c
Go to the documentation of this file.
1
20
21#include "msatInt.h"
22
24
25
29
31{
32 int Num; // unique number of the clause
33 unsigned fLearned : 1; // 1 if the clause is learned
34 unsigned fMark : 1; // used to mark visited clauses during proof recording
35 unsigned fTypeA : 1; // used to mark clauses belonging to A for interpolant computation
36 unsigned nSize : 14; // the number of literals in the clause
37 unsigned nSizeAlloc : 15; // the number of bytes allocated for the clause
39};
40
44
58int Msat_ClauseCreate( Msat_Solver_t * p, Msat_IntVec_t * vLits, int fLearned, Msat_Clause_t ** pClause_out )
59{
60 int * pAssigns = Msat_SolverReadAssignsArray(p);
61 Msat_ClauseVec_t ** pvWatched;
62 Msat_Clause_t * pC;
63 int * pLits;
64 int nLits, i, j;
65 int nBytes;
67 int Sign;
68
69 *pClause_out = NULL;
70
71 nLits = Msat_IntVecReadSize(vLits);
72 pLits = Msat_IntVecReadArray(vLits);
73
74 if ( !fLearned )
75 {
76 int * pSeen = Msat_SolverReadSeenArray( p );
77 int nSeenId;
79 // sorting literals makes the code trace-equivalent
80 // with to the original C++ solver
81 Msat_IntVecSort( vLits, 0 );
82 // increment the counter of seen twice
83 nSeenId = Msat_SolverIncrementSeenId( p );
84 nSeenId = Msat_SolverIncrementSeenId( p );
85 // nSeenId - 1 stands for negative
86 // nSeenId stands for positive
87 // Remove false literals
88
89 // there is a bug here!!!!
90 // when the same var in opposite polarities is given, it drops one polarity!!!
91
92 for ( i = j = 0; i < nLits; i++ ) {
93 // get the corresponding variable
94 Var = MSAT_LIT2VAR(pLits[i]);
95 Sign = MSAT_LITSIGN(pLits[i]); // Sign=0 for positive
96 // check if we already saw this variable in the this clause
97 if ( pSeen[Var] >= nSeenId - 1 )
98 {
99 if ( (pSeen[Var] != nSeenId) == Sign ) // the same lit
100 continue;
101 return 1; // two opposite polarity lits -- don't add the clause
102 }
103 // mark the variable as seen
104 pSeen[Var] = nSeenId - !Sign;
105
106 // analize the value of this literal
107 if ( pAssigns[Var] != MSAT_VAR_UNASSIGNED )
108 {
109 if ( pAssigns[Var] == pLits[i] )
110 return 1; // the clause is always true -- don't add anything
111 // the literal has no impact - skip it
112 continue;
113 }
114 // otherwise, add this literal to the clause
115 pLits[j++] = pLits[i];
116 }
117 Msat_IntVecShrink( vLits, j );
118 nLits = j;
119/*
120 // the problem with this code is that performance is very
121 // sensitive to the ordering of adjacency lits
122 // the best ordering requires fanins first, next fanouts
123 // this ordering is more convenient to make from FRAIG
124
125 // create the adjacency information
126 if ( nLits > 2 )
127 {
128 Msat_Var_t VarI, VarJ;
129 Msat_IntVec_t * pAdjI, * pAdjJ;
130
131 for ( i = 0; i < nLits; i++ )
132 {
133 VarI = MSAT_LIT2VAR(pLits[i]);
134 pAdjI = (Msat_IntVec_t *)p->vAdjacents->pArray[VarI];
135
136 for ( j = i+1; j < nLits; j++ )
137 {
138 VarJ = MSAT_LIT2VAR(pLits[j]);
139 pAdjJ = (Msat_IntVec_t *)p->vAdjacents->pArray[VarJ];
140
141 Msat_IntVecPushUniqueOrder( pAdjI, VarJ, 1 );
142 Msat_IntVecPushUniqueOrder( pAdjJ, VarI, 1 );
143 }
144 }
145 }
146*/
147 }
148 // 'vLits' is now the (possibly) reduced vector of literals.
149 if ( nLits == 0 )
150 return 0;
151 if ( nLits == 1 )
152 return Msat_SolverEnqueue( p, pLits[0], NULL );
153
154 // Allocate clause:
155// nBytes = sizeof(unsigned)*(nLits + 1 + (int)fLearned);
156 nBytes = sizeof(unsigned)*(nLits + 2 + (int)fLearned);
157#ifdef USE_SYSTEM_MEMORY_MANAGEMENT
158 pC = (Msat_Clause_t *)ABC_ALLOC( char, nBytes );
159#else
161#endif
162 pC->Num = p->nClauses++;
163 pC->fTypeA = 0;
164 pC->fMark = 0;
165 pC->fLearned = fLearned;
166 pC->nSize = nLits;
167 pC->nSizeAlloc = nBytes;
168 memcpy( pC->pData, pLits, sizeof(int)*nLits );
169
170 // For learnt clauses only:
171 if ( fLearned )
172 {
173 int * pLevel = Msat_SolverReadDecisionLevelArray( p );
174 int iLevelMax, iLevelCur, iLitMax;
175
176 // Put the second watch on the literal with highest decision level:
177 iLitMax = 1;
178 iLevelMax = pLevel[ MSAT_LIT2VAR(pLits[1]) ];
179 for ( i = 2; i < nLits; i++ )
180 {
181 iLevelCur = pLevel[ MSAT_LIT2VAR(pLits[i]) ];
182 assert( iLevelCur != -1 );
183 if ( iLevelMax < iLevelCur )
184 // this is very strange - shouldn't it be???
185 // if ( iLevelMax > iLevelCur )
186 iLevelMax = iLevelCur, iLitMax = i;
187 }
188 pC->pData[1] = pLits[iLitMax];
189 pC->pData[iLitMax] = pLits[1];
190
191 // Bumping:
192 // (newly learnt clauses should be considered active)
193 Msat_ClauseWriteActivity( pC, 0.0 );
195// if ( nLits < 20 )
196 for ( i = 0; i < nLits; i++ )
197 {
198 Msat_SolverVarBumpActivity( p, pLits[i] );
199// Msat_SolverVarBumpActivity( p, pLits[i] );
200// p->pFreq[ MSAT_LIT2VAR(pLits[i]) ]++;
201 }
202 }
203
204 // Store clause:
205 pvWatched = Msat_SolverReadWatchedArray( p );
206 Msat_ClauseVecPush( pvWatched[ MSAT_LITNOT(pC->pData[0]) ], pC );
207 Msat_ClauseVecPush( pvWatched[ MSAT_LITNOT(pC->pData[1]) ], pC );
208 *pClause_out = pC;
209 return 1;
210}
211
223void Msat_ClauseFree( Msat_Solver_t * p, Msat_Clause_t * pC, int fRemoveWatched )
224{
225 if ( fRemoveWatched )
226 {
227 Msat_Lit_t Lit;
228 Msat_ClauseVec_t ** pvWatched;
229 pvWatched = Msat_SolverReadWatchedArray( p );
230 Lit = MSAT_LITNOT( pC->pData[0] );
231 Msat_ClauseRemoveWatch( pvWatched[Lit], pC );
232 Lit = MSAT_LITNOT( pC->pData[1] );
233 Msat_ClauseRemoveWatch( pvWatched[Lit], pC );
234 }
235
236#ifdef USE_SYSTEM_MEMORY_MANAGEMENT
237 ABC_FREE( pC );
238#else
239 Msat_MmStepEntryRecycle( Msat_SolverReadMem(p), (char *)pC, pC->nSizeAlloc );
240#endif
241
242}
243
255int Msat_ClauseReadLearned( Msat_Clause_t * pC ) { return pC->fLearned; }
256int Msat_ClauseReadSize( Msat_Clause_t * pC ) { return pC->nSize; }
257int * Msat_ClauseReadLits( Msat_Clause_t * pC ) { return pC->pData; }
258int Msat_ClauseReadMark( Msat_Clause_t * pC ) { return pC->fMark; }
259int Msat_ClauseReadNum( Msat_Clause_t * pC ) { return pC->Num; }
260int Msat_ClauseReadTypeA( Msat_Clause_t * pC ) { return pC->fTypeA; }
261
262void Msat_ClauseSetMark( Msat_Clause_t * pC, int fMark ) { pC->fMark = fMark; }
263void Msat_ClauseSetNum( Msat_Clause_t * pC, int Num ) { pC->Num = Num; }
264void Msat_ClauseSetTypeA( Msat_Clause_t * pC, int fTypeA ) { pC->fTypeA = fTypeA; }
265
279{
281 return (int )(pReasons[MSAT_LIT2VAR(pC->pData[0])] == pC);
282}
283
296{
297 float f;
298
299 memcpy( &f, pC->pData + pC->nSize, sizeof (f));
300 return f;
301}
302
315{
316 memcpy( pC->pData + pC->nSize, &Num, sizeof (Num) );
317}
318
335int Msat_ClausePropagate( Msat_Clause_t * pC, Msat_Lit_t Lit, int * pAssigns, Msat_Lit_t * pLit_out )
336{
337 // make sure the false literal is pC->pData[1]
338 Msat_Lit_t LitF = MSAT_LITNOT(Lit);
339 if ( pC->pData[0] == LitF )
340 pC->pData[0] = pC->pData[1], pC->pData[1] = LitF;
341 assert( pC->pData[1] == LitF );
342 // if the 0-th watch is true, clause is already satisfied
343 if ( pAssigns[MSAT_LIT2VAR(pC->pData[0])] == pC->pData[0] )
344 return 1;
345 // look for a new watch
346 if ( pC->nSize > 2 )
347 {
348 int i;
349 for ( i = 2; i < (int)pC->nSize; i++ )
350 if ( pAssigns[MSAT_LIT2VAR(pC->pData[i])] != MSAT_LITNOT(pC->pData[i]) )
351 {
352 pC->pData[1] = pC->pData[i], pC->pData[i] = LitF;
353 *pLit_out = MSAT_LITNOT(pC->pData[1]);
354 return 1;
355 }
356 }
357 // clause is unit under assignment
358 *pLit_out = pC->pData[0];
359 return 0;
360}
361
374int Msat_ClauseSimplify( Msat_Clause_t * pC, int * pAssigns )
375{
377 int i, j;
378 for ( i = j = 0; i < (int)pC->nSize; i++ )
379 {
380 Var = MSAT_LIT2VAR(pC->pData[i]);
381 if ( pAssigns[Var] == MSAT_VAR_UNASSIGNED )
382 {
383 pC->pData[j++] = pC->pData[i];
384 continue;
385 }
386 if ( pAssigns[Var] == pC->pData[i] )
387 return 1;
388 // otherwise, the value of the literal is false
389 // make sure, this literal is not watched
390 assert( i >= 2 );
391 }
392 // if the size has changed, update it and move activity
393 if ( j < (int)pC->nSize )
394 {
395 float Activ = Msat_ClauseReadActivity(pC);
396 pC->nSize = j;
397 Msat_ClauseWriteActivity(pC, Activ);
398 }
399 return 0;
400}
401
419{
420 int i;
421 // clear the reason
422 Msat_IntVecClear( vLits_out );
423 assert( Lit == MSAT_LIT_UNASSIGNED || Lit == pC->pData[0] );
424 for ( i = (Lit != MSAT_LIT_UNASSIGNED); i < (int)pC->nSize; i++ )
425 {
426 assert( Msat_SolverReadAssignsArray(p)[MSAT_LIT2VAR(pC->pData[i])] == MSAT_LITNOT(pC->pData[i]) );
427 Msat_IntVecPush( vLits_out, MSAT_LITNOT(pC->pData[i]) );
428 }
429 if ( pC->fLearned )
431}
432
445{
446 Msat_Clause_t ** pClauses;
447 int nClauses, i;
448 nClauses = Msat_ClauseVecReadSize( vClauses );
449 pClauses = Msat_ClauseVecReadArray( vClauses );
450 for ( i = 0; pClauses[i] != pC; i++ )
451 assert( i < nClauses );
452 for ( ; i < nClauses - 1; i++ )
453 pClauses[i] = pClauses[i+1];
454 Msat_ClauseVecPop( vClauses );
455}
456
469{
470 int i;
471 if ( pC == NULL )
472 printf( "NULL pointer" );
473 else
474 {
475 if ( pC->fLearned )
476 printf( "Act = %.4f ", Msat_ClauseReadActivity(pC) );
477 for ( i = 0; i < (int)pC->nSize; i++ )
478 printf( " %s%d", ((pC->pData[i]&1)? "-": ""), pC->pData[i]/2 + 1 );
479 }
480 printf( "\n" );
481}
482
494void Msat_ClauseWriteDimacs( FILE * pFile, Msat_Clause_t * pC, int fIncrement )
495{
496 int i;
497 for ( i = 0; i < (int)pC->nSize; i++ )
498 fprintf( pFile, "%s%d ", ((pC->pData[i]&1)? "-": ""), pC->pData[i]/2 + (int)(fIncrement>0) );
499 if ( fIncrement )
500 fprintf( pFile, "0" );
501 fprintf( pFile, "\n" );
502}
503
516{
517 int i;
518 if ( pC == NULL )
519 printf( "NULL pointer" );
520 else
521 {
522// if ( pC->fLearned )
523// printf( "Act = %.4f ", Msat_ClauseReadActivity(pC) );
524 for ( i = 0; i < (int)pC->nSize; i++ )
525 printf(" " L_LIT, L_lit(pC->pData[i]));
526 }
527 printf( "\n" );
528}
529
530
534
535
537
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Cube * p
Definition exorList.c:222
int Var
Definition exorList.c:228
void Msat_SolverClaBumpActivity(Msat_Solver_t *p, Msat_Clause_t *pC)
ABC_NAMESPACE_IMPL_START void Msat_SolverVarBumpActivity(Msat_Solver_t *p, Msat_Lit_t Lit)
DECLARATIONS ///.
int Msat_ClauseVecReadSize(Msat_ClauseVec_t *p)
Msat_Clause_t ** Msat_ClauseVecReadArray(Msat_ClauseVec_t *p)
Msat_Clause_t * Msat_ClauseVecPop(Msat_ClauseVec_t *p)
void Msat_ClauseVecPush(Msat_ClauseVec_t *p, Msat_Clause_t *Entry)
int Msat_ClausePropagate(Msat_Clause_t *pC, Msat_Lit_t Lit, int *pAssigns, Msat_Lit_t *pLit_out)
Definition msatClause.c:335
void Msat_ClauseWriteActivity(Msat_Clause_t *pC, float Num)
Definition msatClause.c:314
int Msat_ClauseSimplify(Msat_Clause_t *pC, int *pAssigns)
Definition msatClause.c:374
void Msat_ClauseSetNum(Msat_Clause_t *pC, int Num)
Definition msatClause.c:263
int Msat_ClauseIsLocked(Msat_Solver_t *p, Msat_Clause_t *pC)
Definition msatClause.c:278
void Msat_ClauseCalcReason(Msat_Solver_t *p, Msat_Clause_t *pC, Msat_Lit_t Lit, Msat_IntVec_t *vLits_out)
Definition msatClause.c:418
int Msat_ClauseReadSize(Msat_Clause_t *pC)
Definition msatClause.c:256
void Msat_ClausePrint(Msat_Clause_t *pC)
Definition msatClause.c:468
int * Msat_ClauseReadLits(Msat_Clause_t *pC)
Definition msatClause.c:257
int Msat_ClauseReadMark(Msat_Clause_t *pC)
Definition msatClause.c:258
int Msat_ClauseCreate(Msat_Solver_t *p, Msat_IntVec_t *vLits, int fLearned, Msat_Clause_t **pClause_out)
FUNCTION DEFINITIONS ///.
Definition msatClause.c:58
void Msat_ClauseWriteDimacs(FILE *pFile, Msat_Clause_t *pC, int fIncrement)
Definition msatClause.c:494
void Msat_ClauseRemoveWatch(Msat_ClauseVec_t *vClauses, Msat_Clause_t *pC)
Definition msatClause.c:444
int Msat_ClauseReadLearned(Msat_Clause_t *pC)
Definition msatClause.c:255
void Msat_ClausePrintSymbols(Msat_Clause_t *pC)
Definition msatClause.c:515
void Msat_ClauseSetMark(Msat_Clause_t *pC, int fMark)
Definition msatClause.c:262
int Msat_ClauseReadTypeA(Msat_Clause_t *pC)
Definition msatClause.c:260
int Msat_ClauseReadNum(Msat_Clause_t *pC)
Definition msatClause.c:259
float Msat_ClauseReadActivity(Msat_Clause_t *pC)
Definition msatClause.c:295
void Msat_ClauseSetTypeA(Msat_Clause_t *pC, int fTypeA)
Definition msatClause.c:264
void Msat_ClauseFree(Msat_Solver_t *p, Msat_Clause_t *pC, int fRemoveWatched)
Definition msatClause.c:223
#define MSAT_VAR_UNASSIGNED
Definition msatInt.h:68
char * Msat_MmStepEntryFetch(Msat_MmStep_t *p, int nBytes)
Definition msatMem.c:479
int Msat_SolverReadDecisionLevel(Msat_Solver_t *p)
Msat_MmStep_t * Msat_SolverReadMem(Msat_Solver_t *p)
typedefABC_NAMESPACE_HEADER_START struct Msat_Clause_t_ Msat_Clause_t
INCLUDES ///.
Definition msatInt.h:57
void Msat_MmStepEntryRecycle(Msat_MmStep_t *p, char *pEntry, int nBytes)
Definition msatMem.c:503
#define MSAT_LIT_UNASSIGNED
Definition msatInt.h:69
Msat_ClauseVec_t ** Msat_SolverReadWatchedArray(Msat_Solver_t *p)
int Msat_Var_t
Definition msatInt.h:66
int * Msat_SolverReadDecisionLevelArray(Msat_Solver_t *p)
int * Msat_SolverReadSeenArray(Msat_Solver_t *p)
int Msat_SolverIncrementSeenId(Msat_Solver_t *p)
int Msat_SolverEnqueue(Msat_Solver_t *p, Msat_Lit_t Lit, Msat_Clause_t *pC)
Msat_Clause_t ** Msat_SolverReadReasonArray(Msat_Solver_t *p)
int Msat_Lit_t
Definition msatInt.h:65
int * Msat_SolverReadAssignsArray(Msat_Solver_t *p)
#define MSAT_LITNOT(l)
Definition msat.h:57
struct Msat_ClauseVec_t_ Msat_ClauseVec_t
Definition msat.h:46
#define MSAT_LIT2VAR(l)
Definition msat.h:59
struct Msat_IntVec_t_ Msat_IntVec_t
Definition msat.h:45
typedefABC_NAMESPACE_HEADER_START struct Msat_Solver_t_ Msat_Solver_t
INCLUDES ///.
Definition msat.h:42
void Msat_IntVecSort(Msat_IntVec_t *p, int fReverse)
Definition msatVec.c:442
void Msat_IntVecShrink(Msat_IntVec_t *p, int nSizeNew)
Definition msatVec.c:318
int Msat_IntVecReadSize(Msat_IntVec_t *p)
Definition msatVec.c:233
void Msat_IntVecClear(Msat_IntVec_t *p)
Definition msatVec.c:335
#define MSAT_LITSIGN(l)
Definition msat.h:58
void Msat_IntVecPush(Msat_IntVec_t *p, int Entry)
Definition msatVec.c:351
int * Msat_IntVecReadArray(Msat_IntVec_t *p)
Definition msatVec.c:217
#define L_lit(p)
Definition satSolver.c:43
#define L_LIT
Definition satSolver.c:42
DECLARATIONS ///.
Definition msatClause.c:31
Msat_Lit_t pData[0]
Definition msatClause.c:38
unsigned fTypeA
Definition msatClause.c:35
unsigned fMark
Definition msatClause.c:34
unsigned nSizeAlloc
Definition msatClause.c:37
unsigned nSize
Definition msatClause.c:36
unsigned fLearned
Definition msatClause.c:33
#define assert(ex)
Definition util_old.h:213
char * memcpy()