82 p->nObjs = Aig_ManObjNumMax( pAig );
84 p->vVisited = Vec_IntStart( 1000 );
85 p->vPlaces = Vec_IntStart( 1000 );
86 p->vRoots = Vec_PtrStart( 1000 );
92 Vec_IntFree(
p->vPlaces );
93 Vec_IntFree(
p->vVisited );
94 Vec_PtrFree(
p->vRoots );
113 Iso_Dat_t * pThis = pData + Aig_ObjId(pObj);
114 assert( Aig_ObjIsCi(pObj) || Aig_ObjIsNode(pObj) );
123 assert( *((
int *)pThis) == 0 );
130 pThis->
nFiNeg = Aig_ObjFaninC0(pObj) + Aig_ObjFaninC1(pObj);
131 if ( Aig_ObjIsNode(pObj) )
133 if ( Aig_ObjFaninC0(pObj) < Aig_ObjFaninC1(pObj) || (Aig_ObjFaninC0(pObj) == Aig_ObjFaninC1(pObj) && Aig_ObjFanin0(pObj)->Level < Aig_ObjFanin1(pObj)->Level) )
135 pThis->
Fi0Lev = pObj->
Level - Aig_ObjFanin0(pObj)->Level;
136 pThis->
Fi1Lev = pObj->
Level - Aig_ObjFanin1(pObj)->Level;
140 pThis->
Fi0Lev = pObj->
Level - Aig_ObjFanin1(pObj)->Level;
141 pThis->
Fi1Lev = pObj->
Level - Aig_ObjFanin0(pObj)->Level;
146 else if ( Saig_ObjIsLo(
p, pObj) )
150 Vec_PtrPush( vRoots, Saig_ObjLoToLi(
p, pObj) );
152 else if ( Saig_ObjIsPi(
p, pObj) )
160 Vec_IntPush( vVisited, Aig_ObjId(pObj) );
178 int fVerboseShow = 0;
183 int i, Value, Entry, * pPerm;
186 assert( Aig_ObjIsCo(pPo) );
189 Vec_IntClear(
p->vVisited );
190 Vec_PtrClear(
p->vRoots );
191 Vec_PtrPush(
p->vRoots, pPo );
195 if ( !Aig_ObjIsConst1(Aig_ObjFanin0(pObj)) )
200 Vec_IntClear(
p->vPlaces );
203 Value = pData2[Entry].
Data;
205 if (
p->pCounters[Value]++ == 0 )
206 Vec_IntPush(
p->vPlaces, Value );
208 *((
int *)(
p->pData + Entry)) = 0;
212 Vec_IntClear(
p->vVisited );
216 Vec_IntPush(
p->vVisited,
p->pCounters[Entry] );
217 p->pCounters[Entry] = 0;
223 assert( Vec_IntEntry(
p->vVisited, pPerm[0]) <= Vec_IntEntry(
p->vVisited, pPerm[Vec_IntSize(
p->vVisited)-1]) );
226 vInfo = Vec_IntAlloc( Vec_IntSize(
p->vVisited) );
227 for ( i = Vec_IntSize(
p->vVisited)-1; i >= 0; i-- )
229 Entry = Vec_IntEntry(
p->vVisited, pPerm[i] );
230 Entry = (Entry <<
AIG_ISO_NUM) | Vec_IntEntry(
p->vPlaces, pPerm[i] );
231 Vec_IntPush( vInfo, Entry );
239 Iso_Dat2_t Data = { (unsigned)Entry & 0xFFFF };
242 printf(
"%6d : ", i );
243 printf(
"Freq =%6d ", Entry >> 16 );
245 printf(
"FiNeg =%3d ", pData->
nFiNeg );
246 printf(
"FoNeg =%3d ", pData->
nFoNeg );
247 printf(
"FoPos =%3d ", pData->
nFoPos );
248 printf(
"Fi0L =%3d ", pData->
Fi0Lev );
249 printf(
"Fi1L =%3d ", pData->
Fi1Lev );
250 printf(
"Lev =%3d ", pData->
Level );
269 return Vec_IntCompareVec( *p1, *p2 );
289 int i, Number, nUnique = 0;
294 vInfos = Vec_PtrAlloc( Saig_ManPoNum(pAig) );
298 Vec_IntPush( vInfo, i );
299 Vec_PtrPush( vInfos, vInfo );
302 Abc_PrintTime( 1,
"Info computation time", Abc_Clock() - clk );
310 vClasses = Vec_PtrAlloc( Saig_ManPoNum(pAig) );
312 Vec_PtrPush( vClasses, (vLevel = Vec_IntAlloc(4)) );
313 vPrev = (
Vec_Int_t *)Vec_PtrEntry( vInfos, 0 );
314 Vec_IntPush( vLevel, Vec_IntPop(vPrev) );
318 Number = Vec_IntPop( vInfo );
319 if ( Vec_IntCompareVec(vPrev, vInfo) )
320 Vec_PtrPush( vClasses, Vec_IntAlloc(4) );
321 vLevel = (
Vec_Int_t *)Vec_PtrEntryLast( vClasses );
322 Vec_IntPush( vLevel, Number );
326 Abc_PrintTime( 1,
"Sorting time", Abc_Clock() - clk );
331 printf(
"Divided %d outputs into %d cand equiv classes.\n", Saig_ManPoNum(pAig), Vec_PtrSize(vClasses) );
334 if ( Vec_IntSize(vLevel) > 1 )
335 printf(
"%d ", Vec_IntSize(vLevel) );
338 printf(
" Unique = %d\n", nUnique );
int * Abc_MergeSortCost(int *pCosts, int nSize)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
struct Aig_Obj_t_ Aig_Obj_t
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Iso_Dat_t_ Iso_Dat_t
struct Iso_Dat2_t_ Iso_Dat2_t
void Iso_StoCollectInfo_rec(Aig_Man_t *p, Aig_Obj_t *pObj, int fCompl, Vec_Int_t *vVisited, Iso_Dat_t *pData, Vec_Ptr_t *vRoots)
#define AIG_ISO_NUM
DECLARATIONS ///.
Vec_Vec_t * Saig_IsoDetectFast(Aig_Man_t *pAig)
void Iso_StoStop(Iso_Sto_t *p)
Vec_Int_t * Iso_StoCollectInfo(Iso_Sto_t *p, Aig_Obj_t *pPo)
int Iso_StoCompareVecInt(Vec_Int_t **p1, Vec_Int_t **p2)
Iso_Sto_t * Iso_StoStart(Aig_Man_t *pAig)
FUNCTION DEFINITIONS ///.
struct Iso_Sto_t_ Iso_Sto_t
#define Saig_ManForEachPo(p, pObj, i)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#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 ///.