| /**CFile**************************************************************** |
| |
| FileName [disjunctiveMonotone.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Liveness property checking.] |
| |
| Synopsis [Constraint analysis module for the k-Liveness algorithm |
| invented by Koen Classen, Niklas Sorensson.] |
| |
| Author [Sayak Ray] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - October 31, 2012.] |
| |
| ***********************************************************************/ |
| |
| #include <stdio.h> |
| #include "base/main/main.h" |
| #include "aig/aig/aig.h" |
| #include "aig/saig/saig.h" |
| #include <string.h> |
| #include "base/main/mainInt.h" |
| #include "proof/pdr/pdr.h" |
| #include <time.h> |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| struct aigPoIndices |
| { |
| int attrPendingSignalIndex; |
| int attrHintSingalBeginningMarker; |
| int attrHintSingalEndMarker; |
| int attrSafetyInvarIndex; |
| }; |
| |
| extern struct aigPoIndices *allocAigPoIndices(); |
| extern void deallocAigPoIndices(struct aigPoIndices *toBeDeletedAigPoIndices); |
| extern int collectSafetyInvariantPOIndex(Abc_Ntk_t *pNtk); |
| |
| struct antecedentConsequentVectorsStruct |
| { |
| Vec_Int_t *attrAntecedents; |
| Vec_Int_t *attrConsequentCandidates; |
| }; |
| |
| struct antecedentConsequentVectorsStruct *allocAntecedentConsequentVectorsStruct() |
| { |
| struct antecedentConsequentVectorsStruct *newStructure; |
| |
| newStructure = (struct antecedentConsequentVectorsStruct *)malloc(sizeof (struct antecedentConsequentVectorsStruct)); |
| |
| newStructure->attrAntecedents = NULL; |
| newStructure->attrConsequentCandidates = NULL; |
| |
| assert( newStructure != NULL ); |
| return newStructure; |
| } |
| |
| void deallocAntecedentConsequentVectorsStruct(struct antecedentConsequentVectorsStruct *toBeDeleted) |
| { |
| assert( toBeDeleted != NULL ); |
| if(toBeDeleted->attrAntecedents) |
| Vec_IntFree( toBeDeleted->attrAntecedents ); |
| if(toBeDeleted->attrConsequentCandidates) |
| Vec_IntFree( toBeDeleted->attrConsequentCandidates ); |
| free( toBeDeleted ); |
| } |
| |
| Aig_Man_t *createDisjunctiveMonotoneTester(Aig_Man_t *pAig, struct aigPoIndices *aigPoIndicesArg, |
| struct antecedentConsequentVectorsStruct *anteConseVectors, int *startMonotonePropPo) |
| { |
| Aig_Man_t *pNewAig; |
| int iElem, i, nRegCount; |
| int piCopied = 0, liCopied = 0, liCreated = 0, loCopied = 0, loCreated = 0; |
| int poCopied = 0, poCreated = 0; |
| Aig_Obj_t *pObj, *pObjPo, *pObjDriver, *pObjDriverNew, *pObjPendingDriverNew, *pObjPendingAndNextPending; |
| Aig_Obj_t *pPendingFlop, *pObjConseCandFlop, *pObjSafetyInvariantPoDriver; |
| //Vec_Ptr_t *vHintMonotoneLocalDriverNew; |
| Vec_Ptr_t *vConseCandFlopOutput; |
| //Vec_Ptr_t *vHintMonotoneLocalProp; |
| |
| Aig_Obj_t *pObjAnteDisjunction, *pObjConsecDriver, *pObjConsecDriverNew, *pObjCandMonotone, *pObjPrevCandMonotone, *pObjMonotonePropDriver; |
| Vec_Ptr_t *vCandMonotoneProp; |
| Vec_Ptr_t *vCandMonotoneFlopInput; |
| |
| int pendingSignalIndexLocal = aigPoIndicesArg->attrPendingSignalIndex; |
| |
| Vec_Int_t *vAntecedentsLocal = anteConseVectors->attrAntecedents; |
| Vec_Int_t *vConsequentCandidatesLocal = anteConseVectors->attrConsequentCandidates; |
| |
| if( vConsequentCandidatesLocal == NULL ) |
| return NULL; //no candidates for consequent is provided, hence no need to generate a new AIG |
| |
| |
| //**************************************************************** |
| // Step1: create the new manager |
| // Note: The new manager is created with "2 * Aig_ManObjNumMax(p)" |
| // nodes, but this selection is arbitrary - need to be justified |
| //**************************************************************** |
| pNewAig = Aig_ManStart( Aig_ManObjNumMax(pAig) ); |
| pNewAig->pName = (char *)malloc( strlen( pAig->pName ) + strlen("_monotone") + 2 ); |
| sprintf(pNewAig->pName, "%s_%s", pAig->pName, "monotone"); |
| pNewAig->pSpec = NULL; |
| |
| //**************************************************************** |
| // Step 2: map constant nodes |
| //**************************************************************** |
| pObj = Aig_ManConst1( pAig ); |
| pObj->pData = Aig_ManConst1( pNewAig ); |
| |
| //**************************************************************** |
| // Step 3: create true PIs |
| //**************************************************************** |
| Saig_ManForEachPi( pAig, pObj, i ) |
| { |
| piCopied++; |
| pObj->pData = Aig_ObjCreateCi(pNewAig); |
| } |
| |
| //**************************************************************** |
| // Step 5: create register outputs |
| //**************************************************************** |
| Saig_ManForEachLo( pAig, pObj, i ) |
| { |
| loCopied++; |
| pObj->pData = Aig_ObjCreateCi(pNewAig); |
| } |
| |
| //**************************************************************** |
| // Step 6: create "D" register output for PENDING flop |
| //**************************************************************** |
| loCreated++; |
| pPendingFlop = Aig_ObjCreateCi( pNewAig ); |
| |
| //**************************************************************** |
| // Step 6.a: create "D" register output for HINT_MONOTONE flop |
| //**************************************************************** |
| vConseCandFlopOutput = Vec_PtrAlloc(Vec_IntSize(vConsequentCandidatesLocal)); |
| Vec_IntForEachEntry( vConsequentCandidatesLocal, iElem, i ) |
| { |
| loCreated++; |
| pObjConseCandFlop = Aig_ObjCreateCi( pNewAig ); |
| Vec_PtrPush( vConseCandFlopOutput, pObjConseCandFlop ); |
| } |
| |
| nRegCount = loCreated + loCopied; |
| |
| //******************************************************************** |
| // Step 7: create internal nodes |
| //******************************************************************** |
| Aig_ManForEachNode( pAig, pObj, i ) |
| { |
| pObj->pData = Aig_And( pNewAig, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ); |
| } |
| |
| //******************************************************************** |
| // Step 8: mapping appropriate new flop drivers |
| //******************************************************************** |
| |
| if( aigPoIndicesArg->attrSafetyInvarIndex != -1 ) |
| { |
| pObjPo = Aig_ManCo( pAig, aigPoIndicesArg->attrSafetyInvarIndex ); |
| pObjDriver = Aig_NotCond((Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo)); |
| pObjDriverNew = !Aig_IsComplement(pObjDriver)? |
| (Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData) : |
| Aig_Not((Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData)); |
| pObjSafetyInvariantPoDriver = pObjDriverNew; |
| } |
| else |
| pObjSafetyInvariantPoDriver = Aig_ManConst1(pNewAig); |
| |
| pObjPo = Aig_ManCo( pAig, pendingSignalIndexLocal ); |
| pObjDriver = Aig_NotCond((Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo)); |
| pObjPendingDriverNew = !Aig_IsComplement(pObjDriver)? |
| (Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData) : |
| Aig_Not((Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData)); |
| |
| pObjPendingAndNextPending = Aig_And( pNewAig, pObjPendingDriverNew, pPendingFlop ); |
| |
| pObjAnteDisjunction = Aig_Not(Aig_ManConst1( pNewAig )); |
| if( vAntecedentsLocal ) |
| { |
| Vec_IntForEachEntry( vAntecedentsLocal, iElem, i ) |
| { |
| pObjPo = Aig_ManCo( pAig, iElem ); |
| pObjDriver = Aig_NotCond((Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo)); |
| pObjDriverNew = !Aig_IsComplement(pObjDriver)? |
| (Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData) : |
| Aig_Not((Aig_Obj_t *)(Aig_Regular(pObjDriver)->pData)); |
| |
| pObjAnteDisjunction = Aig_Or( pNewAig, pObjDriverNew, pObjAnteDisjunction ); |
| } |
| } |
| |
| vCandMonotoneProp = Vec_PtrAlloc( Vec_IntSize(vConsequentCandidatesLocal) ); |
| vCandMonotoneFlopInput = Vec_PtrAlloc( Vec_IntSize(vConsequentCandidatesLocal) ); |
| Vec_IntForEachEntry( vConsequentCandidatesLocal, iElem, i ) |
| { |
| pObjPo = Aig_ManCo( pAig, iElem ); |
| pObjConsecDriver = Aig_NotCond((Aig_Obj_t *)Aig_ObjFanin0(pObjPo), Aig_ObjFaninC0(pObjPo)); |
| pObjConsecDriverNew = !Aig_IsComplement(pObjConsecDriver)? |
| (Aig_Obj_t *)(Aig_Regular(pObjConsecDriver)->pData) : |
| Aig_Not((Aig_Obj_t *)(Aig_Regular(pObjConsecDriver)->pData)); |
| |
| pObjCandMonotone = Aig_Or( pNewAig, pObjConsecDriverNew, pObjAnteDisjunction ); |
| pObjPrevCandMonotone = (Aig_Obj_t *)(Vec_PtrEntry( vConseCandFlopOutput, i )); |
| pObjMonotonePropDriver = Aig_Or( pNewAig, Aig_Not( Aig_And( pNewAig, pObjPendingAndNextPending, pObjPrevCandMonotone ) ), |
| pObjCandMonotone ); |
| |
| //Conjunting safety invar |
| pObjMonotonePropDriver = Aig_And( pNewAig, pObjMonotonePropDriver, pObjSafetyInvariantPoDriver ); |
| |
| Vec_PtrPush( vCandMonotoneFlopInput, pObjCandMonotone ); |
| Vec_PtrPush( vCandMonotoneProp, pObjMonotonePropDriver ); |
| } |
| |
| //******************************************************************** |
| // Step 9: create primary outputs |
| //******************************************************************** |
| Saig_ManForEachPo( pAig, pObj, i ) |
| { |
| poCopied++; |
| pObj->pData = Aig_ObjCreateCo( pNewAig, Aig_ObjChild0Copy(pObj) ); |
| } |
| |
| *startMonotonePropPo = i; |
| Vec_PtrForEachEntry( Aig_Obj_t *, vCandMonotoneProp, pObj, i ) |
| { |
| poCreated++; |
| pObjPo = Aig_ObjCreateCo( pNewAig, pObj ); |
| } |
| |
| //******************************************************************** |
| // Step 9: create latch inputs |
| //******************************************************************** |
| |
| Saig_ManForEachLi( pAig, pObj, i ) |
| { |
| liCopied++; |
| Aig_ObjCreateCo( pNewAig, Aig_ObjChild0Copy(pObj) ); |
| } |
| |
| //******************************************************************** |
| // Step 9.a: create latch input for PENDING_FLOP |
| //******************************************************************** |
| |
| liCreated++; |
| Aig_ObjCreateCo( pNewAig, pObjPendingDriverNew ); |
| |
| //******************************************************************** |
| // Step 9.b: create latch input for MONOTONE_FLOP |
| //******************************************************************** |
| |
| Vec_PtrForEachEntry( Aig_Obj_t *, vCandMonotoneFlopInput, pObj, i ) |
| { |
| liCreated++; |
| Aig_ObjCreateCo( pNewAig, pObj ); |
| } |
| |
| Aig_ManSetRegNum( pNewAig, nRegCount ); |
| Aig_ManCleanup( pNewAig ); |
| |
| assert( Aig_ManCheck( pNewAig ) ); |
| assert( loCopied + loCreated == liCopied + liCreated ); |
| |
| Vec_PtrFree(vConseCandFlopOutput); |
| Vec_PtrFree(vCandMonotoneProp); |
| Vec_PtrFree(vCandMonotoneFlopInput); |
| return pNewAig; |
| } |
| |
| Vec_Int_t *findNewDisjunctiveMonotone( Aig_Man_t *pAig, struct aigPoIndices *aigPoIndicesArg, struct antecedentConsequentVectorsStruct *anteConseVectors ) |
| { |
| Aig_Man_t *pAigNew; |
| Aig_Obj_t *pObjTargetPo; |
| int poMarker; |
| //int i, RetValue, poSerialNum; |
| int i, poSerialNum; |
| Pdr_Par_t Pars, * pPars = &Pars; |
| //Abc_Cex_t * pCex = NULL; |
| Vec_Int_t *vMonotoneIndex; |
| //char fileName[20]; |
| Abc_Cex_t * cexElem; |
| |
| int pendingSignalIndexLocal = aigPoIndicesArg->attrPendingSignalIndex; |
| |
| pAigNew = createDisjunctiveMonotoneTester(pAig, aigPoIndicesArg, anteConseVectors, &poMarker ); |
| |
| //printf("enter an integer : "); |
| //waitForInteger = getchar(); |
| //putchar(waitForInteger); |
| |
| vMonotoneIndex = Vec_IntAlloc(0); |
| |
| for( i=0; i<Saig_ManPoNum(pAigNew); i++ ) |
| { |
| pObjTargetPo = Aig_ManCo( pAigNew, i ); |
| Aig_ObjChild0Flip( pObjTargetPo ); |
| } |
| |
| Pdr_ManSetDefaultParams( pPars ); |
| pPars->fVerbose = 0; |
| pPars->fNotVerbose = 1; |
| pPars->fSolveAll = 1; |
| pAigNew->vSeqModelVec = NULL; |
| Pdr_ManSolve( pAigNew, pPars ); |
| |
| if( pAigNew->vSeqModelVec ) |
| { |
| Vec_PtrForEachEntry( Abc_Cex_t *, pAigNew->vSeqModelVec, cexElem, i ) |
| { |
| if( cexElem == NULL && i >= pendingSignalIndexLocal + 1) |
| { |
| poSerialNum = i - (pendingSignalIndexLocal + 1); |
| Vec_IntPush( vMonotoneIndex, Vec_IntEntry( anteConseVectors->attrConsequentCandidates, poSerialNum )); |
| } |
| } |
| } |
| for( i=0; i<Saig_ManPoNum(pAigNew); i++ ) |
| { |
| pObjTargetPo = Aig_ManCo( pAigNew, i ); |
| Aig_ObjChild0Flip( pObjTargetPo ); |
| } |
| |
| //if(pAigNew->vSeqModelVec) |
| // Vec_PtrFree(pAigNew->vSeqModelVec); |
| |
| Aig_ManStop(pAigNew); |
| |
| if( Vec_IntSize( vMonotoneIndex ) > 0 ) |
| { |
| return vMonotoneIndex; |
| } |
| else |
| { |
| Vec_IntFree(vMonotoneIndex); |
| return NULL; |
| } |
| } |
| |
| Vec_Int_t *updateAnteConseVectors(struct antecedentConsequentVectorsStruct *anteConse ) |
| { |
| Vec_Int_t *vCandMonotone; |
| int iElem, i; |
| |
| //if( vKnownMonotone == NULL || Vec_IntSize(vKnownMonotone) <= 0 ) |
| // return vHintMonotone; |
| if( anteConse->attrAntecedents == NULL || Vec_IntSize(anteConse->attrAntecedents) <= 0 ) |
| return anteConse->attrConsequentCandidates; |
| vCandMonotone = Vec_IntAlloc(0); |
| Vec_IntForEachEntry( anteConse->attrConsequentCandidates, iElem, i ) |
| { |
| if( Vec_IntFind( anteConse->attrAntecedents, iElem ) == -1 ) |
| Vec_IntPush( vCandMonotone, iElem ); |
| } |
| |
| return vCandMonotone; |
| } |
| |
| Vec_Int_t *vectorDifference(Vec_Int_t *A, Vec_Int_t *B) |
| { |
| Vec_Int_t *C; |
| int iElem, i; |
| |
| C = Vec_IntAlloc(0); |
| Vec_IntForEachEntry( A, iElem, i ) |
| { |
| if( Vec_IntFind( B, iElem ) == -1 ) |
| { |
| Vec_IntPush( C, iElem ); |
| } |
| } |
| |
| return C; |
| } |
| |
| Vec_Int_t *createSingletonIntVector( int iElem ) |
| { |
| Vec_Int_t *myVec = Vec_IntAlloc(1); |
| |
| Vec_IntPush(myVec, iElem); |
| return myVec; |
| } |
| |
| #if 0 |
| Vec_Ptr_t *generateDisjuntiveMonotone_rec() |
| { |
| nextLevelSignals = ; |
| if level is not exhausted |
| for all x \in nextLevelSignals |
| { |
| append x in currAntecendent |
| recond it as a monotone predicate |
| resurse with level - 1 |
| } |
| } |
| #endif |
| |
| #if 0 |
| Vec_Ptr_t *generateDisjuntiveMonotoneLevels(Aig_Man_t *pAig, |
| struct aigPoIndices *aigPoIndicesInstance, |
| struct antecedentConsequentVectorsStruct *anteConsecInstanceOrig, |
| int level ) |
| { |
| Vec_Int_t *firstLevelMonotone; |
| Vec_Int_t *currVecInt; |
| Vec_Ptr_t *hierarchyList; |
| int iElem, i; |
| |
| assert( level >= 1 ); |
| firstLevelMonotone = findNewDisjunctiveMonotone( pAig, aigPoIndicesInstance, anteConsecInstance ); |
| if( firstLevelMonotone == NULL || Vec_IntSize(firstLevelMonotone) <= 0 ) |
| return NULL; |
| |
| hierarchyList = Vec_PtrAlloc(Vec_IntSize(firstLevelMonotone)); |
| |
| Vec_IntForEachEntry( firstLevelMonotone, iElem, i ) |
| { |
| currVecInt = createSingletonIntVector( iElem ); |
| Vec_PtrPush( hierarchyList, currVecInt ); |
| } |
| |
| if( level > 1 ) |
| { |
| Vec_IntForEachEntry( firstLevelMonotone, iElem, i ) |
| { |
| currVecInt = (Vec_Int_t *)Vec_PtrEntry( hierarchyList, i ); |
| |
| |
| } |
| } |
| |
| return hierarchyList; |
| } |
| #endif |
| |
| int Vec_IntPushUniqueLocal( Vec_Int_t * p, int Entry ) |
| { |
| int i; |
| for ( i = 0; i < p->nSize; i++ ) |
| if ( p->pArray[i] == Entry ) |
| return 1; |
| Vec_IntPush( p, Entry ); |
| return 0; |
| } |
| |
| Vec_Ptr_t *findNextLevelDisjunctiveMonotone( |
| Aig_Man_t *pAig, |
| struct aigPoIndices *aigPoIndicesInstance, |
| struct antecedentConsequentVectorsStruct *anteConsecInstance, |
| Vec_Ptr_t *previousMonotoneVectors ) |
| { |
| Vec_Ptr_t *newLevelPtrVec; |
| Vec_Int_t *vElem, *vNewDisjunctVector, *newDisjunction; |
| int i, j, iElem; |
| struct antecedentConsequentVectorsStruct *anteConsecInstanceLocal; |
| Vec_Int_t *vUnionPrevMonotoneVector, *vDiffVector; |
| |
| newLevelPtrVec = Vec_PtrAlloc(0); |
| vUnionPrevMonotoneVector = Vec_IntAlloc(0); |
| Vec_PtrForEachEntry(Vec_Int_t *, previousMonotoneVectors, vElem, i) |
| Vec_IntForEachEntry( vElem, iElem, j ) |
| Vec_IntPushUniqueLocal( vUnionPrevMonotoneVector, iElem ); |
| |
| Vec_PtrForEachEntry(Vec_Int_t *, previousMonotoneVectors, vElem, i) |
| { |
| anteConsecInstanceLocal = allocAntecedentConsequentVectorsStruct(); |
| |
| anteConsecInstanceLocal->attrAntecedents = Vec_IntDup(vElem); |
| vDiffVector = vectorDifference( anteConsecInstance->attrConsequentCandidates, vUnionPrevMonotoneVector); |
| anteConsecInstanceLocal->attrConsequentCandidates = vDiffVector; |
| assert( vDiffVector ); |
| |
| //printf("Calling target function %d\n", i); |
| vNewDisjunctVector = findNewDisjunctiveMonotone( pAig, aigPoIndicesInstance, anteConsecInstanceLocal ); |
| |
| if( vNewDisjunctVector ) |
| { |
| Vec_IntForEachEntry(vNewDisjunctVector, iElem, j) |
| { |
| newDisjunction = Vec_IntDup(vElem); |
| Vec_IntPush( newDisjunction, iElem ); |
| Vec_PtrPush( newLevelPtrVec, newDisjunction ); |
| } |
| Vec_IntFree(vNewDisjunctVector); |
| } |
| deallocAntecedentConsequentVectorsStruct( anteConsecInstanceLocal ); |
| } |
| |
| Vec_IntFree(vUnionPrevMonotoneVector); |
| |
| return newLevelPtrVec; |
| } |
| |
| void printAllIntVectors(Vec_Ptr_t *vDisjunctions, Abc_Ntk_t *pNtk, char *fileName) |
| { |
| Vec_Int_t *vElem; |
| int i, j, iElem; |
| char *name, *hintSubStr; |
| FILE *fp; |
| |
| fp = fopen( fileName, "a" ); |
| |
| Vec_PtrForEachEntry(Vec_Int_t *, vDisjunctions, vElem, i) |
| { |
| fprintf(fp, "( "); |
| Vec_IntForEachEntry( vElem, iElem, j ) |
| { |
| name = Abc_ObjName( Abc_NtkPo(pNtk, iElem)); |
| hintSubStr = strstr( name, "hint"); |
| assert( hintSubStr ); |
| fprintf(fp, "%s", hintSubStr); |
| if( j < Vec_IntSize(vElem) - 1 ) |
| { |
| fprintf(fp, " || "); |
| } |
| else |
| { |
| fprintf(fp, " )\n"); |
| } |
| } |
| } |
| fclose(fp); |
| } |
| |
| void printAllIntVectorsStabil(Vec_Ptr_t *vDisjunctions, Abc_Ntk_t *pNtk, char *fileName) |
| { |
| Vec_Int_t *vElem; |
| int i, j, iElem; |
| char *name, *hintSubStr; |
| FILE *fp; |
| |
| fp = fopen( fileName, "a" ); |
| |
| Vec_PtrForEachEntry(Vec_Int_t *, vDisjunctions, vElem, i) |
| { |
| printf("INT[%d] : ( ", i); |
| fprintf(fp, "( "); |
| Vec_IntForEachEntry( vElem, iElem, j ) |
| { |
| name = Abc_ObjName( Abc_NtkPo(pNtk, iElem)); |
| hintSubStr = strstr( name, "csLevel1Stabil"); |
| assert( hintSubStr ); |
| printf("%s", hintSubStr); |
| fprintf(fp, "%s", hintSubStr); |
| if( j < Vec_IntSize(vElem) - 1 ) |
| { |
| printf(" || "); |
| fprintf(fp, " || "); |
| } |
| else |
| { |
| printf(" )\n"); |
| fprintf(fp, " )\n"); |
| } |
| } |
| //printf(")\n"); |
| } |
| fclose(fp); |
| } |
| |
| |
| void appendVecToMasterVecInt(Vec_Ptr_t *masterVec, Vec_Ptr_t *candVec ) |
| { |
| int i; |
| Vec_Int_t *vCand; |
| Vec_Int_t *vNewIntVec; |
| |
| assert(masterVec != NULL); |
| assert(candVec != NULL); |
| Vec_PtrForEachEntry( Vec_Int_t *, candVec, vCand, i ) |
| { |
| vNewIntVec = Vec_IntDup(vCand); |
| Vec_PtrPush(masterVec, vNewIntVec); |
| } |
| } |
| |
| void deallocateVecOfIntVec( Vec_Ptr_t *vecOfIntVec ) |
| { |
| Vec_Int_t *vInt; |
| int i; |
| |
| if( vecOfIntVec ) |
| { |
| Vec_PtrForEachEntry( Vec_Int_t *, vecOfIntVec, vInt, i ) |
| { |
| Vec_IntFree( vInt ); |
| } |
| Vec_PtrFree(vecOfIntVec); |
| } |
| } |
| |
| Vec_Ptr_t *findDisjunctiveMonotoneSignals( Abc_Ntk_t *pNtk ) |
| { |
| Aig_Man_t *pAig; |
| Vec_Int_t *vCandidateMonotoneSignals; |
| Vec_Int_t *vKnownMonotoneSignals; |
| //Vec_Int_t *vKnownMonotoneSignalsRoundTwo; |
| //Vec_Int_t *vOldConsequentVector; |
| //Vec_Int_t *vRemainingConsecVector; |
| int i; |
| int iElem; |
| int pendingSignalIndex; |
| Abc_Ntk_t *pNtkTemp; |
| int hintSingalBeginningMarker; |
| int hintSingalEndMarker; |
| struct aigPoIndices *aigPoIndicesInstance; |
| //struct monotoneVectorsStruct *monotoneVectorsInstance; |
| struct antecedentConsequentVectorsStruct *anteConsecInstance; |
| //Aig_Obj_t *safetyDriverNew; |
| Vec_Int_t *newIntVec; |
| Vec_Ptr_t *levelOneMonotne, *levelTwoMonotne; |
| //Vec_Ptr_t *levelThreeMonotne; |
| |
| Vec_Ptr_t *vMasterDisjunctions; |
| |
| extern int findPendingSignal(Abc_Ntk_t *pNtk); |
| extern Vec_Int_t *findHintOutputs(Abc_Ntk_t *pNtk); |
| extern Aig_Man_t * Abc_NtkToDar( Abc_Ntk_t * pNtk, int fExors, int fRegisters ); |
| |
| //system("rm monotone.dat"); |
| |
| /*******************************************/ |
| //Finding the PO index of the pending signal |
| /*******************************************/ |
| pendingSignalIndex = findPendingSignal(pNtk); |
| if( pendingSignalIndex == -1 ) |
| { |
| printf("\nNo Pending Signal Found\n"); |
| return NULL; |
| } |
| //else |
| //printf("Po[%d] = %s\n", pendingSignalIndex, Abc_ObjName( Abc_NtkPo(pNtk, pendingSignalIndex) ) ); |
| |
| /*******************************************/ |
| //Finding the PO indices of all hint signals |
| /*******************************************/ |
| vCandidateMonotoneSignals = findHintOutputs(pNtk); |
| if( vCandidateMonotoneSignals == NULL ) |
| return NULL; |
| else |
| { |
| //Vec_IntForEachEntry( vCandidateMonotoneSignals, iElem, i ) |
| // printf("Po[%d] = %s\n", iElem, Abc_ObjName( Abc_NtkPo(pNtk, iElem) ) ); |
| hintSingalBeginningMarker = Vec_IntEntry( vCandidateMonotoneSignals, 0 ); |
| hintSingalEndMarker = Vec_IntEntry( vCandidateMonotoneSignals, Vec_IntSize(vCandidateMonotoneSignals) - 1 ); |
| } |
| |
| /**********************************************/ |
| //Allocating "struct" with necessary parameters |
| /**********************************************/ |
| aigPoIndicesInstance = allocAigPoIndices(); |
| aigPoIndicesInstance->attrPendingSignalIndex = pendingSignalIndex; |
| aigPoIndicesInstance->attrHintSingalBeginningMarker = hintSingalBeginningMarker; |
| aigPoIndicesInstance->attrHintSingalEndMarker = hintSingalEndMarker; |
| aigPoIndicesInstance->attrSafetyInvarIndex = collectSafetyInvariantPOIndex(pNtk); |
| |
| /****************************************************/ |
| //Allocating "struct" with necessary monotone vectors |
| /****************************************************/ |
| anteConsecInstance = allocAntecedentConsequentVectorsStruct(); |
| anteConsecInstance->attrAntecedents = NULL; |
| anteConsecInstance->attrConsequentCandidates = vCandidateMonotoneSignals; |
| |
| /*******************************************/ |
| //Generate AIG from Ntk |
| /*******************************************/ |
| if( !Abc_NtkIsStrash( pNtk ) ) |
| { |
| pNtkTemp = Abc_NtkStrash( pNtk, 0, 0, 0 ); |
| pAig = Abc_NtkToDar( pNtkTemp, 0, 1 ); |
| } |
| else |
| { |
| pAig = Abc_NtkToDar( pNtk, 0, 1 ); |
| pNtkTemp = pNtk; |
| } |
| |
| /*******************************************/ |
| //finding LEVEL 1 monotone signals |
| /*******************************************/ |
| //printf("Calling target function outside loop\n"); |
| vKnownMonotoneSignals = findNewDisjunctiveMonotone( pAig, aigPoIndicesInstance, anteConsecInstance ); |
| levelOneMonotne = Vec_PtrAlloc(0); |
| Vec_IntForEachEntry( vKnownMonotoneSignals, iElem, i ) |
| { |
| newIntVec = createSingletonIntVector( iElem ); |
| Vec_PtrPush( levelOneMonotne, newIntVec ); |
| //printf("Monotone Po[%d] = %s\n", iElem, Abc_ObjName( Abc_NtkPo(pNtk, iElem) ) ); |
| } |
| //printAllIntVectors( levelOneMonotne, pNtk, "monotone.dat" ); |
| |
| vMasterDisjunctions = Vec_PtrAlloc( Vec_PtrSize( levelOneMonotne )); |
| appendVecToMasterVecInt(vMasterDisjunctions, levelOneMonotne ); |
| |
| /*******************************************/ |
| //finding LEVEL >1 monotone signals |
| /*******************************************/ |
| #if 0 |
| if( vKnownMonotoneSignals ) |
| { |
| Vec_IntForEachEntry( vKnownMonotoneSignals, iElem, i ) |
| { |
| printf("\n**************************************************************\n"); |
| printf("Exploring Second Layer : Reference Po[%d] = %s", iElem, Abc_ObjName( Abc_NtkPo(pNtk, iElem) )); |
| printf("\n**************************************************************\n"); |
| anteConsecInstance->attrAntecedents = createSingletonIntVector( iElem ); |
| vOldConsequentVector = anteConsecInstance->attrConsequentCandidates; |
| vRemainingConsecVector = updateAnteConseVectors(anteConsecInstance); |
| if( anteConsecInstance->attrConsequentCandidates != vRemainingConsecVector ) |
| { |
| anteConsecInstance->attrConsequentCandidates = vRemainingConsecVector; |
| } |
| vKnownMonotoneSignalsRoundTwo = findNewDisjunctiveMonotone( pAig, aigPoIndicesInstance, anteConsecInstance ); |
| Vec_IntForEachEntry( vKnownMonotoneSignalsRoundTwo, iElemTwo, iTwo ) |
| { |
| printf("Monotone Po[%d] = %s, (%d, %d)\n", iElemTwo, Abc_ObjName( Abc_NtkPo(pNtk, iElemTwo) ), iElem, iElemTwo ); |
| } |
| Vec_IntFree(vKnownMonotoneSignalsRoundTwo); |
| Vec_IntFree(anteConsecInstance->attrAntecedents); |
| if(anteConsecInstance->attrConsequentCandidates != vOldConsequentVector) |
| { |
| Vec_IntFree(anteConsecInstance->attrConsequentCandidates); |
| anteConsecInstance->attrConsequentCandidates = vOldConsequentVector; |
| } |
| } |
| } |
| #endif |
| |
| #if 1 |
| levelTwoMonotne = findNextLevelDisjunctiveMonotone( pAig, aigPoIndicesInstance, anteConsecInstance, levelOneMonotne ); |
| //printAllIntVectors( levelTwoMonotne, pNtk, "monotone.dat" ); |
| appendVecToMasterVecInt(vMasterDisjunctions, levelTwoMonotne ); |
| #endif |
| |
| //levelThreeMonotne = findNextLevelDisjunctiveMonotone( pAig, aigPoIndicesInstance, anteConsecInstance, levelTwoMonotne ); |
| //printAllIntVectors( levelThreeMonotne ); |
| //printAllIntVectors( levelTwoMonotne, pNtk, "monotone.dat" ); |
| //appendVecToMasterVecInt(vMasterDisjunctions, levelThreeMonotne ); |
| |
| deallocAigPoIndices(aigPoIndicesInstance); |
| deallocAntecedentConsequentVectorsStruct(anteConsecInstance); |
| //deallocPointersToMonotoneVectors(monotoneVectorsInstance); |
| |
| deallocateVecOfIntVec( levelOneMonotne ); |
| deallocateVecOfIntVec( levelTwoMonotne ); |
| |
| Aig_ManStop(pAig); |
| Vec_IntFree(vKnownMonotoneSignals); |
| |
| return vMasterDisjunctions; |
| } |
| |
| ABC_NAMESPACE_IMPL_END |