150{
154 Vec_Int_t * vTopVarNums, * vState, * vTopVarIds = NULL;
156 Aig_Obj_t * pObjPi, * pObjPiCopy, * pObjPo;
157 int i, k, f, Lits[2], status = -1, RetValue, nSatVarNum, nConfPrev;
158 int nOldSize, iReg, iLast, fAdded, nConstrs = 0, nClauses = 0;
159 abctime clk, nTimeToStop = nTimeOut ? nTimeOut * CLOCKS_PER_SEC + Abc_Clock() : 0;
160 assert( fUnique == 0 || fUniqueAll == 0 );
161 assert( Saig_ManPoNum(
p) == 1 );
163
164
165 vBot = Vec_PtrAlloc( 100 );
166 vTop = Vec_PtrAlloc( 100 );
167 vState = Vec_IntAlloc( 1000 );
168 Vec_PtrPush( vTop, Aig_ManCo(
p, 0) );
169
170 vTopVarNums = Vec_IntAlloc( 100 );
171
174
175
176 if ( nTimeToStop )
177 sat_solver_set_runtime_limit( pSat, nTimeToStop );
178
179
180 RetValue = -1;
181 nSatVarNum = 0;
182 if ( fVerbose )
183 printf( "Induction parameters: FramesMax = %5d. ConflictMax = %6d.\n", nFramesMax, nConfMax );
184 for ( f = 0; ; f++ )
185 {
186 if ( f > 0 )
187 {
190 }
191 clk = Abc_Clock();
192
194
196
197 pCnfPart =
Cnf_Derive( pAigPart, Aig_ManCoNum(pAigPart) );
199 nSatVarNum += pCnfPart->
nVars;
201
202
203 if ( fGetCex && vTopVarIds == NULL )
204 {
205 vTopVarIds = Vec_IntStartFull( Aig_ManCiNum(
p) );
207 {
208 if ( pObjPi->
pData == NULL )
209 continue;
211 assert( Aig_ObjIsCi(pObjPiCopy) );
212 if ( Saig_ObjIsPi(
p, pObjPi) )
213 Vec_IntWriteEntry( vTopVarIds, Aig_ObjCioId(pObjPi) + Saig_ManRegNum(
p), pCnfPart->
pVarNums[Aig_ObjId(pObjPiCopy)] );
214 else if ( Saig_ObjIsLo(
p, pObjPi) )
215 Vec_IntWriteEntry( vTopVarIds, Aig_ObjCioId(pObjPi) - Saig_ManPiNum(
p), pCnfPart->
pVarNums[Aig_ObjId(pObjPiCopy)] );
217 }
218 }
219
220
221 assert( Aig_ManCoNum(pAigPart)-1 == Vec_IntSize(vTopVarNums) );
223 {
224 if ( i == 0 )
225 {
226
227
228
229
230 Lits[0] = toLitCond( pCnfPart->
pVarNums[pObjPo->
Id], f>0 );
233 nClauses++;
234 continue;
235 }
236 Lits[0] = toLitCond( Vec_IntEntry(vTopVarNums, i-1), 0 );
237 Lits[1] = toLitCond( pCnfPart->
pVarNums[pObjPo->
Id], 1 );
240 Lits[0] = toLitCond( Vec_IntEntry(vTopVarNums, i-1), 1 );
241 Lits[1] = toLitCond( pCnfPart->
pVarNums[pObjPo->
Id], 0 );
244 nClauses += 2;
245 }
246
247 for ( i = 0; i < pCnfPart->
nClauses; i++ )
249 break;
250 if ( i < pCnfPart->nClauses )
251 {
252
253 RetValue = 1;
254 break;
255 }
256
257
258 Vec_PtrClear( vTop );
259 Vec_PtrPush( vTop, Aig_ManCo(
p, 0) );
260 Vec_IntClear( vTopVarNums );
261 nOldSize = Vec_IntSize(vState);
262 Vec_IntFillExtra( vState, nOldSize + Aig_ManRegNum(
p), -1 );
264 {
265 assert( Aig_ObjIsCi(pObjPi) );
266 if ( Saig_ObjIsLo(
p, pObjPi) )
267 {
269 assert( pObjPiCopy != NULL );
270 Vec_PtrPush( vTop, Saig_ObjLoToLi(
p, pObjPi) );
271 Vec_IntPush( vTopVarNums, pCnfPart->
pVarNums[pObjPiCopy->
Id] );
272
273 iReg = pObjPi->
CioId - Saig_ManPiNum(
p);
274 assert( iReg >= 0 && iReg < Aig_ManRegNum(
p) );
275 Vec_IntWriteEntry( vState, nOldSize+iReg, pCnfPart->
pVarNums[pObjPiCopy->
Id] );
276 }
277 }
278 assert( Vec_IntSize(vState)%Aig_ManRegNum(
p) == 0 );
279 iLast = Vec_IntSize(vState)/Aig_ManRegNum(
p);
280 if ( fUniqueAll )
281 {
282 for ( i = 1; i < iLast-1; i++ )
283 {
284 nConstrs++;
285 if ( fVeryVerbose )
286 printf( "Adding constaint for state %2d and state %2d.\n", i, iLast-1 );
287 if (
Saig_ManAddUniqueness( pSat, vState, Aig_ManRegNum(
p), i, iLast-1, &nSatVarNum, &nClauses, fVerbose ) )
288 break;
289 }
290 if ( i < iLast-1 )
291 {
292 RetValue = 1;
293 break;
294 }
295 }
296
297nextrun:
298 fAdded = 0;
299
301 status =
sat_solver_solve( pSat, NULL, NULL, (ABC_INT64_T)nConfMax, 0, 0, 0 );
302 if ( fVerbose )
303 {
304 printf( "Frame %4d : PI =%5d. PO =%5d. AIG =%5d. Var =%7d. Clau =%7d. Conf =%7d. ",
305 f, Aig_ManCiNum(pAigPart), Aig_ManCoNum(pAigPart), Aig_ManNodeNum(pAigPart),
307 ABC_PRT(
"Time", Abc_Clock() - clk );
308 }
310 break;
312 {
313 RetValue = 1;
314 break;
315 }
317
318 if ( fVeryVerbose )
319 {
321 {
322 if ( i && (i % Aig_ManRegNum(
p)) == 0 )
323 printf( "\n" );
324 if ( (i % Aig_ManRegNum(
p)) == 0 )
325 printf(
" State %3d : ", i/Aig_ManRegNum(
p) );
326 printf( "%c", (iReg >= 0) ? ('0' + sat_solver_var_value(pSat, iReg)) : 'x' );
327 }
328 printf( "\n" );
329 }
330 if ( nFramesMax && f == nFramesMax - 1 )
331 {
332
334 if ( fGetCex )
335 {
336 int VarNum, iBit = 0;
338 pCex->iFrame = 0;
339 pCex->iPo = 0;
341 {
342 if ( VarNum >= 0 && sat_solver_var_value( pSat, VarNum ) )
343 Abc_InfoSetBit( pCex->pData, iBit );
344 iBit++;
345 }
346 assert( iBit == pCex->nBits );
349 }
350 break;
351 }
352 if ( fUnique )
353 {
354 for ( i = 1; i < iLast; i++ )
355 {
356 for ( k = i+1; k < iLast; k++ )
357 {
359 continue;
360 nConstrs++;
361 fAdded = 1;
362 if ( fVeryVerbose )
363 printf( "Adding constaint for state %2d and state %2d.\n", i, k );
365 break;
366 }
367 if ( k < iLast )
368 break;
369 }
370 if ( i < iLast )
371 {
372 RetValue = 1;
373 break;
374 }
375 }
376 if ( fAdded )
377 goto nextrun;
378 }
379 if ( fVerbose )
380 {
381 if ( nTimeToStop && Abc_Clock() >= nTimeToStop )
382 printf( "Timeout (%d sec) was reached during iteration %d.\n", nTimeOut, f+1 );
384 printf( "Conflict limit (%d) was reached during iteration %d.\n", nConfMax, f+1 );
385 else if ( fUnique || fUniqueAll )
386 printf( "Completed %d iterations and added %d uniqueness constraints.\n", f+1, nConstrs );
387 else
388 printf( "Completed %d iterations.\n", f+1 );
389 }
390
394 Vec_IntFree( vTopVarNums );
395 Vec_PtrFree( vTop );
396 Vec_PtrFree( vBot );
397 Vec_IntFree( vState );
398 Vec_IntFreeP( &vTopVarIds );
399 return RetValue;
400}
Aig_Man_t * Aig_ManDupSimpleDfsPart(Aig_Man_t *p, Vec_Ptr_t *vPis, Vec_Ptr_t *vCos)
void Aig_ManSetCioIds(Aig_Man_t *p)
void Aig_ManStop(Aig_Man_t *p)
void Aig_SupportNodes(Aig_Man_t *p, Aig_Obj_t **ppObjs, int nObjs, Vec_Ptr_t *vSupp)
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
struct Aig_Obj_t_ Aig_Obj_t
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
#define Aig_ManForEachCo(p, pObj, i)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Cnf_Dat_t * Cnf_Derive(Aig_Man_t *pAig, int nOutputs)
struct Cnf_Dat_t_ Cnf_Dat_t
void Cnf_DataFree(Cnf_Dat_t *p)
void Cnf_DataLift(Cnf_Dat_t *p, int nVarsPlus)
int Saig_ManAddUniqueness(sat_solver *pSat, Vec_Int_t *vState, int nRegs, int i, int k, int *pnSatVarNum, int *pnClauses, int fVerbose)
ABC_NAMESPACE_IMPL_START int Saig_ManStatesAreEqual(sat_solver *pSat, Vec_Int_t *vState, int nRegs, int i, int k)
DECLARATIONS ///.
sat_solver * sat_solver_new(void)
void sat_solver_setnvars(sat_solver *s, int n)
void sat_solver_delete(sat_solver *s)
void Abc_CexFree(Abc_Cex_t *p)
ABC_NAMESPACE_IMPL_START Abc_Cex_t * Abc_CexAlloc(int nRegs, int nRealPis, int nFrames)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.