ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
intM114p.c
Go to the documentation of this file.
1
20
21#include "intInt.h"
22#include "sat/psat/m114p.h"
23
24#ifdef ABC_USE_LIBRARIES
25
27
31
35
48M114p_Solver_t Inter_ManDeriveSatSolverM114p(
49 Aig_Man_t * pInter, Cnf_Dat_t * pCnfInter,
50 Aig_Man_t * pAig, Cnf_Dat_t * pCnfAig,
51 Aig_Man_t * pFrames, Cnf_Dat_t * pCnfFrames,
52 Vec_Int_t ** pvMapRoots, Vec_Int_t ** pvMapVars )
53{
54 M114p_Solver_t pSat;
55 Aig_Obj_t * pObj, * pObj2;
56 int i, Lits[2];
57
58 // sanity checks
59 assert( Aig_ManRegNum(pInter) == 0 );
60 assert( Aig_ManRegNum(pAig) > 0 );
61 assert( Aig_ManRegNum(pFrames) == 0 );
62 assert( Aig_ManCoNum(pInter) == 1 );
63 assert( Aig_ManCoNum(pFrames) == 1 );
64 assert( Aig_ManCiNum(pInter) == Aig_ManRegNum(pAig) );
65// assert( (Aig_ManCiNum(pFrames) - Aig_ManRegNum(pAig)) % Saig_ManPiNum(pAig) == 0 );
66
67 // prepare CNFs
68 Cnf_DataLift( pCnfAig, pCnfFrames->nVars );
69 Cnf_DataLift( pCnfInter, pCnfFrames->nVars + pCnfAig->nVars );
70
71 *pvMapRoots = Vec_IntAlloc( 10000 );
72 *pvMapVars = Vec_IntAlloc( 0 );
73 Vec_IntFill( *pvMapVars, pCnfInter->nVars + pCnfAig->nVars + pCnfFrames->nVars, -1 );
74 for ( i = 0; i < pCnfFrames->nVars; i++ )
75 Vec_IntWriteEntry( *pvMapVars, i, -2 );
76
77 // start the solver
78 pSat = M114p_SolverNew( 1 );
79 M114p_SolverSetVarNum( pSat, pCnfInter->nVars + pCnfAig->nVars + pCnfFrames->nVars );
80
81 // add clauses of A
82 // interpolant
83 for ( i = 0; i < pCnfInter->nClauses; i++ )
84 {
85 Vec_IntPush( *pvMapRoots, 0 );
86 if ( !M114p_SolverAddClause( pSat, pCnfInter->pClauses[i], pCnfInter->pClauses[i+1] ) )
87 assert( 0 );
88 }
89 // connector clauses
90 Aig_ManForEachCi( pInter, pObj, i )
91 {
92 pObj2 = Saig_ManLo( pAig, i );
93 Lits[0] = toLitCond( pCnfInter->pVarNums[pObj->Id], 0 );
94 Lits[1] = toLitCond( pCnfAig->pVarNums[pObj2->Id], 1 );
95 Vec_IntPush( *pvMapRoots, 0 );
96 if ( !M114p_SolverAddClause( pSat, Lits, Lits+2 ) )
97 assert( 0 );
98 Lits[0] = toLitCond( pCnfInter->pVarNums[pObj->Id], 1 );
99 Lits[1] = toLitCond( pCnfAig->pVarNums[pObj2->Id], 0 );
100 Vec_IntPush( *pvMapRoots, 0 );
101 if ( !M114p_SolverAddClause( pSat, Lits, Lits+2 ) )
102 assert( 0 );
103 }
104 // one timeframe
105 for ( i = 0; i < pCnfAig->nClauses; i++ )
106 {
107 Vec_IntPush( *pvMapRoots, 0 );
108 if ( !M114p_SolverAddClause( pSat, pCnfAig->pClauses[i], pCnfAig->pClauses[i+1] ) )
109 assert( 0 );
110 }
111 // connector clauses
112 Aig_ManForEachCi( pFrames, pObj, i )
113 {
114 if ( i == Aig_ManRegNum(pAig) )
115 break;
116// Vec_IntPush( vVarsAB, pCnfFrames->pVarNums[pObj->Id] );
117 Vec_IntWriteEntry( *pvMapVars, pCnfFrames->pVarNums[pObj->Id], i );
118
119 pObj2 = Saig_ManLi( pAig, i );
120 Lits[0] = toLitCond( pCnfFrames->pVarNums[pObj->Id], 0 );
121 Lits[1] = toLitCond( pCnfAig->pVarNums[pObj2->Id], 1 );
122 Vec_IntPush( *pvMapRoots, 0 );
123 if ( !M114p_SolverAddClause( pSat, Lits, Lits+2 ) )
124 assert( 0 );
125 Lits[0] = toLitCond( pCnfFrames->pVarNums[pObj->Id], 1 );
126 Lits[1] = toLitCond( pCnfAig->pVarNums[pObj2->Id], 0 );
127 Vec_IntPush( *pvMapRoots, 0 );
128 if ( !M114p_SolverAddClause( pSat, Lits, Lits+2 ) )
129 assert( 0 );
130 }
131 // add clauses of B
132 for ( i = 0; i < pCnfFrames->nClauses; i++ )
133 {
134 Vec_IntPush( *pvMapRoots, 1 );
135 if ( !M114p_SolverAddClause( pSat, pCnfFrames->pClauses[i], pCnfFrames->pClauses[i+1] ) )
136 {
137// assert( 0 );
138 break;
139 }
140 }
141 // return clauses to the original state
142 Cnf_DataLift( pCnfAig, -pCnfFrames->nVars );
143 Cnf_DataLift( pCnfInter, -pCnfFrames->nVars -pCnfAig->nVars );
144 return pSat;
145}
146
147
159int Inter_ManResolveM114p( Vec_Int_t * vResolvent, int * pLits, int nLits, int iVar )
160{
161 int i, k, iLit = -1, fFound = 0;
162 // find the variable in the clause
163 for ( i = 0; i < vResolvent->nSize; i++ )
164 if ( lit_var(vResolvent->pArray[i]) == iVar )
165 {
166 iLit = vResolvent->pArray[i];
167 vResolvent->pArray[i] = vResolvent->pArray[--vResolvent->nSize];
168 break;
169 }
170 assert( iLit != -1 );
171 // add other variables
172 for ( i = 0; i < nLits; i++ )
173 {
174 if ( lit_var(pLits[i]) == iVar )
175 {
176 assert( iLit == lit_neg(pLits[i]) );
177 fFound = 1;
178 continue;
179 }
180 // check if this literal appears
181 for ( k = 0; k < vResolvent->nSize; k++ )
182 if ( vResolvent->pArray[k] == pLits[i] )
183 break;
184 if ( k < vResolvent->nSize )
185 continue;
186 // add this literal
187 Vec_IntPush( vResolvent, pLits[i] );
188 }
189 assert( fFound );
190 return 1;
191}
192
208Aig_Man_t * Inter_ManInterpolateM114pPudlak( M114p_Solver_t s, Vec_Int_t * vMapRoots, Vec_Int_t * vMapVars )
209{
210 Aig_Man_t * p;
211 Aig_Obj_t * pInter, * pInter2, * pVar;
212 Vec_Ptr_t * vInters;
213 Vec_Int_t * vLiterals, * vClauses, * vResolvent;
214 int * pLitsNext, nLitsNext, nOffset, iLit;
215 int * pLits, * pClauses, * pVars;
216 int nLits, nVars, i, k, v, iVar;
218 vInters = Vec_PtrAlloc( 1000 );
219
220 vLiterals = Vec_IntAlloc( 10000 );
221 vClauses = Vec_IntAlloc( 1000 );
222 vResolvent = Vec_IntAlloc( 100 );
223
224 // create elementary variables
225 p = Aig_ManStart( 10000 );
226 Vec_IntForEachEntry( vMapVars, iVar, i )
227 if ( iVar >= 0 )
228 Aig_IthVar(p, iVar);
229 // process root clauses
230 M114p_SolverForEachRoot( s, &pLits, nLits, i )
231 {
232 if ( Vec_IntEntry(vMapRoots, i) == 1 ) // clause of B
233 pInter = Aig_ManConst1(p);
234 else // clause of A
235 pInter = Aig_ManConst0(p);
236 Vec_PtrPush( vInters, pInter );
237
238 // save the root clause
239 Vec_IntPush( vClauses, Vec_IntSize(vLiterals) );
240 Vec_IntPush( vLiterals, nLits );
241 for ( v = 0; v < nLits; v++ )
242 Vec_IntPush( vLiterals, pLits[v] );
243 }
244 assert( Vec_PtrSize(vInters) == Vec_IntSize(vMapRoots) );
245
246 // process learned clauses
247 M114p_SolverForEachChain( s, &pClauses, &pVars, nVars, i )
248 {
249 pInter = Vec_PtrEntry( vInters, pClauses[0] );
250
251 // initialize the resolvent
252 nOffset = Vec_IntEntry( vClauses, pClauses[0] );
253 nLitsNext = Vec_IntEntry( vLiterals, nOffset );
254 pLitsNext = Vec_IntArray(vLiterals) + nOffset + 1;
255 Vec_IntClear( vResolvent );
256 for ( v = 0; v < nLitsNext; v++ )
257 Vec_IntPush( vResolvent, pLitsNext[v] );
258
259 for ( k = 0; k < nVars; k++ )
260 {
261 iVar = Vec_IntEntry( vMapVars, pVars[k] );
262 pInter2 = Vec_PtrEntry( vInters, pClauses[k+1] );
263
264 // resolve it with the next clause
265 nOffset = Vec_IntEntry( vClauses, pClauses[k+1] );
266 nLitsNext = Vec_IntEntry( vLiterals, nOffset );
267 pLitsNext = Vec_IntArray(vLiterals) + nOffset + 1;
268 Inter_ManResolveM114p( vResolvent, pLitsNext, nLitsNext, pVars[k] );
269
270 if ( iVar == -1 ) // var of A
271 pInter = Aig_Or( p, pInter, pInter2 );
272 else if ( iVar == -2 ) // var of B
273 pInter = Aig_And( p, pInter, pInter2 );
274 else // var of C
275 {
276 // check polarity of the pivot variable in the clause
277 for ( v = 0; v < nLitsNext; v++ )
278 if ( lit_var(pLitsNext[v]) == pVars[k] )
279 break;
280 assert( v < nLitsNext );
281 pVar = Aig_NotCond( Aig_IthVar(p, iVar), lit_sign(pLitsNext[v]) );
282 pInter = Aig_Mux( p, pVar, pInter, pInter2 );
283 }
284 }
285 Vec_PtrPush( vInters, pInter );
286
287 // store the resulting clause
288 Vec_IntPush( vClauses, Vec_IntSize(vLiterals) );
289 Vec_IntPush( vLiterals, Vec_IntSize(vResolvent) );
290 Vec_IntForEachEntry( vResolvent, iLit, v )
291 Vec_IntPush( vLiterals, iLit );
292 }
293 assert( Vec_PtrSize(vInters) == M114p_SolverProofClauseNum(s) );
294 assert( Vec_IntSize(vResolvent) == 0 ); // the empty clause
295 Vec_PtrFree( vInters );
296 Vec_IntFree( vLiterals );
297 Vec_IntFree( vClauses );
298 Vec_IntFree( vResolvent );
299 Aig_ObjCreateCo( p, pInter );
300 Aig_ManCleanup( p );
301 return p;
302}
303
304
320Aig_Man_t * Inter_ManpInterpolateM114( M114p_Solver_t s, Vec_Int_t * vMapRoots, Vec_Int_t * vMapVars )
321{
322 Aig_Man_t * p;
323 Aig_Obj_t * pInter, * pInter2, * pVar;
324 Vec_Ptr_t * vInters;
325 int * pLits, * pClauses, * pVars;
326 int nLits, nVars, i, k, iVar;
327 int nClauses;
328
329 nClauses = M114p_SolverProofClauseNum(s);
330
332
333 vInters = Vec_PtrAlloc( 1000 );
334 // process root clauses
335 p = Aig_ManStart( 10000 );
336 M114p_SolverForEachRoot( s, &pLits, nLits, i )
337 {
338 if ( Vec_IntEntry(vMapRoots, i) == 1 ) // clause of B
339 pInter = Aig_ManConst1(p);
340 else // clause of A
341 {
342 pInter = Aig_ManConst0(p);
343 for ( k = 0; k < nLits; k++ )
344 {
345 iVar = Vec_IntEntry( vMapVars, lit_var(pLits[k]) );
346 if ( iVar < 0 ) // var of A or B
347 continue;
348 // this is a variable of C
349 pVar = Aig_NotCond( Aig_IthVar(p, iVar), lit_sign(pLits[k]) );
350 pInter = Aig_Or( p, pInter, pVar );
351 }
352 }
353 Vec_PtrPush( vInters, pInter );
354 }
355// assert( Vec_PtrSize(vInters) == Vec_IntSize(vMapRoots) );
356
357 // process learned clauses
358 M114p_SolverForEachChain( s, &pClauses, &pVars, nVars, i )
359 {
360 pInter = Vec_PtrEntry( vInters, pClauses[0] );
361 for ( k = 0; k < nVars; k++ )
362 {
363 iVar = Vec_IntEntry( vMapVars, pVars[k] );
364 pInter2 = Vec_PtrEntry( vInters, pClauses[k+1] );
365 if ( iVar == -1 ) // var of A
366 pInter = Aig_Or( p, pInter, pInter2 );
367 else // var of B or C
368 pInter = Aig_And( p, pInter, pInter2 );
369 }
370 Vec_PtrPush( vInters, pInter );
371 }
372
373 assert( Vec_PtrSize(vInters) == M114p_SolverProofClauseNum(s) );
374 Vec_PtrFree( vInters );
375 Aig_ObjCreateCo( p, pInter );
376 Aig_ManCleanup( p );
378 return p;
379}
380
381
393int Inter_ManPerformOneStepM114p( Inter_Man_t * p, int fUsePudlak, int fUseOther )
394{
395 M114p_Solver_t pSat;
396 Vec_Int_t * vMapRoots, * vMapVars;
397 clock_t clk;
398 int status, RetValue;
399 assert( p->pInterNew == NULL );
400 // derive the SAT solver
401 pSat = Inter_ManDeriveSatSolverM114p( p->pInter, p->pCnfInter,
402 p->pAigTrans, p->pCnfAig, p->pFrames, p->pCnfFrames,
403 &vMapRoots, &vMapVars );
404 // solve the problem
405clk = clock();
406 status = M114p_SolverSolve( pSat, NULL, NULL, 0 );
407 p->nConfCur = M114p_SolverGetConflictNum( pSat );
408p->timeSat += clock() - clk;
409 if ( status == 0 )
410 {
411 RetValue = 1;
412// Inter_ManpInterpolateM114Report( pSat, vMapRoots, vMapVars );
413
414clk = clock();
415 if ( fUsePudlak )
416 p->pInterNew = Inter_ManInterpolateM114pPudlak( pSat, vMapRoots, vMapVars );
417 else
418 p->pInterNew = Inter_ManpInterpolateM114( pSat, vMapRoots, vMapVars );
419p->timeInt += clock() - clk;
420 }
421 else if ( status == 1 )
422 {
423 RetValue = 0;
424 }
425 else
426 {
427 RetValue = -1;
428 }
429 M114p_SolverDelete( pSat );
430 Vec_IntFree( vMapRoots );
431 Vec_IntFree( vMapVars );
432 return RetValue;
433}
434
438
440
441#endif
442
443
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Definition aig.h:393
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Definition aigOper.c:104
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
Definition aigObj.c:66
Aig_Obj_t * Aig_Mux(Aig_Man_t *p, Aig_Obj_t *pC, Aig_Obj_t *p1, Aig_Obj_t *p0)
Definition aigOper.c:317
struct Aig_Obj_t_ Aig_Obj_t
Definition aig.h:51
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
Definition aigMan.c:47
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Definition aig.h:50
int Aig_ManCleanup(Aig_Man_t *p)
Definition aigMan.c:265
Aig_Obj_t * Aig_IthVar(Aig_Man_t *p, int i)
FUNCTION DEFINITIONS ///.
Definition aigOper.c:63
Aig_Obj_t * Aig_Or(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Definition aigOper.c:259
ABC_DLL int Aig_ManCheck(Aig_Man_t *p)
FUNCTION DECLARATIONS ///.
Definition aigCheck.c:45
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
struct Cnf_Dat_t_ Cnf_Dat_t
Definition cnf.h:52
void Cnf_DataLift(Cnf_Dat_t *p, int nVarsPlus)
Definition cnfMan.c:232
Cube * p
Definition exorList.c:222
typedefABC_NAMESPACE_HEADER_START struct Inter_Man_t_ Inter_Man_t
INCLUDES ///.
Definition intInt.h:49
int M114p_SolverSolve(M114p_Solver_t s, lit *begin, lit *end, int nConfLimit)
int M114p_SolverProofIsReady(M114p_Solver_t s)
int M114p_SolverGetConflictNum(M114p_Solver_t s)
int M114p_SolverProofClauseNum(M114p_Solver_t s)
void M114p_SolverSetVarNum(M114p_Solver_t s, int nVars)
#define M114p_SolverForEachRoot(s, ppLits, nLits, i)
Definition m114p.h:34
void M114p_SolverDelete(M114p_Solver_t s)
ABC_NAMESPACE_HEADER_START M114p_Solver_t M114p_SolverNew(int fRecordProof)
#define M114p_SolverForEachChain(s, ppClauses, ppVars, nVars, i)
Definition m114p.h:39
int M114p_SolverAddClause(M114p_Solver_t s, lit *begin, lit *end)
ABC_NAMESPACE_HEADER_START typedef int M114p_Solver_t
Definition m114p_types.h:9
int Id
Definition aig.h:85
int nVars
Definition cnf.h:59
int * pVarNums
Definition cnf.h:63
int ** pClauses
Definition cnf.h:62
int nClauses
Definition cnf.h:61
#define assert(ex)
Definition util_old.h:213
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42