102 Vec_Ptr_t * vSupps, * vQuant0, * vQuant1;
103 DdNode * bState = NULL, * bImage, * bOneCube, * bTemp, * bRing;
104 int i, v, RetValue, nPiOffset;
105 char * pValues =
ABC_ALLOC(
char, Cudd_ReadSize(
p->ddR) );
106 assert( Vec_PtrSize(
p->vRings) > 0 );
109 p->ddR->TimeStop = 0;
112 Vec_PtrReverseOrder(
p->vDdMans );
120 pCex =
Abc_CexAlloc( Saig_ManRegNum(
p->pAig), Saig_ManPiNum(
p->pAig), Vec_PtrSize(
p->vRings) );
121 pCex->iFrame = Vec_PtrSize(
p->vRings) - 1;
125 bOneCube = Cudd_bddIntersect(
p->ddR, (DdNode *)Vec_PtrEntryLast(
p->vRings),
p->ddR->bFunc ); Cudd_Ref( bOneCube );
126 RetValue = Cudd_bddPickOneCube(
p->ddR, bOneCube, pValues );
127 Cudd_RecursiveDeref(
p->ddR, bOneCube );
131 nPiOffset = Saig_ManRegNum(
p->pAig) + Saig_ManPiNum(
p->pAig) * (Vec_PtrSize(
p->vRings) - 1);
133 if ( pValues[Saig_ManRegNum(
p->pAig)+i] == 1 )
134 Abc_InfoSetBit( pCex->pData, nPiOffset + i );
137 if ( Vec_PtrSize(
p->vRings) > 1 )
144 if ( v == Vec_PtrSize(
p->vRings) - 1 )
148 vQuant0, vQuant1,
p->vDriRefs,
p->pPars->TimeTarget, 1, 0, 0 );
151 Cudd_RecursiveDeref(
p->dd, bState );
156 Cudd_RecursiveDeref(
p->dd, bTemp );
159 bOneCube = Cudd_bddIntersect(
p->ddR, bImage, bRing ); Cudd_Ref( bOneCube );
160 Cudd_RecursiveDeref(
p->ddR, bImage );
163 RetValue = Cudd_bddPickOneCube(
p->ddR, bOneCube, pValues );
164 Cudd_RecursiveDeref(
p->ddR, bOneCube );
168 nPiOffset -= Saig_ManPiNum(
p->pAig);
170 if ( pValues[Saig_ManRegNum(
p->pAig)+i] == 1 )
171 Abc_InfoSetBit( pCex->pData, nPiOffset + i );
177 assert( pValues[i] == 0 );
184 assert( nPiOffset == Saig_ManRegNum(
p->pAig) );
187 assert( RetValue >= 0 && RetValue < Saig_ManPoNum(
p->pInit) );
188 pCex->iPo = RetValue;
209 int * pLoc2Glo =
p->pPars->fBackward? Vec_IntArray(
p->vCs2Glo ) : Vec_IntArray(
p->vNs2Glo );
210 int * pLoc2GloR =
p->pPars->fBackward? Vec_IntArray(
p->vNs2Glo ) : Vec_IntArray(
p->vCs2Glo );
211 int * pGlo2Loc =
p->pPars->fBackward? Vec_IntArray(
p->vGlo2Ns ) : Vec_IntArray(
p->vGlo2Cs );
212 DdNode * bCurrent, * bReached, * bNext, * bTemp;
213 abctime clk2, clk = Abc_Clock();
214 int nIters, nBddSize;
223 if ( Abc_Clock() >
p->pPars->TimeTarget )
225 if ( !
p->pPars->fSilent )
226 printf(
"Reached timeout (%d seconds) before image computation.\n",
p->pPars->TimeLimit );
227 p->pPars->iFrame = -1;
232 p->dd->TimeStop =
p->pPars->TimeTarget;
233 p->ddG->TimeStop =
p->pPars->TimeTarget;
234 p->ddR->TimeStop =
p->pPars->TimeTarget;
237 if (
p->pPars->fBackward )
243 if ( !
p->pPars->fSilent )
244 printf(
"Reached timeout (%d seconds) while computing bad states.\n",
p->pPars->TimeLimit );
245 p->pPars->iFrame = -1;
252 Cudd_RecursiveDeref(
p->ddR, bTemp );
253 bReached = Cudd_bddTransfer(
p->ddR,
p->ddG, bCurrent ); Cudd_Ref( bReached );
254 Cudd_RecursiveDeref(
p->ddR, bCurrent );
257 if ( bCurrent == NULL )
259 Cudd_RecursiveDeref(
p->ddG, bReached );
260 if ( !
p->pPars->fSilent )
261 printf(
"Reached timeout (%d seconds) during transfer 0.\n",
p->pPars->TimeLimit );
262 p->pPars->iFrame = -1;
265 Cudd_Ref( bCurrent );
271 if (
p->ddR->bFunc == NULL )
273 if ( !
p->pPars->fSilent )
274 printf(
"Reached timeout (%d seconds) while computing bad states.\n",
p->pPars->TimeLimit );
275 p->pPars->iFrame = -1;
278 Cudd_Ref(
p->ddR->bFunc );
287 for ( nIters = 0; nIters <
p->pPars->nIterMax; nIters++ )
291 if (
p->pPars->TimeLimit && Abc_Clock() >
p->pPars->TimeTarget )
293 if ( !
p->pPars->fSilent )
294 printf(
"Reached timeout (%d seconds) during image computation.\n",
p->pPars->TimeLimit );
295 p->pPars->iFrame = nIters - 1;
296 Cudd_RecursiveDeref(
p->dd, bCurrent ); bCurrent = NULL;
297 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
305 if ( !
p->pPars->fSilent )
306 printf(
"Reached timeout (%d seconds) during image computation.\n",
p->pPars->TimeLimit );
307 p->pPars->iFrame = nIters - 1;
308 Cudd_RecursiveDeref(
p->dd, bCurrent ); bCurrent = NULL;
309 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
313 Vec_PtrPush(
p->vRings, bTemp );
316 if ( !
p->pPars->fSkipOutCheck && !Cudd_bddLeq(
p->ddR, bTemp, Cudd_Not(
p->ddR->bFunc) ) )
318 assert(
p->pInit->pSeqModel == NULL );
319 if ( !
p->pPars->fBackward )
321 Cudd_RecursiveDeref(
p->dd, bCurrent ); bCurrent = NULL;
322 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
323 if ( !
p->pPars->fSilent )
325 if ( !
p->pPars->fBackward )
326 Abc_Print( 1,
"Output %d of miter \"%s\" was asserted in frame %d. ",
p->pInit->pSeqModel->iPo,
p->pInit->pName, nIters );
328 Abc_Print( 1,
"Output ??? was asserted in frame %d (counter-example is not produced). ", nIters );
329 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
331 p->pPars->iFrame = nIters - 1;
337 vQuant0, vQuant1,
p->vDriRefs,
p->pPars->TimeTarget,
338 p->pPars->fBackward,
p->pPars->fReorder,
p->pPars->fVeryVerbose );
341 if ( !
p->pPars->fSilent )
342 printf(
"Reached timeout (%d seconds) during image computation.\n",
p->pPars->TimeLimit );
343 p->pPars->iFrame = nIters - 1;
344 Cudd_RecursiveDeref(
p->dd, bCurrent ); bCurrent = NULL;
345 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
349 Cudd_RecursiveDeref(
p->dd, bCurrent ); bCurrent = NULL;
360 if ( !
p->pPars->fSilent )
361 printf(
"Reached timeout (%d seconds) during image computation in transfer 1.\n",
p->pPars->TimeLimit );
362 p->pPars->iFrame = nIters - 1;
363 Cudd_RecursiveDeref(
p->dd, bTemp );
364 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
368 Cudd_RecursiveDeref(
p->dd, bTemp );
370 nBddSize = Cudd_DagSize(bNext);
372 if ( Cudd_bddLeq(
p->ddG, bNext, bReached ) )
374 Cudd_RecursiveDeref(
p->ddG, bNext ); bNext = NULL;
379 bCurrent = Cudd_bddAnd(
p->ddG, bNext, Cudd_Not(bReached) );
380 if ( bCurrent == NULL )
382 if ( !
p->pPars->fSilent )
383 printf(
"Reached timeout (%d seconds) during image computation in transfer 2.\n",
p->pPars->TimeLimit );
384 p->pPars->iFrame = nIters - 1;
385 Cudd_RecursiveDeref(
p->ddG, bNext );
386 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
389 Cudd_Ref( bCurrent );
397 if ( bCurrent == NULL )
399 if ( !
p->pPars->fSilent )
400 printf(
"Reached timeout (%d seconds) during image computation in transfer 2.\n",
p->pPars->TimeLimit );
401 p->pPars->iFrame = nIters - 1;
402 Cudd_RecursiveDeref(
p->ddG, bTemp );
403 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
406 Cudd_Ref( bCurrent );
407 Cudd_RecursiveDeref(
p->ddG, bTemp );
410 bReached = Cudd_bddOr(
p->ddG, bTemp = bReached, bNext ); Cudd_Ref( bReached );
411 Cudd_RecursiveDeref(
p->ddG, bTemp );
412 Cudd_RecursiveDeref(
p->ddG, bNext );
415 if (
p->pPars->fVeryVerbose )
417 double nMints = Cudd_CountMinterm(
p->ddG, bReached, Saig_ManRegNum(
p->pAig) );
419 fprintf( stdout,
" Reachable states = %.0f. (Ratio = %.4f %%)\n", nMints, 100.0*nMints/pow(2.0, Saig_ManRegNum(
p->pAig)) );
422 if (
p->pPars->fVerbose )
424 fprintf( stdout,
"F =%3d : ", nIters );
425 fprintf( stdout,
"Image =%6d ", nBddSize );
426 fprintf( stdout,
"(%4d%4d) ",
427 Cudd_ReadReorderings(
p->dd), Cudd_ReadGarbageCollections(
p->dd) );
428 fprintf( stdout,
"Reach =%6d ", Cudd_DagSize(bReached) );
429 fprintf( stdout,
"(%4d%4d) ",
430 Cudd_ReadReorderings(
p->ddG), Cudd_ReadGarbageCollections(
p->ddG) );
431 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk2 );
435 if ( nIters ==
p->pPars->nIterMax - 1 )
437 if ( !
p->pPars->fSilent )
438 printf(
"Reached limit on the number of timeframes (%d).\n",
p->pPars->nIterMax );
439 p->pPars->iFrame = nIters;
440 Cudd_RecursiveDeref(
p->dd, bCurrent ); bCurrent = NULL;
441 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
445 if ( bReached == NULL )
447 p->pPars->iFrame = nIters - 1;
451 Cudd_RecursiveDeref(
p->dd, bCurrent );
453 if (
p->pPars->fVerbose )
455 double nMints = Cudd_CountMinterm(
p->ddG, bReached, Saig_ManRegNum(
p->pAig) );
456 if ( nIters >=
p->pPars->nIterMax )
457 fprintf( stdout,
"Reachability analysis is stopped after %d frames.\n", nIters );
459 fprintf( stdout,
"Reachability analysis completed after %d frames.\n", nIters );
460 fprintf( stdout,
"Reachable states = %.0f. (Ratio = %.4f %%)\n", nMints, 100.0*nMints/pow(2.0, Saig_ManRegNum(
p->pAig)) );
463 if (
p->pPars->fDumpReached )
466 printf(
"Reached states with %d BDD nodes are dumpted into file \"reached.blif\".\n", Cudd_DagSize(bReached) );
468 Cudd_RecursiveDeref(
p->ddG, bReached );
469 if ( nIters >=
p->pPars->nIterMax )
471 if ( !
p->pPars->fSilent )
473 printf(
"Verified only for states reachable in %d frames. ", nIters );
474 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
476 p->pPars->iFrame =
p->pPars->nIterMax;
479 if ( !
p->pPars->fSilent )
481 printf(
"The miter is proved unreachable after %d iterations. ", nIters );
482 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
484 p->pPars->iFrame = nIters - 1;