52 assert( Vec_IntSize(vPermCis) == Aig_ManCiNum(pAig) );
53 vPermCos = Vec_IntAlloc( Aig_ManCoNum(pAig) );
54 if ( Saig_ManPoNum(pAig) == 1 )
55 Vec_IntPush( vPermCos, 0 );
58 Vec_Ptr_t * vRoots = Vec_PtrAlloc( Saig_ManPoNum(pAig) );
61 pFanin = Aig_ObjFanin0(pObj);
62 assert( Aig_ObjIsConst1(pFanin) || pFanin->
iData > 0 );
63 pObj->
iData = Abc_Var2Lit( pFanin->
iData, Aig_ObjFaninC0(pObj) );
64 Vec_PtrPush( vRoots, pObj );
68 Vec_IntPush( vPermCos, Aig_ObjCioId(pObj) );
69 Vec_PtrFree( vRoots );
72 Diff = Saig_ManPoNum(pAig) - Saig_ManPiNum(pAig);
74 Vec_IntPush( vPermCos, Entry + Diff );
91 if ( Aig_ObjIsTravIdCurrent(pAig, pObj) )
93 Aig_ObjSetTravIdCurrent(pAig, pObj);
94 assert( Aig_ObjIsNode(pObj) );
95 if ( !Aig_ObjIsNode(Aig_ObjFanin0(pObj)) || !Aig_ObjIsNode(Aig_ObjFanin1(pObj)) )
102 assert( Aig_ObjFanin0(pObj)->iData != Aig_ObjFanin1(pObj)->iData );
103 if ( Aig_ObjFanin0(pObj)->iData < Aig_ObjFanin1(pObj)->iData )
114 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
139 pNew->pName = Abc_UtilStrsav( pAig->pName );
142 pObj = Aig_ManConst1(pAig);
143 pObj->
pData = Aig_ManConst1(pNew);
144 Aig_ObjSetTravIdCurrent( pAig, pObj );
148 pObj = Aig_ManCi(pAig, Entry);
150 Aig_ObjSetTravIdCurrent( pAig, pObj );
155 pObj = Aig_ManCo(pAig, Entry);
161 pObj = Aig_ManCo(pAig, Entry);
165 Vec_IntFreeP( &vPerm );
166 Vec_IntFreeP( &vPermCo );
190 assert( Aig_ManCiNum(pAig1) == Aig_ManCiNum(pAig2) );
191 assert( Aig_ManCoNum(pAig1) == Aig_ManCoNum(pAig2) );
192 assert( Aig_ManRegNum(pAig1) == Aig_ManRegNum(pAig2) );
193 assert( Aig_ManNodeNum(pAig1) == Aig_ManNodeNum(pAig2) );
196 Aig_ManConst1(pAig2)->pData = Aig_ManConst1(pAig1);
198 pObj->
pData = Aig_ManCi( pAig1, Vec_IntEntry(vMap2to1, i) );
202 pFanin0 = Aig_ObjChild0Copy( pObj );
203 pFanin1 = Aig_ObjChild1Copy( pObj );
205 if ( pObj->
pData == NULL )
208 printf(
"Structural equivalence failed at node %d.\n", i );
213 if ( Aig_ManCoNum(pAig1)-Aig_ManRegNum(pAig1) == 1 && Aig_ObjChild0Copy(Aig_ManCo(pAig2, 0)) != Aig_ObjChild0(Aig_ManCo(pAig1, 0)) )
216 printf(
"Structural equivalence failed at primary output 0.\n" );
239 if ( pAig->nComplEdges > 0 )
240 return pAig->nComplEdges;
242 if ( Aig_ObjIsNode(pObj) )
244 Counter += Aig_ObjFaninC0(pObj);
245 Counter += Aig_ObjFaninC1(pObj);
247 else if ( Aig_ObjIsCo(pObj) )
248 Counter += Aig_ObjFaninC0(pObj);
249 return (pAig->nComplEdges = Counter);
266 Vec_Int_t * vPerm1, * vPerm2, * vInvPerm2;
268 if ( Aig_ManCiNum(pAig1) != Aig_ManCiNum(pAig2) )
270 if ( Aig_ManCoNum(pAig1) != Aig_ManCoNum(pAig2) )
272 if ( Aig_ManRegNum(pAig1) != Aig_ManRegNum(pAig2) )
274 if ( Aig_ManNodeNum(pAig1) != Aig_ManNodeNum(pAig2) )
289 assert( Vec_IntSize(vPerm1_) == Aig_ManCiNum(pAig1) );
291 assert( Vec_IntSize(vPerm2_) == Aig_ManCiNum(pAig2) );
294 vInvPerm2 = Vec_IntInvert( vPerm2, -1 );
297 assert( Entry >= 0 && Entry < Aig_ManCiNum(pAig1) );
298 Vec_IntWriteEntry( vInvPerm2, i, Vec_IntEntry(vPerm1, Entry) );
300 if ( vPerm1_ == NULL )
301 Vec_IntFree( vPerm1 );
302 if ( vPerm2_ == NULL )
303 Vec_IntFree( vPerm2 );
306 Vec_IntFreeP( &vInvPerm2 );
324 int fVeryVerbose = 0;
331 nPos = Aig_ManCoNum(pAig) - Aig_ManRegNum(pAig);
332 vParts = Vec_PtrAlloc( nPos );
333 vPerms = Vec_PtrAlloc( nPos );
334 for ( i = 0; i < nPos; i++ )
338 Vec_PtrPush( vParts, pPart );
339 Vec_PtrPush( vPerms, vMap );
344 vAigs = Vec_PtrAlloc( 1000 );
345 vPos = Vec_IntAlloc( 1000 );
350 printf(
"AIG %4d : ", i );
356 printf(
"Comparing AIG %4d and AIG %4d. ", Vec_IntEntry(vPos,k), i );
358 (
Vec_Int_t *)Vec_PtrEntry(vPerms, Vec_IntEntry(vPos,k)),
364 printf(
"Found match\n" );
371 printf(
"No match.\n" );
373 if ( k == Vec_PtrSize(vAigs) )
375 Vec_PtrPush( vAigs, pPart );
376 Vec_IntPush( vPos, i );
382 Vec_PtrFree( vParts );
385 Vec_PtrFree( vPerms );
388 Vec_PtrFree( vAigs );
408 return Vec_StrCompareVec( *p1, *p2 );
431 abctime clkDup = 0, clkAig = 0, clkIso = 0, clk2;
435 nPos = Aig_ManCoNum(pAig) - Aig_ManRegNum(pAig);
436 vBuffers = Vec_PtrAlloc( nPos );
437 for ( i = 0; i < nPos; i++ )
440 printf(
"%6d finished...\r", i );
444 clkDup += Abc_Clock() - clk2;
448 clkIso += Abc_Clock() - clk2;
452 clkAig += Abc_Clock() - clk2;
454 Vec_PtrPush( vBuffers, vStr );
463 Abc_PrintTime( 1,
"Duplicate time", clkDup );
464 Abc_PrintTime( 1,
"Isomorph time", clkIso );
465 Abc_PrintTime( 1,
"AIGER time", clkAig );
474 vClasses = Vec_PtrAlloc( Saig_ManPoNum(pAig) );
476 Vec_PtrPush( vClasses, (vLevel = Vec_IntAlloc(4)) );
477 vPrev = (
Vec_Str_t *)Vec_PtrEntry( vBuffers, 0 );
478 Vec_IntPush( vLevel, vPrev->
nCap );
482 if ( Vec_StrCompareVec(vPrev, vStr) )
483 Vec_PtrPush( vClasses, Vec_IntAlloc(4) );
484 vLevel = (
Vec_Int_t *)Vec_PtrEntryLast( vClasses );
485 Vec_IntPush( vLevel, vStr->
nCap );
491 Abc_PrintTime( 1,
"Sorting time", Abc_Clock() - clk );
511 Vec_IntSort( vLevel, 0 );
512 Vec_VecSortByFirstInt( (
Vec_Vec_t *)vClasses, 0 );
515 vRemain = Vec_IntAlloc( 100 );
517 Vec_IntPush( vRemain, Vec_IntEntry(vLevel, 0) );
520 pPart =
Saig_ManDupCones( pAig, Vec_IntArray(vRemain), Vec_IntSize(vRemain) );
521 Vec_IntFree( vRemain );
525 *pvPosEquivs = vClasses;
545 Vec_IntFree( vPerm );
546 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
566 printf(
"Reduced %d outputs to %d outputs. ", Saig_ManPoNum(pAig), Saig_ManPoNum(pPart) );
567 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
568 if ( fVerbose && *pvPosEquivs && Saig_ManPoNum(pAig) != Vec_PtrSize(*pvPosEquivs) )
570 printf(
"Nontrivial classes:\n" );
571 Vec_VecPrintInt( (
Vec_Vec_t *)*pvPosEquivs, 1 );
612 printf(
"Mapping of AIGs is found.\n" );
614 Vec_IntPrint( vMap );
617 printf(
"Mapping of AIGs is NOT found.\n" );
618 Vec_IntFreeP( &vMap );
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL void Abc_NtkPermute(Abc_Ntk_t *pNtk, int fInputs, int fOutputs, int fFlops, char *pInPermFile, char *pOutPermFile, char *pFlopPermFile)
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
int Aig_ManLevelNum(Aig_Man_t *p)
#define Aig_ManForEachObj(p, pObj, i)
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)
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 ///.
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
Aig_Obj_t * Aig_TableLookupTwo(Aig_Man_t *p, Aig_Obj_t *pFanin0, Aig_Obj_t *pFanin1)
void Aig_ManCleanData(Aig_Man_t *p)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
ABC_NAMESPACE_IMPL_START Abc_Ntk_t * Abc_NtkFromAigPhase(Aig_Man_t *pMan)
DECLARATIONS ///.
Aig_Man_t * Abc_NtkToDar(Abc_Ntk_t *pNtk, int fExors, int fRegisters)
Vec_Str_t * Ioa_WriteAigerIntoMemoryStr(Aig_Man_t *pMan)
int Iso_ObjCompareByData(Aig_Obj_t **pp1, Aig_Obj_t **pp2)
int Iso_StoCompareVecStr(Vec_Str_t **p1, Vec_Str_t **p2)
Aig_Man_t * Saig_ManIsoReduce(Aig_Man_t *pAig, Vec_Ptr_t **pvPosEquivs, int fVerbose)
Aig_Man_t * Iso_ManFilterPos_old(Aig_Man_t *pAig, int fVerbose)
ABC_NAMESPACE_IMPL_START Vec_Int_t * Saig_ManFindIsoPermCos(Aig_Man_t *pAig, Vec_Int_t *vPermCis)
DECLARATIONS ///.
Vec_Int_t * Iso_ManFindMapping(Aig_Man_t *pAig1, Aig_Man_t *pAig2, Vec_Int_t *vPerm1_, Vec_Int_t *vPerm2_, int fVerbose)
void Saig_ManDupIsoCanonical_rec(Aig_Man_t *pNew, Aig_Man_t *pAig, Aig_Obj_t *pObj)
ABC_NAMESPACE_IMPL_END ABC_NAMESPACE_IMPL_START Aig_Man_t * Iso_ManTest888(Aig_Man_t *pAig1, int fVerbose)
Aig_Man_t * Iso_ManFilterPos(Aig_Man_t *pAig, Vec_Ptr_t **pvPosEquivs, int fVerbose)
int Iso_ManNegEdgeNum(Aig_Man_t *pAig)
Aig_Man_t * Saig_ManDupIsoCanonical(Aig_Man_t *pAig, int fVerbose)
Aig_Man_t * Iso_ManTest(Aig_Man_t *pAig, int fVerbose)
int Iso_ManCheckMapping(Aig_Man_t *pAig1, Aig_Man_t *pAig2, Vec_Int_t *vMap2to1, int fVerbose)
Vec_Int_t * Saig_ManFindIsoPerm(Aig_Man_t *pAig, int fVerbose)
#define Saig_ManForEachPo(p, pObj, i)
Aig_Man_t * Saig_ManDupCones(Aig_Man_t *pAig, int *pPos, int nPos)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.