67#define Dch_ManForEachClass( p, ppClass, i ) \
68 for ( i = 0; i < Aig_ManObjNumMax(p->pAig); i++ ) \
69 if ( ((ppClass) = p->pId2Class[i]) == NULL ) {} else
71#define Dch_ClassForEachNode( p, pRepr, pNode, i ) \
72 for ( i = 0; i < p->pClassSizes[pRepr->Id]; i++ ) \
73 if ( ((pNode) = p->pId2Class[pRepr->Id][i]) == NULL ) {} else
92 assert(
p->pId2Class[pRepr->
Id] == NULL );
93 p->pId2Class[pRepr->
Id] = pClass;
96 p->pClassSizes[pRepr->
Id] = nSize;
98 p->nLits += nSize - 1;
117 p->pId2Class[pRepr->
Id] = NULL;
118 nSize =
p->pClassSizes[pRepr->
Id];
121 p->nLits -= nSize - 1;
122 p->pClassSizes[pRepr->
Id] = 0;
144 p->pClassSizes =
ABC_CALLOC(
int, Aig_ManObjNumMax(pAig) );
145 p->vClassOld = Vec_PtrAlloc( 100 );
146 p->vClassNew = Vec_PtrAlloc( 100 );
147 assert( pAig->pReprs == NULL );
164 unsigned (*pFuncNodeHash)(
void *,
Aig_Obj_t *),
165 int (*pFuncNodeIsConst)(
void *,
Aig_Obj_t *),
168 p->pManData = pManData;
169 p->pFuncNodeHash = pFuncNodeHash;
170 p->pFuncNodeIsConst = pFuncNodeIsConst;
171 p->pFuncNodesAreEqual = pFuncNodesAreEqual;
187 if (
p->vClassNew ) Vec_PtrFree(
p->vClassNew );
188 if (
p->vClassOld ) Vec_PtrFree(
p->vClassOld );
224 assert(
p->pId2Class[pRepr->
Id] != NULL );
226 *pnSize =
p->pClassSizes[pRepr->
Id];
227 return p->pId2Class[pRepr->
Id];
244 int i, k, nLits, nClasses, nCands1;
245 nClasses = nLits = 0;
252 assert( Aig_ObjRepr(
p->pAig, pObj) == NULL );
255 assert( Aig_ObjRepr(
p->pAig, pObj) == ppClass[0] );
265 nCands1 += Dch_ObjIsConst1Cand(
p->pAig, pObj );
267 assert(
p->nCands1 == nCands1 );
268 assert(
p->nClasses == nClasses );
286 Abc_Print( 1,
"{ " );
289 Abc_Print( 1,
"}\n" );
308 Abc_Print( 1,
"Equivalence classes: Const1 = %5d. Class = %5d. Lit = %5d.\n",
309 p->nCands1,
p->nClasses,
p->nLits );
312 Abc_Print( 1,
"Constants { " );
314 if ( Dch_ObjIsConst1Cand(
p->pAig, pObj ) )
316 Abc_Print( 1,
"}\n" );
319 Abc_Print( 1,
"%3d (%3d) : ", i,
p->pClassSizes[i] );
322 Abc_Print( 1,
"\n" );
338 Aig_Obj_t ** ppTable, ** ppNexts, ** ppClassNew;
340 int i, k, nTableSize, nNodes, iEntry, nEntries, nEntries2;
343 nTableSize = Abc_PrimeCudd( Aig_ManObjNumMax(
p->pAig)/4 );
353 if ( !Aig_ObjIsCi(pObj) )
358 if ( !Aig_ObjIsNode(pObj) && !Aig_ObjIsCi(pObj) )
361 if ( nMaxLevs && (
int)pObj->
Level >= nMaxLevs )
365 if (
p->pFuncNodeIsConst(
p->pManData, pObj ) )
367 Dch_ObjSetConst1Cand(
p->pAig, pObj );
372 iEntry =
p->pFuncNodeHash(
p->pManData, pObj ) % nTableSize;
374 if ( ppTable[iEntry] == NULL )
375 ppTable[iEntry] = pObj;
379 pRepr = ppTable[iEntry];
380 Aig_ObjSetRepr(
p->pAig, pObj, pRepr );
382 if ( Dch_ObjNext( ppNexts, pRepr ) == NULL )
384 p->pClassSizes[pRepr->
Id]++;
388 Dch_ObjSetNext( ppNexts, pObj, Dch_ObjNext( ppNexts, pRepr ) );
389 Dch_ObjSetNext( ppNexts, pRepr, pObj );
390 p->pClassSizes[pRepr->
Id]++;
397 p->pMemClassesFree =
p->pMemClasses + nEntries;
403 if ( !Aig_ObjIsNode(pObj) && !Aig_ObjIsCi(pObj) )
405 nNodes =
p->pClassSizes[pObj->
Id];
411 ppClassNew =
p->pMemClasses + nEntries2;
412 ppClassNew[0] = pObj;
413 for ( pTemp = Dch_ObjNext(ppNexts, pObj), k = 1; pTemp;
414 pTemp = Dch_ObjNext(ppNexts, pTemp), k++ )
416 ppClassNew[nNodes-k] = pTemp;
419 p->pClassSizes[pObj->
Id] = 0;
420 Dch_ObjAddClass(
p, pObj, ppClassNew, nNodes );
424 assert( nEntries == nEntries2 );
450 Vec_PtrClear(
p->vClassOld );
451 Vec_PtrClear(
p->vClassNew );
453 if (
p->pFuncNodesAreEqual(
p->pManData, pReprOld, pObj) )
454 Vec_PtrPush(
p->vClassOld, pObj );
456 Vec_PtrPush(
p->vClassNew, pObj );
458 if ( Vec_PtrSize(
p->vClassNew) == 0 )
462 pReprNew = (
Aig_Obj_t *)Vec_PtrEntry(
p->vClassNew, 0 );
463 assert( Vec_PtrSize(
p->vClassOld) > 0 );
464 assert( Vec_PtrSize(
p->vClassNew) > 0 );
467 pClassOld = Dch_ObjRemoveClass(
p, pReprOld );
471 Aig_ObjSetRepr(
p->pAig, pObj, i? pReprOld : NULL );
474 pClassNew = pClassOld + i;
478 Aig_ObjSetRepr(
p->pAig, pObj, i? pReprNew : NULL );
482 if ( Vec_PtrSize(
p->vClassOld) > 1 )
483 Dch_ObjAddClass(
p, pReprOld, pClassOld, Vec_PtrSize(
p->vClassOld) );
484 if ( Vec_PtrSize(
p->vClassNew) > 1 )
485 Dch_ObjAddClass(
p, pReprNew, pClassNew, Vec_PtrSize(
p->vClassNew) );
488 if ( fRecursive && Vec_PtrSize(
p->vClassNew) > 1 )
529 Vec_PtrClear( vRoots );
531 Vec_PtrPush( vRoots, pObj );
532 assert( Vec_PtrSize(vRoots) > 1 );
549 Vec_PtrClear( vRoots );
550 Limit = Abc_MinInt( pObj->
Id + nNodes, Aig_ManObjNumMax(
p->pAig) );
551 for ( i = pObj->
Id; i < Limit; i++ )
553 pObj = Aig_ManObj(
p->pAig, i );
554 if ( pObj && Dch_ObjIsConst1Cand(
p->pAig, pObj ) )
555 Vec_PtrPush( vRoots, pObj );
572 Aig_Obj_t * pObj, * pReprNew, ** ppClassNew;
574 if ( Vec_PtrSize(vRoots) == 0 )
577 Vec_PtrClear(
p->vClassNew );
579 if ( !
p->pFuncNodeIsConst(
p->pManData, pObj ) )
580 Vec_PtrPush(
p->vClassNew, pObj );
582 if ( Vec_PtrSize(
p->vClassNew) == 0 )
584 p->nCands1 -= Vec_PtrSize(
p->vClassNew);
585 pReprNew = (
Aig_Obj_t *)Vec_PtrEntry(
p->vClassNew, 0 );
586 Aig_ObjSetRepr(
p->pAig, pReprNew, NULL );
587 if ( Vec_PtrSize(
p->vClassNew) == 1 )
590 ppClassNew =
p->pMemClassesFree;
591 p->pMemClassesFree += Vec_PtrSize(
p->vClassNew);
594 ppClassNew[i] = pObj;
595 Aig_ObjSetRepr(
p->pAig, pObj, i? pReprNew : NULL );
597 Dch_ObjAddClass(
p, pReprNew, ppClassNew, Vec_PtrSize(
p->vClassNew) );
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManReprStart(Aig_Man_t *p, int nIdMax)
DECLARATIONS ///.
#define Aig_ManForEachObj(p, pObj, i)
int Aig_SupportSize(Aig_Man_t *p, Aig_Obj_t *pObj)
struct Aig_Obj_t_ Aig_Obj_t
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Aig_Obj_t ** Dch_ClassesReadClass(Dch_Cla_t *p, Aig_Obj_t *pRepr, int *pnSize)
void Dch_ClassesPrepare(Dch_Cla_t *p, int fLatchCorr, int nMaxLevs)
void Dch_ClassesCollectConst1Group(Dch_Cla_t *p, Aig_Obj_t *pObj, int nNodes, Vec_Ptr_t *vRoots)
void Dch_ClassesStop(Dch_Cla_t *p)
#define Dch_ManForEachClass(p, ppClass, i)
void Dch_ClassesPrintOne(Dch_Cla_t *p, Aig_Obj_t *pRepr)
int Dch_ClassesRefineConst1Group(Dch_Cla_t *p, Vec_Ptr_t *vRoots, int fRecursive)
void Dch_ClassesCheck(Dch_Cla_t *p)
int Dch_ClassesRefine(Dch_Cla_t *p)
void Dch_ClassesPrint(Dch_Cla_t *p, int fVeryVerbose)
void Dch_ClassesCollectOneClass(Dch_Cla_t *p, Aig_Obj_t *pRepr, Vec_Ptr_t *vRoots)
#define Dch_ClassForEachNode(p, pRepr, pNode, i)
int Dch_ClassesRefineOneClass(Dch_Cla_t *p, Aig_Obj_t *pReprOld, int fRecursive)
int Dch_ClassesLitNum(Dch_Cla_t *p)
void Dch_ClassesSetData(Dch_Cla_t *p, void *pManData, unsigned(*pFuncNodeHash)(void *, Aig_Obj_t *), int(*pFuncNodeIsConst)(void *, Aig_Obj_t *), int(*pFuncNodesAreEqual)(void *, Aig_Obj_t *, Aig_Obj_t *))
Dch_Cla_t * Dch_ClassesStart(Aig_Man_t *pAig)
typedefABC_NAMESPACE_HEADER_START struct Dch_Cla_t_ Dch_Cla_t
INCLUDES ///.
int(* pFuncNodeIsConst)(void *, Aig_Obj_t *)
Aig_Obj_t ** pMemClassesFree
unsigned(* pFuncNodeHash)(void *, Aig_Obj_t *)
int(* pFuncNodesAreEqual)(void *, Aig_Obj_t *, Aig_Obj_t *)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.