ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
pdrCnf.c
Go to the documentation of this file.
1
20
21#include "pdrInt.h"
22
24
25
29
30/*
31 The CNF (p->pCnf2) is expressed in terms of object IDs.
32 Each node in the CNF is marked if it has clauses (p->pCnf2->pObj2Count[Id] > 0).
33 Each node in the CNF has the first clause (p->pCnf2->pObj2Clause)
34 and the number of clauses (p->pCnf2->pObj2Count).
35 Each node used in a CNF of any timeframe has its SAT var recorded.
36 Each frame has a reserve mapping of SAT variables into ObjIds.
37*/
38
42
54static inline int Pdr_ObjSatVar1( Pdr_Man_t * p, int k, Aig_Obj_t * pObj )
55{
56 return p->pCnf1->pVarNums[ Aig_ObjId(pObj) ];
57}
58
70//#define USE_PG
71#ifdef USE_PG
72static inline int Pdr_ObjSatVar2FindOrAdd( Pdr_Man_t * p, int k, Aig_Obj_t * pObj )
73{
74 Vec_Int_t * vId2Vars = p->pvId2Vars + Aig_ObjId(pObj);
75 assert( p->pCnf2->pObj2Count[Aig_ObjId(pObj)] >= 0 );
76 if ( Vec_IntSize(vId2Vars) == 0 )
77 Vec_IntGrow(vId2Vars, 2 * k + 1);
78 if ( Vec_IntGetEntry(vId2Vars, k) == 0 )
79 {
80 sat_solver * pSat = Pdr_ManSolver(p, k);
81 Vec_Int_t * vVar2Ids = (Vec_Int_t *)Vec_PtrEntry(&p->vVar2Ids, k);
82 int iVarNew = Vec_IntSize( vVar2Ids );
83 assert( iVarNew > 0 );
84 Vec_IntPush( vVar2Ids, Aig_ObjId(pObj) );
85 Vec_IntWriteEntry( vId2Vars, k, iVarNew << 2 );
86 sat_solver_setnvars( pSat, iVarNew + 1 );
87 if ( k == 0 && Saig_ObjIsLo(p->pAig, pObj) ) // initialize the register output
88 {
89 int Lit = Abc_Var2Lit( iVarNew, 1 );
90 int RetValue = sat_solver_addclause( pSat, &Lit, &Lit + 1 );
91 assert( RetValue == 1 );
92 (void) RetValue;
93 sat_solver_compress( pSat );
94 }
95 }
96 return Vec_IntEntry( vId2Vars, k );
97}
98int Pdr_ObjSatVar2( Pdr_Man_t * p, int k, Aig_Obj_t * pObj, int Level, int Pol )
99{
100 Vec_Int_t * vLits;
101 sat_solver * pSat;
102 Vec_Int_t * vVar2Ids = (Vec_Int_t *)Vec_PtrEntry(&p->vVar2Ids, k);
103 int nVarCount = Vec_IntSize(vVar2Ids);
104 int iVarThis = Pdr_ObjSatVar2FindOrAdd( p, k, pObj );
105 int * pLit, i, iVar, iClaBeg, iClaEnd, RetValue;
106 int PolPres = (iVarThis & 3);
107 iVarThis >>= 2;
108 if ( Aig_ObjIsCi(pObj) )
109 return iVarThis;
110// Pol = 3;
111// if ( nVarCount != Vec_IntSize(vVar2Ids) || (Pol & ~PolPres) )
112 if ( (Pol & ~PolPres) )
113 {
114 *Vec_IntEntryP( p->pvId2Vars + Aig_ObjId(pObj), k ) |= Pol;
115 iClaBeg = p->pCnf2->pObj2Clause[Aig_ObjId(pObj)];
116 iClaEnd = iClaBeg + p->pCnf2->pObj2Count[Aig_ObjId(pObj)];
117 assert( iClaBeg < iClaEnd );
118/*
119 if ( (Pol & ~PolPres) != 3 )
120 for ( i = iFirstClause; i < iFirstClause + nClauses; i++ )
121 {
122 printf( "Clause %5d : ", i );
123 for ( iVar = 0; iVar < 4; iVar++ )
124 printf( "%d ", ((unsigned)p->pCnf2->pClaPols[i] >> (2*iVar)) & 3 );
125 printf( " " );
126 for ( pLit = p->pCnf2->pClauses[i]; pLit < p->pCnf2->pClauses[i+1]; pLit++ )
127 printf( "%6d ", *pLit );
128 printf( "\n" );
129 }
130*/
131 pSat = Pdr_ManSolver(p, k);
132 vLits = Vec_WecEntry( p->vVLits, Level );
133 if ( (Pol & ~PolPres) == 3 )
134 {
135 assert( nVarCount + 1 == Vec_IntSize(vVar2Ids) );
136 for ( i = iClaBeg; i < iClaEnd; i++ )
137 {
138 Vec_IntClear( vLits );
139 Vec_IntPush( vLits, Abc_Var2Lit( iVarThis, Abc_LitIsCompl(p->pCnf2->pClauses[i][0]) ) );
140 for ( pLit = p->pCnf2->pClauses[i]+1; pLit < p->pCnf2->pClauses[i+1]; pLit++ )
141 {
142 iVar = Pdr_ObjSatVar2( p, k, Aig_ManObj(p->pAig, Abc_Lit2Var(*pLit)), Level+1, 3 );
143 Vec_IntPush( vLits, Abc_Var2Lit( iVar, Abc_LitIsCompl(*pLit) ) );
144 }
145 RetValue = sat_solver_addclause( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits)+Vec_IntSize(vLits) );
146 assert( RetValue );
147 (void) RetValue;
148 }
149 }
150 else // if ( (Pol & ~PolPres) == 2 || (Pol & ~PolPres) == 1 ) // write pos/neg polarity
151 {
152 assert( (Pol & ~PolPres) );
153 for ( i = iClaBeg; i < iClaEnd; i++ )
154 if ( 2 - !Abc_LitIsCompl(p->pCnf2->pClauses[i][0]) == (Pol & ~PolPres) ) // taking opposite literal
155 {
156 Vec_IntClear( vLits );
157 Vec_IntPush( vLits, Abc_Var2Lit( iVarThis, Abc_LitIsCompl(p->pCnf2->pClauses[i][0]) ) );
158 for ( pLit = p->pCnf2->pClauses[i]+1; pLit < p->pCnf2->pClauses[i+1]; pLit++ )
159 {
160 iVar = Pdr_ObjSatVar2( p, k, Aig_ManObj(p->pAig, Abc_Lit2Var(*pLit)), Level+1, ((unsigned)p->pCnf2->pClaPols[i] >> (2*(pLit-p->pCnf2->pClauses[i]-1))) & 3 );
161 Vec_IntPush( vLits, Abc_Var2Lit( iVar, Abc_LitIsCompl(*pLit) ) );
162 }
163 RetValue = sat_solver_addclause( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits)+Vec_IntSize(vLits) );
164 assert( RetValue );
165 (void) RetValue;
166 }
167 }
168 }
169 return iVarThis;
170}
171
172#else
173static inline int Pdr_ObjSatVar2FindOrAdd( Pdr_Man_t * p, int k, Aig_Obj_t * pObj, int * pfNewVar )
174{
175 Vec_Int_t * vId2Vars = p->pvId2Vars + Aig_ObjId(pObj);
176 assert( p->pCnf2->pObj2Count[Aig_ObjId(pObj)] >= 0 );
177 if ( Vec_IntSize(vId2Vars) == 0 )
178 Vec_IntGrow(vId2Vars, 2 * k + 1);
179 if ( Vec_IntGetEntry(vId2Vars, k) == 0 )
180 {
181 sat_solver * pSat = Pdr_ManSolver(p, k);
182 Vec_Int_t * vVar2Ids = (Vec_Int_t *)Vec_PtrEntry(&p->vVar2Ids, k);
183 int iVarNew = Vec_IntSize( vVar2Ids );
184 assert( iVarNew > 0 );
185 Vec_IntPush( vVar2Ids, Aig_ObjId(pObj) );
186 Vec_IntWriteEntry( vId2Vars, k, iVarNew );
187 sat_solver_setnvars( pSat, iVarNew + 1 );
188 if ( k == 0 && Saig_ObjIsLo(p->pAig, pObj) ) // initialize the register output
189 {
190 int Lit = Abc_Var2Lit( iVarNew, 1 );
191 int RetValue = sat_solver_addclause( pSat, &Lit, &Lit + 1 );
192 assert( RetValue == 1 );
193 (void) RetValue;
194 sat_solver_compress( pSat );
195 }
196 *pfNewVar = 1;
197 }
198 return Vec_IntEntry( vId2Vars, k );
199}
200int Pdr_ObjSatVar2( Pdr_Man_t * p, int k, Aig_Obj_t * pObj, int Level, int Pol )
201{
202 Vec_Int_t * vLits;
203 sat_solver * pSat;
204 int fNewVar = 0, iVarThis = Pdr_ObjSatVar2FindOrAdd( p, k, pObj, &fNewVar );
205 int * pLit, i, iVar, iClaBeg, iClaEnd, RetValue;
206 if ( Aig_ObjIsCi(pObj) || !fNewVar )
207 return iVarThis;
208 iClaBeg = p->pCnf2->pObj2Clause[Aig_ObjId(pObj)];
209 iClaEnd = iClaBeg + p->pCnf2->pObj2Count[Aig_ObjId(pObj)];
210 assert( iClaBeg < iClaEnd );
211 pSat = Pdr_ManSolver(p, k);
212 vLits = Vec_WecEntry( p->vVLits, Level );
213 for ( i = iClaBeg; i < iClaEnd; i++ )
214 {
215 Vec_IntClear( vLits );
216 Vec_IntPush( vLits, Abc_Var2Lit( iVarThis, Abc_LitIsCompl(p->pCnf2->pClauses[i][0]) ) );
217 for ( pLit = p->pCnf2->pClauses[i]+1; pLit < p->pCnf2->pClauses[i+1]; pLit++ )
218 {
219 iVar = Pdr_ObjSatVar2( p, k, Aig_ManObj(p->pAig, Abc_Lit2Var(*pLit)), Level+1, Pol );
220 Vec_IntPush( vLits, Abc_Var2Lit( iVar, Abc_LitIsCompl(*pLit) ) );
221 }
222 RetValue = sat_solver_addclause( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits)+Vec_IntSize(vLits) );
223 assert( RetValue );
224 (void) RetValue;
225 }
226 return iVarThis;
227}
228#endif
229
241int Pdr_ObjSatVar( Pdr_Man_t * p, int k, int Pol, Aig_Obj_t * pObj )
242{
243 if ( p->pPars->fMonoCnf )
244 return Pdr_ObjSatVar1( p, k, pObj );
245 else
246 return Pdr_ObjSatVar2( p, k, pObj, 0, Pol );
247}
248
249
261static inline int Pdr_ObjRegNum1( Pdr_Man_t * p, int k, int iSatVar )
262{
263 int RegId;
264 assert( iSatVar >= 0 );
265 // consider the case of auxiliary variable
266 if ( iSatVar >= p->pCnf1->nVars )
267 return -1;
268 // consider the case of register output
269 RegId = Vec_IntEntry( p->vVar2Reg, iSatVar );
270 assert( RegId >= 0 && RegId < Aig_ManRegNum(p->pAig) );
271 return RegId;
272}
273
285static inline int Pdr_ObjRegNum2( Pdr_Man_t * p, int k, int iSatVar )
286{
287 Aig_Obj_t * pObj;
288 int ObjId;
289 Vec_Int_t * vVar2Ids = (Vec_Int_t *)Vec_PtrEntry(&p->vVar2Ids, k);
290 assert( iSatVar > 0 && iSatVar < Vec_IntSize(vVar2Ids) );
291 ObjId = Vec_IntEntry( vVar2Ids, iSatVar );
292 if ( ObjId == -1 ) // activation variable
293 return -1;
294 pObj = Aig_ManObj( p->pAig, ObjId );
295 if ( Saig_ObjIsLi( p->pAig, pObj ) )
296 return Aig_ObjCioId(pObj)-Saig_ManPoNum(p->pAig);
297 assert( 0 ); // should be called for register inputs only
298 return -1;
299}
300
312int Pdr_ObjRegNum( Pdr_Man_t * p, int k, int iSatVar )
313{
314 if ( p->pPars->fMonoCnf )
315 return Pdr_ObjRegNum1( p, k, iSatVar );
316 else
317 return Pdr_ObjRegNum2( p, k, iSatVar );
318}
319
320
333{
334 if ( p->pPars->fMonoCnf )
335 return sat_solver_nvars( Pdr_ManSolver(p, k) );
336 else
337 {
338 Vec_Int_t * vVar2Ids = (Vec_Int_t *)Vec_PtrEntry( &p->vVar2Ids, k );
339 Vec_IntPush( vVar2Ids, -1 );
340 return Vec_IntSize( vVar2Ids ) - 1;
341 }
342}
343
355static inline sat_solver * Pdr_ManNewSolver1( sat_solver * pSat, Pdr_Man_t * p, int k, int fInit )
356{
357 Aig_Obj_t * pObj;
358 int i;
359 assert( pSat );
360 if ( p->pCnf1 == NULL )
361 {
362 int nRegs = p->pAig->nRegs;
363 p->pAig->nRegs = Aig_ManCoNum(p->pAig);
364 p->pCnf1 = Cnf_DeriveWithMan( p->pCnfMan, p->pAig, Aig_ManCoNum(p->pAig) );
365 p->pAig->nRegs = nRegs;
366 assert( p->vVar2Reg == NULL );
367 p->vVar2Reg = Vec_IntStartFull( p->pCnf1->nVars );
368 Saig_ManForEachLi( p->pAig, pObj, i )
369 Vec_IntWriteEntry( p->vVar2Reg, Pdr_ObjSatVar(p, k, 3, pObj), i );
370 }
371 pSat = (sat_solver *)Cnf_DataWriteIntoSolverInt( pSat, p->pCnf1, 1, fInit );
372 sat_solver_set_runtime_limit( pSat, p->timeToStop );
373 sat_solver_set_runid( pSat, p->pPars->RunId );
374 sat_solver_set_stop_func( pSat, p->pPars->pFuncStop );
375 return pSat;
376}
377
389static inline sat_solver * Pdr_ManNewSolver2( sat_solver * pSat, Pdr_Man_t * p, int k, int fInit )
390{
391 Vec_Int_t * vVar2Ids;
392 int i, Entry;
393 assert( pSat );
394 if ( p->pCnf2 == NULL )
395 {
396 p->pCnf2 = Cnf_DeriveOtherWithMan( p->pCnfMan, p->pAig, 0 );
397#ifdef USE_PG
398 p->pCnf2->pClaPols = Cnf_DataDeriveLitPolarities( p->pCnf2 );
399#endif
400 p->pvId2Vars = ABC_CALLOC( Vec_Int_t, Aig_ManObjNumMax(p->pAig) );
401 Vec_PtrGrow( &p->vVar2Ids, 256 );
402 }
403 // update the variable mapping
404 vVar2Ids = (Vec_Int_t *)Vec_PtrGetEntry( &p->vVar2Ids, k );
405 if ( vVar2Ids == NULL )
406 {
407 vVar2Ids = Vec_IntAlloc( 500 );
408 Vec_PtrWriteEntry( &p->vVar2Ids, k, vVar2Ids );
409 }
410 Vec_IntForEachEntry( vVar2Ids, Entry, i )
411 {
412 if ( Entry == -1 )
413 continue;
414 assert( Vec_IntEntry( p->pvId2Vars + Entry, k ) > 0 );
415 Vec_IntWriteEntry( p->pvId2Vars + Entry, k, 0 );
416 }
417 Vec_IntClear( vVar2Ids );
418 Vec_IntPush( vVar2Ids, -1 );
419 // start the SAT solver
420// pSat = sat_solver_new();
421 sat_solver_setnvars( pSat, 500 );
422 sat_solver_set_runtime_limit( pSat, p->timeToStop );
423 sat_solver_set_runid( pSat, p->pPars->RunId );
424 sat_solver_set_stop_func( pSat, p->pPars->pFuncStop );
425 return pSat;
426}
427
439sat_solver * Pdr_ManNewSolver( sat_solver * pSat, Pdr_Man_t * p, int k, int fInit )
440{
441 assert( pSat != NULL );
442 if ( p->pPars->fMonoCnf )
443 return Pdr_ManNewSolver1( pSat, p, k, fInit );
444 else
445 return Pdr_ManNewSolver2( pSat, p, k, fInit );
446}
447
448
452
453
455
#define ABC_CALLOC(type, num)
Definition abc_global.h:265
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
struct Aig_Obj_t_ Aig_Obj_t
Definition aig.h:51
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
#define sat_solver_addclause
Definition cecSatG2.c:37
#define sat_solver
Definition cecSatG2.c:34
unsigned char * Cnf_DataDeriveLitPolarities(Cnf_Dat_t *p)
Definition cnfUtil.c:451
void * Cnf_DataWriteIntoSolverInt(void *pSat, Cnf_Dat_t *p, int nFrames, int fInit)
Definition cnfMan.c:486
Cnf_Dat_t * Cnf_DeriveWithMan(Cnf_Man_t *p, Aig_Man_t *pAig, int nOutputs)
Definition cnfCore.c:129
Cnf_Dat_t * Cnf_DeriveOtherWithMan(Cnf_Man_t *p, Aig_Man_t *pAig, int fSkipTtMin)
Definition cnfCore.c:182
Cube * p
Definition exorList.c:222
sat_solver * Pdr_ManNewSolver(sat_solver *pSat, Pdr_Man_t *p, int k, int fInit)
Definition pdrCnf.c:439
int Pdr_ManFreeVar(Pdr_Man_t *p, int k)
Definition pdrCnf.c:332
int Pdr_ObjSatVar2(Pdr_Man_t *p, int k, Aig_Obj_t *pObj, int Level, int Pol)
Definition pdrCnf.c:200
int Pdr_ObjSatVar(Pdr_Man_t *p, int k, int Pol, Aig_Obj_t *pObj)
FUNCTION DECLARATIONS ///.
Definition pdrCnf.c:241
int Pdr_ObjRegNum(Pdr_Man_t *p, int k, int iSatVar)
Definition pdrCnf.c:312
struct Pdr_Man_t_ Pdr_Man_t
Definition pdrInt.h:95
#define Saig_ManForEachLi(p, pObj, i)
Definition saig.h:98
void sat_solver_setnvars(sat_solver *s, int n)
Definition satSolver.c:1272
int sat_solver_nvars(sat_solver *s)
Definition satSolver.c:2369
#define assert(ex)
Definition util_old.h:213
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54