53 Status.nInputs = Saig_ManPiNum(
p );
54 Status.nNodes = Aig_ManNodeNum(
p );
55 Status.nOutputs = Saig_ManPoNum(
p);
58 pChild = Aig_ObjChild0(pObj);
60 if ( pChild == Aig_ManConst0(
p) )
63 else if ( pChild == Aig_ManConst1(
p) )
66 if ( Status.iOut == -1 )
70 else if ( Saig_ObjIsPi(
p, Aig_Regular(pChild)) )
73 if ( Status.iOut == -1 )
77 else if ( Aig_Regular(pChild)->fPhase != (
unsigned)Aig_IsComplement(pChild) )
80 if ( Status.iOut == -1 )
105 assert( Saig_ManRegNum(p0) > 0 || Saig_ManRegNum(p1) > 0 );
106 assert( Saig_ManPiNum(p0) == Saig_ManPiNum(p1) );
107 assert( Saig_ManPoNum(p0) == Saig_ManPoNum(p1) );
108 pNew =
Aig_ManStart( Aig_ManObjNumMax(p0) + Aig_ManObjNumMax(p1) );
109 pNew->pName = Abc_UtilStrsav(
"miter" );
113 Aig_ManConst1(p0)->pData = Aig_ManConst1(pNew);
114 Aig_ManConst1(p1)->pData = Aig_ManConst1(pNew);
119 pObj->
pData = Aig_ManCi( pNew, i );
127 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
129 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
134 pObj =
Aig_Exor( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild0Copy(Aig_ManCo(p1,i)) );
135 else if ( Oper == 1 )
136 pObj =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_Not(Aig_ObjChild0Copy(Aig_ManCo(p1,i))) );
168 assert( Aig_ManCiNum(p0) == Aig_ManCiNum(p1) );
169 assert( Aig_ManCoNum(p0) == Aig_ManCoNum(p1) );
170 pNew =
Aig_ManStart( Aig_ManObjNumMax(p0) + Aig_ManObjNumMax(p1) );
171 pNew->pName = Abc_UtilStrsav(
"miter" );
173 Aig_ManConst1(p0)->pData = Aig_ManConst1(pNew);
174 Aig_ManConst1(p1)->pData = Aig_ManConst1(pNew);
179 pObj->
pData = Aig_ManCi( pNew, i );
182 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
184 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
189 pObj =
Aig_Exor( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild0Copy(Aig_ManCo(p1,i)) );
190 else if ( Oper == 1 )
191 pObj =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_Not(Aig_ObjChild0Copy(Aig_ManCo(p1,i))) );
215 Aig_Obj_t * pFanin0 = Aig_ObjFanin0(pObj);
216 Aig_Obj_t * pFanin1 = Aig_ObjFanin1(pObj);
222 Aig_And(pNew, p0Data, Aig_Not(p0Next)),
223 Aig_And(pNew, p1Data, Aig_Not(p1Next)) );
225 Aig_And(pNew, Aig_Not(p0Data), p0Next),
226 Aig_And(pNew, Aig_Not(p1Data), p1Next) );
249 pNew->pName = Abc_UtilStrsav(
p->pName );
250 pNew->pSpec = Abc_UtilStrsav(
p->pSpec );
252 Aig_ManConst1(
p)->pData = Aig_ManConst0(pNew);
253 Aig_ManConst1(
p)->pNext = Aig_ManConst1(pNew);
265 pMiter = Aig_ManConst1(pNew);
268 pMiter =
Aig_And( pNew, pMiter,
274 if ( !Aig_ObjFaninC0(pObj) )
290 if ( !Aig_ObjFaninC0(pObj) )
308 printf(
"Aig_ManDupSimple(): The check has failed.\n" );
329 assert( Saig_ManPiNum(pBot) == Saig_ManPiNum(pTop) );
330 assert( Saig_ManPoNum(pBot) == Saig_ManPoNum(pTop) );
331 assert( Saig_ManRegNum(pBot) == Saig_ManRegNum(pTop) );
332 assert( Saig_ManRegNum(pBot) > 0 || Saig_ManRegNum(pTop) > 0 );
334 p =
Aig_ManStart( nFrames * Abc_MaxInt(Aig_ManObjNumMax(pBot), Aig_ManObjNumMax(pTop)) );
335 p->pName = Abc_UtilStrsav(
"frames" );
341 for ( f = 0; f < nFrames; f++ )
344 Aig_ManConst1(pAig)->pData = Aig_ManConst1(
p );
349 pObj->
pData =
Aig_And(
p, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
350 if ( f == nFrames - 1 )
362 pObj->
pData = Aig_ObjChild0Copy(pObj);
370 Saig_ManLo(pTop, i)->pData = pObj->
pData;
395 pNew->pName = Abc_UtilStrsav(
p->pName );
396 Aig_ManConst1(
p)->pData = Aig_ManConst1(pNew);
400 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
433 pNew->pName = Abc_UtilStrsav(
p->pName );
434 Aig_ManConst1(
p)->pData = Aig_ManConst1(pNew);
440 if ( i < Saig_ManRegNum(
p)/2 )
446 if ( i >= Saig_ManRegNum(
p)/2 )
450 if ( Aig_ObjFanin0(pObj)->pData && Aig_ObjFanin1(pObj)->pData )
451 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
456 assert( Aig_Regular(pObj)->pData != NULL );
462 if ( i < Saig_ManRegNum(
p)/2 )
468 if ( i >= Saig_ManRegNum(
p)/2 )
494 Aig_Obj_t * pObj, * pFanin, * pObj0, * pObj1;
496 assert( Saig_ManRegNum(
p) % 2 == 0 );
497 vSet0 = Vec_PtrAlloc( Saig_ManPoNum(
p) );
498 vSet1 = Vec_PtrAlloc( Saig_ManPoNum(
p) );
501 pFanin = Aig_ObjFanin0(pObj);
502 if ( Aig_ObjIsConst1( pFanin ) )
504 if ( !Aig_ObjFaninC0(pObj) )
505 printf(
"The output number %d of the miter is constant 1.\n", i );
511 printf(
"The miter cannot be demitered.\n" );
512 Vec_PtrFree( vSet0 );
513 Vec_PtrFree( vSet1 );
516 if ( Aig_ObjFaninC0(pObj) )
517 pObj0 = Aig_Not(pObj0);
520 if ( Aig_Regular(pObj0)->Id < Aig_Regular(pObj1)->Id )
522 Vec_PtrPush( vSet0, pObj0 );
523 Vec_PtrPush( vSet1, pObj1 );
527 Vec_PtrPush( vSet0, pObj1 );
528 Vec_PtrPush( vSet1, pObj0 );
537 (*ppAig0)->pName = Abc_UtilStrsav(
"part0" );
543 (*ppAig1)->pName = Abc_UtilStrsav(
"part1" );
545 Vec_PtrFree( vSet0 );
546 Vec_PtrFree( vSet1 );
567 if ( i < Saig_ManRegNum(
p)/2 )
573 pObj->
fMarkA = Aig_ObjFanin0(pObj)->fMarkA | Aig_ObjFanin1(pObj)->fMarkA;
574 pObj->
fMarkB = Aig_ObjFanin0(pObj)->fMarkB | Aig_ObjFanin1(pObj)->fMarkB;
591 Aig_Obj_t * pFanin, * pObj0, * pObj1, * pObjR0, * pObjR1;
592 assert( Saig_ObjIsPo(
p, pObj) );
593 pFanin = Aig_ObjFanin0( pObj );
594 if ( Aig_ObjIsConst1(pFanin) )
596 if ( !Aig_ObjFaninC0(pObj) )
598 *ppPo0 = Aig_ManConst0(
p);
599 *ppPo1 = Aig_ManConst0(
p);
602 if ( !Aig_ObjIsNode(pFanin) )
606 if ( Aig_ObjFaninC0(pObj) )
607 pObj0 = Aig_Not(pObj0);
609 pObjR0 = Aig_Regular(pObj0);
610 pObjR1 = Aig_Regular(pObj1);
635 if ( Aig_Regular(pObj0)->Id < Aig_Regular(pObj1)->Id )
665 if ( Aig_ManRegNum(
p) == 0 || (Aig_ManRegNum(
p) & 1) )
668 vSet0 = Vec_PtrAlloc( Saig_ManPoNum(
p) );
669 vSet1 = Vec_PtrAlloc( Saig_ManPoNum(
p) );
674 Vec_PtrFree( vSet0 );
675 Vec_PtrFree( vSet1 );
679 Vec_PtrPush( vSet0, pObj0 );
680 Vec_PtrPush( vSet1, pObj1 );
685 (*ppAig0)->pName = Abc_UtilStrsav(
"part0" );
689 (*ppAig1)->pName = Abc_UtilStrsav(
"part1" );
691 Vec_PtrFree( vSet0 );
692 Vec_PtrFree( vSet1 );
724 Vec_PtrWriteEntry( pTemp->vCos, k++, pObj );
727 Vec_PtrWriteEntry( pTemp->vCos, k++, pObj );
728 Vec_PtrShrink( pTemp->vCos, k );
729 pTemp->nTruePos = k - Saig_ManRegNum(pTemp);
739 Vec_PtrWriteEntry( pTemp->vCos, k++, pObj );
744 Vec_PtrWriteEntry( pTemp->vCos, k++, pObj );
745 Vec_PtrShrink( pTemp->vCos, k );
746 pTemp->nTruePos = k - Saig_ManRegNum(pTemp);
768 Aig_Obj_t * pObj, * pFanin, * pObj0, * pObj1;
771 vSet0 = Vec_PtrAlloc( Saig_ManPoNum(
p) );
772 vSet1 = Vec_PtrAlloc( Saig_ManPoNum(
p) );
775 pFanin = Aig_ObjFanin0(pObj);
776 if ( Aig_ObjIsConst1( pFanin ) )
778 if ( !Aig_ObjFaninC0(pObj) )
779 printf(
"The output number %d of the miter is constant 1.\n", i );
791 printf(
"The output number %d cannot be demitered.\n", i );
794 if ( Aig_ObjFaninC0(pObj) )
795 pObj0 = Aig_Not(pObj0);
798 if ( Aig_Regular(pObj0)->Id < Aig_Regular(pObj1)->Id )
800 Vec_PtrPush( vSet0, pObj0 );
801 Vec_PtrPush( vSet1, pObj1 );
805 Vec_PtrPush( vSet0, pObj1 );
806 Vec_PtrPush( vSet1, pObj0 );
815 (*ppAig0)->pName = Abc_UtilStrsav(
"part0" );
821 (*ppAig1)->pName = Abc_UtilStrsav(
"part1" );
823 Vec_PtrFree( vSet0 );
824 Vec_PtrFree( vSet1 );
841 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
843 Aig_ObjSetTravIdCurrent(
p, pObj);
848 if ( Saig_ObjIsPi(
p, pObj) )
850 if ( Saig_ObjIsLo(
p, pObj) )
855 assert( Aig_ObjIsNode(pObj) );
874 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
876 Aig_ObjSetTravIdCurrent(
p, pObj);
877 if ( Saig_ObjIsPi(
p, pObj) )
879 if ( Saig_ObjIsLo(
p, pObj) )
885 assert( Aig_ObjIsNode(pObj) );
906 Aig_Obj_t * pObj, * pObj0, * pObj1, * pFlop0, * pFlop1;
908 assert( Saig_ManRegNum(
p) > 0 );
911 vPairs = Vec_PtrAlloc( 2 * Saig_ManPoNum(
p) );
916 Vec_PtrFree( vPairs );
919 Vec_PtrPush( vPairs, pObj0 );
920 Vec_PtrPush( vPairs, pObj1 );
923 vSet0 = Vec_PtrAlloc( Saig_ManPoNum(
p) );
924 vSet1 = Vec_PtrAlloc( Saig_ManPoNum(
p) );
926 pObj0 = (
Aig_Obj_t *)Vec_PtrEntry( vPairs, 0 );
927 pObj1 = (
Aig_Obj_t *)Vec_PtrEntry( vPairs, 1 );
931 Vec_PtrPush( vSet0, pObj0 );
934 Vec_PtrPush( vSet1, pObj1 );
936 for ( i = 2; i < Vec_PtrSize(vPairs); i += 2 )
938 pObj0 = (
Aig_Obj_t *)Vec_PtrEntry( vPairs, i );
939 pObj1 = (
Aig_Obj_t *)Vec_PtrEntry( vPairs, i+1 );
949 printf(
"Output pair %4d: Difficult case...\n", i/2 );
954 Vec_PtrPush( vSet0, pObj0 );
959 Vec_PtrPush( vSet1, pObj0 );
965 Vec_PtrPush( vSet0, pObj1 );
970 Vec_PtrPush( vSet1, pObj1 );
979 printf(
"The miters contains %d flops reachable from both AIGs.\n", Counter );
987 (*ppAig0)->pName = Abc_UtilStrsav(
"part0" );
994 (*ppAig1)->pName = Abc_UtilStrsav(
"part1" );
996 Vec_PtrFree( vSet0 );
997 Vec_PtrFree( vSet1 );
998 Vec_PtrFree( vPairs );
1016 Aig_Man_t * pFrames0, * pFrames1, * pMiter;
1041 int i, RetValue = -1;
1043 Aig_ManConst1(
p)->fMarkA = 1;
1045 pObj->
fMarkA = pModel[i];
1047 pObj->
fMarkA = ( Aig_ObjFanin0(pObj)->fMarkA ^ Aig_ObjFaninC0(pObj) ) &
1048 ( Aig_ObjFanin1(pObj)->fMarkA ^ Aig_ObjFaninC1(pObj) );
1050 pObj->
fMarkA = Aig_ObjFanin0(pObj)->fMarkA ^ Aig_ObjFaninC0(pObj);
1054 if ( RetValue == -1 )
1080 abctime clkTotal = Abc_Clock();
1107 RetValue =
Fra_FraigCec( &pMiterCec, 100000, fVerbose );
1112 if ( RetValue == 1 )
1114 printf(
"Networks are equivalent. " );
1115ABC_PRT(
"Time", Abc_Clock() - clkTotal );
1117 else if ( RetValue == 0 )
1119 printf(
"Networks are NOT EQUIVALENT. " );
1120ABC_PRT(
"Time", Abc_Clock() - clkTotal );
1121 if ( pMiterCec->pData == NULL )
1122 printf(
"Counter-example is not available.\n" );
1127 printf(
"Counter-example verification has failed.\n" );
1130 if ( iOut < Saig_ManPoNum(pPart0) * nFrames )
1131 printf(
"Primary output %d has failed in frame %d.\n",
1132 iOut%Saig_ManPoNum(pPart0), iOut/Saig_ManPoNum(pPart0) );
1134 printf(
"Flop input %d has failed in the last frame.\n",
1135 iOut - Saig_ManPoNum(pPart0) * nFrames );
1136 printf(
"The counter-example detected %d incorrect POs or flop inputs.\n", nOuts );
1142 printf(
"Networks are UNDECIDED. " );
1143ABC_PRT(
"Time", Abc_Clock() - clkTotal );
1166 printf(
"Performing sequential verification using combinational A/B miter.\n" );
1177 printf(
"Demitering has failed.\n" );
1180 if ( Aig_ManRegNum(pPart0) != Aig_ManRegNum(pPart1) )
1184 printf(
"After demitering AIGs have different number of flops. Quitting.\n" );
1204 assert( Aig_ManRegNum(pPart0) > 0 );
1205 assert( Aig_ManRegNum(pPart1) > 0 );
1206 assert( Saig_ManPiNum(pPart0) == Saig_ManPiNum(pPart1) );
1207 assert( Saig_ManPoNum(pPart0) == Saig_ManPoNum(pPart1) );
1208 assert( Aig_ManRegNum(pPart0) == Aig_ManRegNum(pPart1) );
1210 if ( RetValue != 1 && Aig_ManNodeNum(pPart0) >= Aig_ManNodeNum(pPart1) )
1233 Aig_Obj_t * pObj, * pTemp, * pFan0, * pFan1;
1235 vSuper = Vec_PtrAlloc( 100 );
1238 if ( pMan->nConstrs && i >= Saig_ManPoNum(pMan) - pMan->nConstrs )
1240 printf(
"Output %3d : ", i );
1241 if ( Aig_ObjIsConst1(Aig_ObjFanin0(pObj)) )
1243 if ( !Aig_ObjFaninC0(pObj) )
1244 printf(
"Const1\n" );
1246 printf(
"Const0\n" );
1249 if ( !Aig_ObjIsNode(Aig_ObjFanin0(pObj)) )
1251 printf(
"Terminal\n" );
1255 if ( !Aig_ObjFaninC0(pObj) )
1267 printf(
"OR with %d inputs ", Vec_PtrSize(vSuper) );
1268 if ( Vec_PtrSize(vSuper) == 2 )
1277 if ( Saig_ObjIsLo(pMan, pTemp) )
1278 printf(
" %d", Aig_ObjCioId(pTemp) );
1280 Vec_PtrFree( vSupp0 );
1284 if ( Saig_ObjIsLo(pMan, pTemp) )
1285 printf(
" %d", Aig_ObjCioId(pTemp) );
1287 Vec_PtrFree( vSupp1 );
1307 Vec_PtrFree( vSuper );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int Aig_ManSeqCleanup(Aig_Man_t *p)
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
Aig_Man_t * Aig_ManDupSimple(Aig_Man_t *p)
DECLARATIONS ///.
void Aig_ManSetCioIds(Aig_Man_t *p)
Aig_Man_t * Aig_ManDupSimpleDfs(Aig_Man_t *p)
void Aig_ManCleanMarkA(Aig_Man_t *p)
int Aig_ObjRecognizeExor(Aig_Obj_t *pObj, Aig_Obj_t **ppFan0, Aig_Obj_t **ppFan1)
void Aig_ManFanoutStop(Aig_Man_t *p)
void Aig_ObjDeletePo(Aig_Man_t *p, Aig_Obj_t *pObj)
void Aig_ManStop(Aig_Man_t *p)
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
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)
void Aig_ManCleanNext(Aig_Man_t *p)
int Aig_ObjCollectSuper(Aig_Obj_t *pObj, Vec_Ptr_t *vSuper)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Obj_t * Aig_Exor(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
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_ManCleanMarkAB(Aig_Man_t *p)
#define Aig_ManForEachCo(p, pObj, i)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
Vec_Ptr_t * Aig_Support(Aig_Man_t *p, Aig_Obj_t *pObj)
void Aig_ManCleanData(Aig_Man_t *p)
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 ///.
int Fra_FraigCec(Aig_Man_t **ppAig, int nConfLimit, int fVerbose)
int Saig_ManDemiterDual(Aig_Man_t *p, Aig_Man_t **ppAig0, Aig_Man_t **ppAig1)
void Saig_AndDualRail(Aig_Man_t *pNew, Aig_Obj_t *pObj, Aig_Obj_t **ppData, Aig_Obj_t **ppNext)
Aig_Man_t * Saig_ManCreateMiterComb(Aig_Man_t *p0, Aig_Man_t *p1, int Oper)
int Ssw_SecSpecial(Aig_Man_t *pPart0, Aig_Man_t *pPart1, int nFrames, int fVerbose)
int Saig_ManDemiterNew(Aig_Man_t *pMan)
int Saig_ManDemiter(Aig_Man_t *p, Aig_Man_t **ppAig0, Aig_Man_t **ppAig1)
Aig_Man_t * Saig_ManCreateMiter(Aig_Man_t *p0, Aig_Man_t *p1, int Oper)
Aig_Man_t * Saig_ManCreateMiterTwo(Aig_Man_t *pOld, Aig_Man_t *pNew, int nFrames)
Aig_Man_t * Aig_ManDupNodesHalf(Aig_Man_t *p, Vec_Ptr_t *vSet, int iPart)
int Saig_ManDemiterSimpleDiff_old(Aig_Man_t *p, Aig_Man_t **ppAig0, Aig_Man_t **ppAig1)
Aig_Man_t * Aig_ManDupNodesAll(Aig_Man_t *p, Vec_Ptr_t *vSet)
ABC_NAMESPACE_IMPL_START Sec_MtrStatus_t Sec_MiterStatus(Aig_Man_t *p)
DECLARATIONS ///.
Aig_Man_t * Saig_ManUnrollTwo(Aig_Man_t *pBot, Aig_Man_t *pTop, int nFrames)
int Ssw_SecSpecialMiter(Aig_Man_t *p0, Aig_Man_t *p1, int nFrames, int fVerbose)
int Saig_ManDemiterSimpleDiff(Aig_Man_t *p, Aig_Man_t **ppAig0, Aig_Man_t **ppAig1)
int Saig_ManDemiterCheckPo(Aig_Man_t *p, Aig_Obj_t *pObj, Aig_Obj_t **ppPo0, Aig_Obj_t **ppPo1)
int Saig_ManDemiterSimple(Aig_Man_t *p, Aig_Man_t **ppAig0, Aig_Man_t **ppAig1)
Aig_Man_t * Saig_ManDualRail(Aig_Man_t *p, int fMiter)
int Ssw_SecCexResimulate(Aig_Man_t *p, int *pModel, int *pnOutputs)
void Saig_ManDemiterMarkPos(Aig_Man_t *p)
void Saig_ManDemiterLabel_rec(Aig_Man_t *p, Aig_Obj_t *pObj, int Value)
Aig_Obj_t * Saig_ManGetLabeledRegister_rec(Aig_Man_t *p, Aig_Obj_t *pObj)
#define Saig_ManForEachLiLo(p, pObjLi, pObjLo, i)
#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 Sec_MtrStatus_t_ Sec_MtrStatus_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.