158 DdNode * bRes, * bTemp, * bVar;
159 int i, iGroupFirst, iGroupLast;
161 TimeStop =
p->dd->TimeStop;
p->dd->TimeStop = 0;
162 bRes = Cudd_ReadOne(
p->dd ); Cudd_Ref( bRes );
165 if ( fBackward && Saig_ObjIsPi(
p->pAig, pObj) )
167 iGroupFirst = Vec_IntEntry(
p->vVarBegs, Aig_ObjId(pObj));
168 iGroupLast = Vec_IntEntry(
p->vVarEnds, Aig_ObjId(pObj));
169 assert( iGroupFirst <= iGroupLast );
170 if ( iGroupFirst < iGroupLast )
172 bVar = Cudd_bddIthVar(
p->dd, Vec_IntEntry(
p->vObj2Var, Aig_ObjId(pObj)) );
173 bRes = Cudd_bddAnd(
p->dd, bTemp = bRes, bVar ); Cudd_Ref( bRes );
174 Cudd_RecursiveDeref(
p->dd, bTemp );
178 if ( fBackward && Saig_ObjIsPi(
p->pAig, pObj) )
180 iGroupFirst = Vec_IntEntry(
p->vVarBegs, Aig_ObjId(pObj));
181 iGroupLast = Vec_IntEntry(
p->vVarEnds, Aig_ObjId(pObj));
182 assert( iGroupFirst <= iGroupLast );
183 if ( iGroupFirst < iGroupLast )
185 bVar = Cudd_bddIthVar(
p->dd, Vec_IntEntry(
p->vObj2Var, Aig_ObjId(pObj)) );
186 bRes = Cudd_bddAnd(
p->dd, bTemp = bRes, bVar ); Cudd_Ref( bRes );
187 Cudd_RecursiveDeref(
p->dd, bTemp );
190 p->dd->TimeStop = TimeStop;
473 DdNode * bState = NULL, * bImage, * bOneCube, * bTemp, * bRing;
474 int i, v, RetValue, nPiOffset;
475 char * pValues =
ABC_ALLOC(
char, Cudd_ReadSize(
p->ddR) );
476 assert( Vec_PtrSize(
p->vRings) > 0 );
479 p->ddR->TimeStop = 0;
490 pCex =
Abc_CexAlloc( Saig_ManRegNum(
p->pAig), Saig_ManPiNum(
p->pAig), Vec_PtrSize(
p->vRings) );
491 pCex->iFrame = Vec_PtrSize(
p->vRings) - 1;
495 bOneCube = Cudd_bddIntersect(
p->ddR, (DdNode *)Vec_PtrEntryLast(
p->vRings),
p->ddR->bFunc ); Cudd_Ref( bOneCube );
496 RetValue = Cudd_bddPickOneCube(
p->ddR, bOneCube, pValues );
497 Cudd_RecursiveDeref(
p->ddR, bOneCube );
501 nPiOffset = Saig_ManRegNum(
p->pAig) + Saig_ManPiNum(
p->pAig) * (Vec_PtrSize(
p->vRings) - 1);
503 if ( pValues[Saig_ManRegNum(
p->pAig)+i] == 1 )
504 Abc_InfoSetBit( pCex->pData, nPiOffset + i );
507 if ( Vec_PtrSize(
p->vRings) > 1 )
514 if ( v == Vec_PtrSize(
p->vRings) - 1 )
522 Cudd_RecursiveDeref(
p->dd, bState );
527 Cudd_RecursiveDeref(
p->dd, bTemp );
531 bOneCube = Cudd_bddIntersect(
p->ddR, bImage, bRing ); Cudd_Ref( bOneCube );
532 Cudd_RecursiveDeref(
p->ddR, bImage );
535 RetValue = Cudd_bddPickOneCube(
p->ddR, bOneCube, pValues );
536 Cudd_RecursiveDeref(
p->ddR, bOneCube );
544 nPiOffset -= Saig_ManPiNum(
p->pAig);
546 if ( pValues[Saig_ManRegNum(
p->pAig)+i] == 1 )
547 Abc_InfoSetBit( pCex->pData, nPiOffset + i );
553 assert( pValues[i] == 0 );
560 assert( nPiOffset == Saig_ManRegNum(
p->pAig) );
564 assert( RetValue >= 0 && RetValue < Saig_ManPoNum(
p->pAigGlo) );
565 pCex->iPo = RetValue;
584 int * pNs2Glo = Vec_IntArray(
p->vNs2Glo );
585 int * pCs2Glo = Vec_IntArray(
p->vCs2Glo );
586 int * pGlo2Cs = Vec_IntArray(
p->vGlo2Cs );
587 DdNode * bCurrent, * bReached, * bNext, * bTemp, * bCube;
588 DdNode * bConstrCs, * bConstrNs;
589 abctime clk2, clk = Abc_Clock();
590 int nIters, nBddSize = 0;
594 p->pPars->TimeTarget =
p->pPars->TimeLimit ?
p->pPars->TimeLimit * CLOCKS_PER_SEC + Abc_Clock(): 0;
603 p->dd = Cudd_Init( Vec_IntSize(
p->vVar2Obj), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
604 p->ddR = Cudd_Init( Aig_ManCiNum(
p->pAig), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
605 if ( pddGlo && *pddGlo )
606 p->ddG = *pddGlo, *pddGlo = NULL;
608 p->ddG = Cudd_Init( Aig_ManRegNum(
p->pAig), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
610 if (
p->pPars->fReorder )
612 Cudd_AutodynEnable(
p->dd, CUDD_REORDER_SYMM_SIFT );
613 Cudd_AutodynEnable(
p->ddG, CUDD_REORDER_SYMM_SIFT );
614 Cudd_AutodynEnable(
p->ddR, CUDD_REORDER_SYMM_SIFT );
618 Cudd_AutodynDisable(
p->dd );
619 Cudd_AutodynDisable(
p->ddG );
620 Cudd_AutodynDisable(
p->ddR );
624 p->dd->TimeStop =
p->pPars->TimeTarget;
625 p->ddG->TimeStop =
p->pPars->TimeTarget;
626 p->ddR->TimeStop =
p->pPars->TimeTarget;
630 if (
p->ddR->bFunc == NULL )
632 if ( !
p->pPars->fSilent )
633 printf(
"Reached timeout (%d seconds) during constructing the bad states.\n",
p->pPars->TimeLimit );
634 p->pPars->iFrame = -1;
637 Cudd_Ref(
p->ddR->bFunc );
649 bReached =
p->ddG->bFunc;
p->ddG->bFunc = NULL;
661 for ( nIters = 0; nIters <
p->pPars->nIterMax; nIters++ )
665 if (
p->pPars->TimeLimit && Abc_Clock() >
p->pPars->TimeTarget )
667 if ( !
p->pPars->fSilent )
668 printf(
"Reached timeout during image computation (%d seconds).\n",
p->pPars->TimeLimit );
669 p->pPars->iFrame = nIters - 1;
670 Cudd_RecursiveDeref(
p->dd, bCurrent ); bCurrent = NULL;
671 Cudd_RecursiveDeref(
p->dd, bConstrCs ); bConstrCs = NULL;
672 Cudd_RecursiveDeref(
p->dd, bConstrNs ); bConstrNs = NULL;
673 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
681 if ( !
p->pPars->fSilent )
682 printf(
"Reached timeout (%d seconds) during ring transfer.\n",
p->pPars->TimeLimit );
683 p->pPars->iFrame = nIters - 1;
684 Cudd_RecursiveDeref(
p->dd, bCurrent ); bCurrent = NULL;
685 Cudd_RecursiveDeref(
p->dd, bConstrCs ); bConstrCs = NULL;
686 Cudd_RecursiveDeref(
p->dd, bConstrNs ); bConstrNs = NULL;
687 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
691 Vec_PtrPush(
p->vRings, bTemp );
694 if ( !
p->pPars->fSkipOutCheck && !Cudd_bddLeq(
p->ddR, bTemp, Cudd_Not(
p->ddR->bFunc) ) )
696 assert(
p->pAigGlo->pSeqModel == NULL );
697 if ( !
p->pPars->fBackward )
699 if ( !
p->pPars->fSilent )
701 if ( !
p->pPars->fBackward )
702 Abc_Print( 1,
"Output %d of miter \"%s\" was asserted in frame %d. ",
p->pAigGlo->pSeqModel->iPo,
p->pAigGlo->pName,
p->pAigGlo->pName, nIters );
704 Abc_Print( 1,
"Output ??? of miter \"%s\" was asserted in frame %d (counter-example is not produced). ",
p->pAigGlo->pName, nIters );
705 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
707 p->pPars->iFrame = nIters - 1;
708 Cudd_RecursiveDeref(
p->dd, bCurrent ); bCurrent = NULL;
709 Cudd_RecursiveDeref(
p->dd, bConstrCs ); bConstrCs = NULL;
710 Cudd_RecursiveDeref(
p->dd, bConstrNs ); bConstrNs = NULL;
711 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
718 bCurrent = Cudd_bddAnd(
p->dd, bTemp = bCurrent, bConstrCs ); Cudd_Ref( bCurrent );
719 Cudd_RecursiveDeref(
p->dd, bTemp );
724 bCurrent = Cudd_bddExistAbstract(
p->dd, bTemp = bCurrent, bCube ); Cudd_Ref( bCurrent );
725 Cudd_RecursiveDeref(
p->dd, bTemp );
726 Cudd_RecursiveDeref(
p->dd, bCube );
732 if ( !
p->pPars->fSilent )
733 printf(
"Reached timeout (%d seconds) during image computation.\n",
p->pPars->TimeLimit );
734 p->pPars->iFrame = nIters - 1;
735 Cudd_RecursiveDeref(
p->dd, bCurrent ); bCurrent = NULL;
736 Cudd_RecursiveDeref(
p->dd, bConstrCs ); bConstrCs = NULL;
737 Cudd_RecursiveDeref(
p->dd, bConstrNs ); bConstrNs = NULL;
738 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
742 Cudd_RecursiveDeref(
p->dd, bCurrent ); bCurrent = NULL;
747 bNext = Cudd_bddAnd(
p->dd, bTemp = bNext, bConstrNs ); Cudd_Ref( bNext );
748 Cudd_RecursiveDeref(
p->dd, bTemp );
759 if ( !
p->pPars->fSilent )
760 printf(
"Reached timeout (%d seconds) during image computation in transfer 1.\n",
p->pPars->TimeLimit );
761 p->pPars->iFrame = nIters - 1;
762 Cudd_RecursiveDeref(
p->dd, bTemp );
763 Cudd_RecursiveDeref(
p->dd, bConstrCs ); bConstrCs = NULL;
764 Cudd_RecursiveDeref(
p->dd, bConstrNs ); bConstrNs = NULL;
765 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
769 Cudd_RecursiveDeref(
p->dd, bTemp );
773 if ( Cudd_bddLeq(
p->ddG, bNext, bReached ) )
775 Cudd_RecursiveDeref(
p->ddG, bNext ); bNext = NULL;
780 nBddSize = Cudd_DagSize(bNext);
781 if ( nBddSize >
p->pPars->nBddMax )
783 Cudd_RecursiveDeref(
p->ddG, bNext ); bNext = NULL;
788 bCurrent = Cudd_bddAnd(
p->ddG, bNext, Cudd_Not(bReached) );
789 if ( bCurrent == NULL )
791 Cudd_RecursiveDeref(
p->ddG, bNext ); bNext = NULL;
792 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
795 Cudd_Ref( bCurrent );
807 if ( bCurrent == NULL )
809 if ( !
p->pPars->fSilent )
810 printf(
"Reached timeout (%d seconds) during image computation in transfer 2.\n",
p->pPars->TimeLimit );
811 p->pPars->iFrame = nIters - 1;
812 Cudd_RecursiveDeref(
p->ddG, bTemp );
813 Cudd_RecursiveDeref(
p->dd, bConstrCs ); bConstrCs = NULL;
814 Cudd_RecursiveDeref(
p->dd, bConstrNs ); bConstrNs = NULL;
815 Cudd_RecursiveDeref(
p->ddG, bReached ); bReached = NULL;
818 Cudd_Ref( bCurrent );
819 Cudd_RecursiveDeref(
p->ddG, bTemp );
823 bReached = Cudd_bddOr(
p->ddG, bTemp = bReached, bNext );
824 if ( bReached == NULL )
826 Cudd_RecursiveDeref(
p->ddG, bTemp ); bTemp = NULL;
827 Cudd_RecursiveDeref(
p->ddG, bNext ); bNext = NULL;
830 Cudd_Ref( bReached );
831 Cudd_RecursiveDeref(
p->ddG, bTemp );
832 Cudd_RecursiveDeref(
p->ddG, bNext );
835 if (
p->pPars->fVerbose )
837 fprintf( stdout,
"F =%5d : ", nIters );
838 fprintf( stdout,
"Im =%6d ", nBddSize );
839 fprintf( stdout,
"(%4d %3d) ", Cudd_ReadReorderings(
p->dd), Cudd_ReadGarbageCollections(
p->dd) );
840 fprintf( stdout,
"Rea =%6d ", Cudd_DagSize(bReached) );
841 fprintf( stdout,
"(%4d%4d) ", Cudd_ReadReorderings(
p->ddG), Cudd_ReadGarbageCollections(
p->ddG) );
842 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk2 );
854 Cudd_RecursiveDeref(
p->dd, bConstrCs ); bConstrCs = NULL;
855 Cudd_RecursiveDeref(
p->dd, bConstrNs ); bConstrNs = NULL;
856 if ( bReached == NULL )
858 p->pPars->iFrame = nIters - 1;
863 Cudd_RecursiveDeref(
p->dd, bCurrent );
865 if (
p->pPars->fVerbose )
867 double nMints = Cudd_CountMinterm(
p->ddG, bReached, Saig_ManRegNum(
p->pAig) );
868 if ( nIters >=
p->pPars->nIterMax || nBddSize >
p->pPars->nBddMax )
869 fprintf( stdout,
"Reachability analysis is stopped after %d frames.\n", nIters );
871 fprintf( stdout,
"Reachability analysis completed after %d frames.\n", nIters );
872 fprintf( stdout,
"Reachable states = %.0f. (Ratio = %.4f %%)\n", nMints, 100.0*nMints/pow(2.0, Saig_ManRegNum(
p->pAig)) );
875 if ( nIters >=
p->pPars->nIterMax || nBddSize >
p->pPars->nBddMax )
877 if ( !
p->pPars->fSilent )
878 printf(
"Verified only for states reachable in %d frames. ", nIters );
879 p->pPars->iFrame =
p->pPars->nIterMax;
880 Cudd_RecursiveDeref(
p->ddG, bReached );
885 assert(
p->ddG->bFunc == NULL );
886 p->ddG->bFunc = bReached; bReached = NULL;
887 assert( *pddGlo == NULL );
888 *pddGlo =
p->ddG;
p->ddG = NULL;
891 Cudd_RecursiveDeref(
p->ddG, bReached );
892 if ( !
p->pPars->fSilent )
893 printf(
"The miter is proved unreachable after %d iterations. ", nIters );
894 p->pPars->iFrame = nIters - 1;