58#define kCS_WITH_SAFETY_INVARIANTS 1
59#define kCS_WITH_DISCOVER_MONOTONE_SIGNALS 2
60#define kCS_WITH_SAFETY_AND_DCS_INVARIANTS 3
61#define kCS_WITH_SAFETY_AND_USER_GIVEN_DCS_INVARIANTS 4
75 return Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObj), Aig_ObjFaninC0(pObj));
87 pObj = Aig_ManCo( pAig, liveIndex_0 );
88 return Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObj), Aig_ObjFaninC0(pObj));
95 pObj = Aig_ManCo( pAig, liveIndex_k );
96 return Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObj), Aig_ObjFaninC0(pObj));
106 if( nonFirstIteration == 0 )
114 return Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObj), Aig_ObjFaninC0(pObj));
137 ntkObjId = Abc_NtkCi( pNtk, i )->Id;
145 ntkObjId = Abc_NtkCi( pNtk, Saig_ManPiNum( pAig ) + i )->Id;
154 ntkObjId = Abc_NtkCo( pNtk, i )->Id;
163 ntkObjId = Abc_NtkCo( pNtk, Saig_ManPoNum( pAig ) + i )->Id;
178 Aig_Obj_t *pObj, *pObjAbsorberLo, *pPInNewArg, *pPOutNewArg;
179 Aig_Obj_t *pPIn = NULL, *pPOut = NULL, *pPOutCo = NULL;
180 Aig_Obj_t *pFirstAbsorberOr, *pSecondAbsorberOr;
182 int piCopied = 0, loCreated = 0, loCopied = 0, liCreated = 0, liCopied = 0;
185 assert(*pLiveIndex_0 != -1);
186 if(nonFirstIteration == 0)
187 assert( *pLiveIndex_k == -1 );
189 assert( *pLiveIndex_k != -1 );
198 sprintf(pNewAig->pName,
"%s_%s", pAig->pName,
"kCS");
199 pNewAig->pSpec = NULL;
206 if( *pLiveIndex_k == -1 )
214 pObj = Aig_ManConst1( pAig );
215 pObj->
pData = Aig_ManConst1( pNewAig );
241 nRegCount = loCreated + loCopied;
248 pObj->
pData =
Aig_And( pNewAig, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
254 if( nonFirstIteration == 0 )
258 pPInNewArg = !Aig_IsComplement(pPIn)?
259 (
Aig_Obj_t *)((Aig_Regular(pPIn))->pData) :
260 Aig_Not((
Aig_Obj_t *)((Aig_Regular(pPIn))->pData));
262 pFirstAbsorberOr =
Aig_Or( pNewAig, Aig_Not(pPInNewArg), pObjAbsorberLo );
263 pSecondAbsorberOr =
Aig_Or( pNewAig, pPInNewArg, Aig_Not(pObjAbsorberLo) );
269 pPInNewArg = !Aig_IsComplement(pPIn)?
270 (
Aig_Obj_t *)((Aig_Regular(pPIn))->pData) :
271 Aig_Not((
Aig_Obj_t *)((Aig_Regular(pPIn))->pData));
272 pPOutNewArg = !Aig_IsComplement(pPOut)?
273 (
Aig_Obj_t *)((Aig_Regular(pPOut))->pData) :
274 Aig_Not((
Aig_Obj_t *)((Aig_Regular(pPOut))->pData));
276 pFirstAbsorberOr =
Aig_Or( pNewAig, Aig_Not(pPOutNewArg), pObjAbsorberLo );
277 pSecondAbsorberOr =
Aig_Or( pNewAig, pPInNewArg, Aig_Not(pObjAbsorberLo) );
286 if( i == *pLiveIndex_k )
291 if( nonFirstIteration == 0 )
300 assert( pPOutCo != NULL );
322 assert( *pLiveIndex_k != - 1);
328 Aig_Obj_t *pObjPOSafetyInvar, *pObjSafetyInvar;
329 Aig_Obj_t *pObjPOCSTarget, *pObjCSTarget;
332 pObjPOSafetyInvar = Aig_ManCo( pAig, safetyInvarPO );
333 pObjSafetyInvar = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPOSafetyInvar), Aig_ObjFaninC0(pObjPOSafetyInvar));
334 pObjPOCSTarget = Aig_ManCo( pAig, csTarget );
335 pObjCSTarget = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPOCSTarget), Aig_ObjFaninC0(pObjPOCSTarget));
337 pObjCSTargetNew =
Aig_And( pAig, pObjSafetyInvar, pObjCSTarget );
341int flipConePdr(
Aig_Man_t *pAig,
int directive,
int targetCSPropertyIndex,
int safetyInvariantPOIndex,
int absorberCount )
351 fileName = (
char *)
malloc(
sizeof(
char) * 50);
352 sprintf(fileName,
"%s_%d.%s",
"kLive", absorberCount,
"blif" );
356 assert( safetyInvariantPOIndex != -1 );
363 for( i=0; i<Saig_ManPoNum(pAig); i++ )
365 pObjTargetPo = Aig_ManCo( pAig, i );
366 Aig_ObjChild0Flip( pObjTargetPo );
371 pPars->fNotVerbose = 1;
372 pPars->fSolveAll = 1;
373 pAig->vSeqModelVec = NULL;
380 if( pAig->vSeqModelVec )
382 pCex = (
Abc_Cex_t *)Vec_PtrEntry( pAig->vSeqModelVec, targetCSPropertyIndex );
398 for( i=0; i<Saig_ManPoNum(pAig); i++ )
400 pObjTargetPo = Aig_ManCo( pAig, i );
401 Aig_ObjChild0Flip( pObjTargetPo );
446 monotoneVector = Vec_PtrAlloc(0);
452 Vec_PtrPush(monotoneVector, newIntVector);
456 if( Vec_PtrSize(monotoneVector) > 0 )
457 return monotoneVector;
468 if(vMasterBarrierDisjunctsArg)
474 Vec_PtrFree(vMasterBarrierDisjunctsArg);
484 if(vMasterBarrierDisjunctsArg)
493 printf(
"%d - ", iElem);
498 Vec_PtrFree(vMasterBarrierDisjunctsArg);
504 Vec_Ptr_t *masterVector = Vec_PtrAlloc(0);
506 char stringBuffer[100];
509 while(fgets(stringBuffer, 50, fp))
511 if(
strstr(stringBuffer,
":"))
530 int absorberLimit = 500;
532 int liveIndex_0 = -1, liveIndex_k = -1;
536 int safetyInvariantPO = -1;
539 Vec_Ptr_t *vMasterBarrierDisjuncts = NULL;
555 assert( directive == -1 );
589 if( !Abc_NtkIsStrash( pNtk ) )
591 printf(
"The input network was not strashed, strashing....\n");
604 assert( safetyInvariantPO != -1 );
609 beginTime = Abc_Clock();
611 endTime = Abc_Clock();
612 time_spent = (double)(endTime - beginTime)/CLOCKS_PER_SEC;
613 printf(
"pre-processing time = %f\n",time_spent);
620 assert( safetyInvariantPO != -1 );
622 beginTime = Abc_Clock();
624 endTime = Abc_Clock();
625 time_spent = (double)(endTime - beginTime)/CLOCKS_PER_SEC;
626 printf(
"pre-processing time = %f\n",time_spent);
628 assert( vMasterBarrierDisjuncts != NULL );
629 assert( Vec_PtrSize(vMasterBarrierDisjuncts) > 0 );
635 assert( safetyInvariantPO != -1 );
637 beginTime = Abc_Clock();
639 endTime = Abc_Clock();
640 time_spent = (double)(endTime - beginTime)/CLOCKS_PER_SEC;
641 printf(
"pre-processing time = %f\n",time_spent);
643 assert( vMasterBarrierDisjuncts != NULL );
644 assert( Vec_PtrSize(vMasterBarrierDisjuncts) > 0 );
649 assert( vMasterBarrierDisjuncts != NULL );
661 for( absorberCount=1; absorberCount<absorberLimit; absorberCount++ )
664 RetValue =
flipConePdr( pAigCS, directive, liveIndex_k, safetyInvariantPO, absorberCount );
668 Abc_Print( 1,
"k = %d, Property proved\n", absorberCount );
671 else if ( RetValue == 0 )
675 Abc_Print( 1,
"k = %d, Property DISPROVED\n", absorberCount );
678 else if ( RetValue == -1 )
680 Abc_Print( 1,
"Property UNDECIDED with k = %d.\n", absorberCount );
707 fprintf( stdout,
"usage: kcs [-cmgCh]\n" );
708 fprintf( stdout,
"\timplements Claessen-Sorensson's k-Liveness algorithm\n" );
709 fprintf( stdout,
"\t-c : verification with constraints, looks for POs prefixed with csSafetyInvar_\n");
710 fprintf( stdout,
"\t-m : discovers monotone signals\n");
711 fprintf( stdout,
"\t-g : verification with user-supplied barriers, looks for POs prefixed with csLevel1Stabil_\n");
712 fprintf( stdout,
"\t-C : verification with discovered monotone signals\n");
713 fprintf( stdout,
"\t-h : print usage\n");
720 Abc_Ntk_t * pNtk, * pNtkTemp, *pNtkCombStabil;
724 int parameterizedCombK;
734 assert( directive == -1 );
768 if( !Abc_NtkIsStrash( pNtk ) )
770 printf(
"The input network was not strashed, strashing....\n");
783 printf(
"Enter parameterizedCombK = " );
784 if( scanf(
"%d", ¶meterizedCombK) != 1 )
786 printf(
"\nFailed to read integer!\n");
794 pNtkCombStabil->
pName = Abc_UtilStrsav( pAigCombStabil->pName );
796 fprintf( stdout,
"Abc_NtkCreateCone(): Network check has failed.\n" );
808 fprintf( stdout,
"usage: nck [-cmgCh]\n" );
809 fprintf( stdout,
"\tgenerates combinatorial signals for stabilization\n" );
810 fprintf( stdout,
"\t-h : print usage\n");
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_NtkForEachPo(pNtk, pPo, i)
#define Abc_NtkForEachLatch(pNtk, pObj, i)
ABC_DLL int Abc_NtkCheck(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
ABC_DLL char * Abc_ObjName(Abc_Obj_t *pNode)
DECLARATIONS ///.
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL char * Abc_ObjAssignName(Abc_Obj_t *pObj, char *pName, char *pSuffix)
ABC_DLL Abc_Ntk_t * Abc_NtkStrash(Abc_Ntk_t *pNtk, int fAllNodes, int fCleanup, int fRecord)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_HEADER_START struct Abc_Frame_t_ Abc_Frame_t
INCLUDES ///.
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
Aig_Man_t * Aig_ManDupSimple(Aig_Man_t *p)
DECLARATIONS ///.
void Aig_ManStop(Aig_Man_t *p)
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
void Aig_ManPrintStats(Aig_Man_t *p)
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
void Aig_ObjPatchFanin0(Aig_Man_t *p, Aig_Obj_t *pObj, Aig_Obj_t *pFaninNew)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
Aig_Obj_t * Aig_Or(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
ABC_DLL int Aig_ManCheck(Aig_Man_t *p)
FUNCTION DECLARATIONS ///.
ABC_DLL Abc_Ntk_t * Abc_FrameReadNtk(Abc_Frame_t *p)
ABC_DLL void Abc_FrameSetCurrentNetwork(Abc_Frame_t *p, Abc_Ntk_t *pNet)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void modifyAigToApplySafetyInvar(Aig_Man_t *pAig, int csTarget, int safetyInvarPO)
void deallocateMasterBarrierDisjunctVecPtrVecInt(Vec_Ptr_t *vMasterBarrierDisjunctsArg)
Aig_Man_t * generateWorkingAig(Aig_Man_t *pAig, Abc_Ntk_t *pNtk, int *pIndex0Live)
Vec_Ptr_t * getVecOfVecFairness(FILE *fp)
Aig_Man_t * generateDisjunctiveTester(Abc_Ntk_t *pNtk, Aig_Man_t *pAig, int combN, int combK)
Aig_Obj_t * readLiveSignal_0(Aig_Man_t *pAig, int liveIndex_0)
int collectSafetyInvariantPOIndex(Abc_Ntk_t *pNtk)
ABC_NAMESPACE_IMPL_START Aig_Man_t * Abc_NtkToDar(Abc_Ntk_t *pNtk, int fExors, int fRegisters)
DECLARATIONS ///.
Aig_Man_t * generateGeneralDisjunctiveTester(Abc_Ntk_t *pNtk, Aig_Man_t *pAig, int combK)
Vec_Int_t * createSingletonIntVector(int i)
int Abc_CommandNChooseK(Abc_Frame_t *pAbc, int argc, char **argv)
int flipConePdr(Aig_Man_t *pAig, int directive, int targetCSPropertyIndex, int safetyInvariantPOIndex, int absorberCount)
Aig_Obj_t * readLiveSignal_k(Aig_Man_t *pAig, int liveIndex_k)
#define kCS_WITH_SAFETY_AND_USER_GIVEN_DCS_INVARIANTS
Vec_Ptr_t * findDisjunctiveMonotoneSignals(Abc_Ntk_t *pNtk)
Vec_Ptr_t * collectUserGivenDisjunctiveMonotoneSignals(Abc_Ntk_t *pNtk)
int Abc_CommandCS_kLiveness(Abc_Frame_t *pAbc, int argc, char **argv)
#define kCS_WITH_SAFETY_AND_DCS_INVARIANTS
Aig_Man_t * introduceAbsorberLogic(Aig_Man_t *pAig, int *pLiveIndex_0, int *pLiveIndex_k, int nonFirstIteration)
Abc_Ntk_t * Abc_NtkFromAigPhase(Aig_Man_t *pMan)
DECLARATIONS ///.
Abc_Ntk_t * Abc_NtkMakeOnePo(Abc_Ntk_t *pNtk, int Output, int nRange)
#define kCS_WITH_DISCOVER_MONOTONE_SIGNALS
Aig_Man_t * generateWorkingAigWithDSC(Aig_Man_t *pAig, Abc_Ntk_t *pNtk, int *pIndex0Live, Vec_Ptr_t *vMasterBarriers)
#define kCS_WITH_SAFETY_INVARIANTS
void Aig_ManDumpBlif(Aig_Man_t *p, char *pFileName, Vec_Ptr_t *vPiNames, Vec_Ptr_t *vPoNames)
void deallocateMasterBarrierDisjunctInt(Vec_Ptr_t *vMasterBarrierDisjunctsArg)
char * Nm_ManFindNameById(Nm_Man_t *p, int ObjId)
Nm_Man_t * Nm_ManCreate(int nSize)
MACRO DEFINITIONS ///.
char * Nm_ManStoreIdName(Nm_Man_t *p, int ObjId, int Type, char *pName, char *pSuffix)
void Pdr_ManSetDefaultParams(Pdr_Par_t *pPars)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Pdr_Par_t_ Pdr_Par_t
INCLUDES ///.
int Pdr_ManSolve(Aig_Man_t *p, Pdr_Par_t *pPars)
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachPo(p, pObj, i)
#define Saig_ManForEachLo(p, pObj, i)
#define Saig_ManForEachPi(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.