76 int iElem, i, nRegCount;
77 int piCopied = 0, liCopied = 0, liCreated = 0, loCopied = 0, loCreated = 0;
78 int poCopied = 0, poCreated = 0;
79 Aig_Obj_t *pObj, *pObjPo, *pObjDriver, *pObjDriverNew, *pObjPendingDriverNew, *pObjPendingAndNextPending;
80 Aig_Obj_t *pPendingFlop, *pObjConseCandFlop, *pObjSafetyInvariantPoDriver;
85 Aig_Obj_t *pObjAnteDisjunction, *pObjConsecDriver, *pObjConsecDriverNew, *pObjCandMonotone, *pObjPrevCandMonotone, *pObjMonotonePropDriver;
94 if( vConsequentCandidatesLocal == NULL )
105 sprintf(pNewAig->pName,
"%s_%s", pAig->pName,
"monotone");
106 pNewAig->pSpec = NULL;
111 pObj = Aig_ManConst1( pAig );
112 pObj->
pData = Aig_ManConst1( pNewAig );
141 vConseCandFlopOutput = Vec_PtrAlloc(Vec_IntSize(vConsequentCandidatesLocal));
146 Vec_PtrPush( vConseCandFlopOutput, pObjConseCandFlop );
149 nRegCount = loCreated + loCopied;
156 pObj->
pData =
Aig_And( pNewAig, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
166 pObjDriver = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo));
167 pObjDriverNew = !Aig_IsComplement(pObjDriver)?
168 (
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData) :
169 Aig_Not((
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData));
170 pObjSafetyInvariantPoDriver = pObjDriverNew;
173 pObjSafetyInvariantPoDriver = Aig_ManConst1(pNewAig);
175 pObjPo = Aig_ManCo( pAig, pendingSignalIndexLocal );
176 pObjDriver = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo));
177 pObjPendingDriverNew = !Aig_IsComplement(pObjDriver)?
178 (
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData) :
179 Aig_Not((
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData));
181 pObjPendingAndNextPending =
Aig_And( pNewAig, pObjPendingDriverNew, pPendingFlop );
183 pObjAnteDisjunction = Aig_Not(Aig_ManConst1( pNewAig ));
184 if( vAntecedentsLocal )
188 pObjPo = Aig_ManCo( pAig, iElem );
189 pObjDriver = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo));
190 pObjDriverNew = !Aig_IsComplement(pObjDriver)?
191 (
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData) :
192 Aig_Not((
Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData));
194 pObjAnteDisjunction =
Aig_Or( pNewAig, pObjDriverNew, pObjAnteDisjunction );
198 vCandMonotoneProp = Vec_PtrAlloc( Vec_IntSize(vConsequentCandidatesLocal) );
199 vCandMonotoneFlopInput = Vec_PtrAlloc( Vec_IntSize(vConsequentCandidatesLocal) );
202 pObjPo = Aig_ManCo( pAig, iElem );
203 pObjConsecDriver = Aig_NotCond((
Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo));
204 pObjConsecDriverNew = !Aig_IsComplement(pObjConsecDriver)?
205 (
Aig_Obj_t *)(Aig_Regular(pObjConsecDriver)->pData) :
206 Aig_Not((
Aig_Obj_t *)(Aig_Regular(pObjConsecDriver)->pData));
208 pObjCandMonotone =
Aig_Or( pNewAig, pObjConsecDriverNew, pObjAnteDisjunction );
209 pObjPrevCandMonotone = (
Aig_Obj_t *)(Vec_PtrEntry( vConseCandFlopOutput, i ));
210 pObjMonotonePropDriver =
Aig_Or( pNewAig, Aig_Not(
Aig_And( pNewAig, pObjPendingAndNextPending, pObjPrevCandMonotone ) ),
214 pObjMonotonePropDriver =
Aig_And( pNewAig, pObjMonotonePropDriver, pObjSafetyInvariantPoDriver );
216 Vec_PtrPush( vCandMonotoneFlopInput, pObjCandMonotone );
217 Vec_PtrPush( vCandMonotoneProp, pObjMonotonePropDriver );
229 *startMonotonePropPo = i;
267 assert( loCopied + loCreated == liCopied + liCreated );
269 Vec_PtrFree(vConseCandFlopOutput);
270 Vec_PtrFree(vCandMonotoneProp);
271 Vec_PtrFree(vCandMonotoneFlopInput);
296 vMonotoneIndex = Vec_IntAlloc(0);
298 for( i=0; i<Saig_ManPoNum(pAigNew); i++ )
300 pObjTargetPo = Aig_ManCo( pAigNew, i );
301 Aig_ObjChild0Flip( pObjTargetPo );
306 pPars->fNotVerbose = 1;
307 pPars->fSolveAll = 1;
308 pAigNew->vSeqModelVec = NULL;
311 if( pAigNew->vSeqModelVec )
315 if( cexElem == NULL && i >= pendingSignalIndexLocal + 1)
317 poSerialNum = i - (pendingSignalIndexLocal + 1);
322 for( i=0; i<Saig_ManPoNum(pAigNew); i++ )
324 pObjTargetPo = Aig_ManCo( pAigNew, i );
325 Aig_ObjChild0Flip( pObjTargetPo );
333 if( Vec_IntSize( vMonotoneIndex ) > 0 )
335 return vMonotoneIndex;
339 Vec_IntFree(vMonotoneIndex);
457 Vec_Int_t *vElem, *vNewDisjunctVector, *newDisjunction;
460 Vec_Int_t *vUnionPrevMonotoneVector, *vDiffVector;
462 newLevelPtrVec = Vec_PtrAlloc(0);
463 vUnionPrevMonotoneVector = Vec_IntAlloc(0);
480 if( vNewDisjunctVector )
484 newDisjunction = Vec_IntDup(vElem);
485 Vec_IntPush( newDisjunction, iElem );
486 Vec_PtrPush( newLevelPtrVec, newDisjunction );
488 Vec_IntFree(vNewDisjunctVector);
493 Vec_IntFree(vUnionPrevMonotoneVector);
495 return newLevelPtrVec;
606 int pendingSignalIndex;
608 int hintSingalBeginningMarker;
609 int hintSingalEndMarker;
615 Vec_Ptr_t *levelOneMonotne, *levelTwoMonotne;
630 if( pendingSignalIndex == -1 )
632 printf(
"\nNo Pending Signal Found\n");
642 if( vCandidateMonotoneSignals == NULL )
648 hintSingalBeginningMarker = Vec_IntEntry( vCandidateMonotoneSignals, 0 );
649 hintSingalEndMarker = Vec_IntEntry( vCandidateMonotoneSignals, Vec_IntSize(vCandidateMonotoneSignals) - 1 );
671 if( !Abc_NtkIsStrash( pNtk ) )
687 levelOneMonotne = Vec_PtrAlloc(0);
691 Vec_PtrPush( levelOneMonotne, newIntVec );
696 vMasterDisjunctions = Vec_PtrAlloc( Vec_PtrSize( levelOneMonotne ));
703 if( vKnownMonotoneSignals )
707 printf(
"\n**************************************************************\n");
708 printf(
"Exploring Second Layer : Reference Po[%d] = %s", iElem,
Abc_ObjName( Abc_NtkPo(pNtk, iElem) ));
709 printf(
"\n**************************************************************\n");
720 printf(
"Monotone Po[%d] = %s, (%d, %d)\n", iElemTwo,
Abc_ObjName( Abc_NtkPo(pNtk, iElemTwo) ), iElem, iElemTwo );
722 Vec_IntFree(vKnownMonotoneSignalsRoundTwo);
752 Vec_IntFree(vKnownMonotoneSignals);
754 return vMasterDisjunctions;