32static int Hop_NodeBalanceFindLeft(
Vec_Ptr_t * vSuper );
33static void Hop_NodeBalancePermute(
Hop_Man_t *
p,
Vec_Ptr_t * vSuper,
int LeftBound,
int fExor );
34static void Hop_NodeBalancePushUniqueOrderByLevel(
Vec_Ptr_t * vStore,
Hop_Obj_t * pObj );
62 Hop_ManConst1(
p)->pData = Hop_ManConst1(pNew);
66 vStore = Vec_VecAlloc( 50 );
69 pObjNew = Hop_NodeBalance_rec( pNew, Hop_ObjFanin0(pObj), vStore, 0, fUpdateLevel );
72 Vec_VecFree( vStore );
79 printf(
"Hop_ManBalance(): The check has failed.\n" );
99 assert( !Hop_IsComplement(pObjOld) );
101 if ( pObjOld->
pData )
103 assert( Hop_ObjIsNode(pObjOld) );
105 vSuper = Hop_NodeBalanceCone( pObjOld, vStore, Level );
107 if ( vSuper->nSize == 0 )
109 if ( Vec_PtrSize(vSuper) < 2 )
112 for ( i = 0; i < Vec_PtrSize(vSuper); i++ )
114 pObjNew = Hop_NodeBalance_rec( pNew, Hop_Regular((
Hop_Obj_t *)vSuper->pArray[i]), vStore, Level + 1, fUpdateLevel );
115 vSuper->pArray[i] = Hop_NotCond( pObjNew, Hop_IsComplement((
Hop_Obj_t *)vSuper->pArray[i]) );
138 int RetValue1, RetValue2, i;
140 if ( Hop_Regular(pObj)->fMarkB )
143 for ( i = 0; i < vSuper->nSize; i++ )
144 if ( vSuper->pArray[i] == pObj )
147 for ( i = 0; i < vSuper->nSize; i++ )
148 if ( vSuper->pArray[i] == Hop_Not(pObj) )
154 if ( pObj != pRoot && (Hop_IsComplement(pObj) || Hop_ObjType(pObj) != Hop_ObjType(pRoot) || Hop_ObjRefs(pObj) > 1 || Vec_PtrSize(vSuper) > 10000) )
156 Vec_PtrPush( vSuper, pObj );
157 Hop_Regular(pObj)->fMarkB = 1;
160 assert( !Hop_IsComplement(pObj) );
161 assert( Hop_ObjIsNode(pObj) );
165 if ( RetValue1 == -1 || RetValue2 == -1 )
168 return RetValue1 || RetValue2;
186 assert( !Hop_IsComplement(pObj) );
188 if ( Vec_VecSize( vStore ) <= Level )
189 Vec_VecPush( vStore, Level, 0 );
191 vNodes = Vec_VecEntry( vStore, Level );
192 Vec_PtrClear( vNodes );
195 assert( vNodes->nSize > 1 );
198 Hop_Regular(pObj)->fMarkB = 0;
201 if ( RetValue == -1 )
219 int Diff = Hop_ObjLevel(Hop_Regular(*pp1)) - Hop_ObjLevel(Hop_Regular(*pp2));
224 Diff = Hop_Regular(*pp1)->Id - Hop_Regular(*pp2)->Id;
247 assert( vSuper->nSize > 1 );
251 while ( vSuper->nSize > 1 )
254 LeftBound = (!fUpdateLevel)? 0 : Hop_NodeBalanceFindLeft( vSuper );
256 Hop_NodeBalancePermute(
p, vSuper, LeftBound, Type ==
AIG_EXOR );
260 Hop_NodeBalancePushUniqueOrderByLevel( vSuper,
Hop_Oper(
p, pObj1, pObj2, Type) );
262 return (
Hop_Obj_t *)Vec_PtrEntry(vSuper, 0);
280int Hop_NodeBalanceFindLeft(
Vec_Ptr_t * vSuper )
285 if ( Vec_PtrSize(vSuper) < 3 )
288 Current = Vec_PtrSize(vSuper) - 2;
289 pObjRight = (
Hop_Obj_t *)Vec_PtrEntry( vSuper, Current );
291 for ( Current--; Current >= 0; Current-- )
294 pObjLeft = (
Hop_Obj_t *)Vec_PtrEntry( vSuper, Current );
296 if ( Hop_ObjLevel(Hop_Regular(pObjLeft)) != Hop_ObjLevel(Hop_Regular(pObjRight)) )
301 pObjLeft = (
Hop_Obj_t *)Vec_PtrEntry( vSuper, Current );
302 assert( Hop_ObjLevel(Hop_Regular(pObjLeft)) == Hop_ObjLevel(Hop_Regular(pObjRight)) );
320 Hop_Obj_t * pObj1, * pObj2, * pObj3, * pGhost;
323 RightBound = Vec_PtrSize(vSuper) - 2;
324 assert( LeftBound <= RightBound );
325 if ( LeftBound == RightBound )
328 pObj1 = (
Hop_Obj_t *)Vec_PtrEntry( vSuper, RightBound + 1 );
329 pObj2 = (
Hop_Obj_t *)Vec_PtrEntry( vSuper, RightBound );
330 if ( Hop_Regular(pObj1) ==
p->pConst1 || Hop_Regular(pObj2) ==
p->pConst1 )
333 for ( i = RightBound; i >= LeftBound; i-- )
335 pObj3 = (
Hop_Obj_t *)Vec_PtrEntry( vSuper, i );
336 if ( Hop_Regular(pObj3) ==
p->pConst1 )
338 Vec_PtrWriteEntry( vSuper, i, pObj2 );
339 Vec_PtrWriteEntry( vSuper, RightBound, pObj3 );
345 if ( pObj3 == pObj2 )
347 Vec_PtrWriteEntry( vSuper, i, pObj2 );
348 Vec_PtrWriteEntry( vSuper, RightBound, pObj3 );
380 if ( Vec_PtrPushUnique(vStore, pObj) )
383 for ( i = vStore->nSize-1; i > 0; i-- )
386 pObj2 = (
Hop_Obj_t *)vStore->pArray[i-1];
387 if ( Hop_ObjLevel(Hop_Regular(pObj1)) <= Hop_ObjLevel(Hop_Regular(pObj2)) )
389 vStore->pArray[i ] = pObj2;
390 vStore->pArray[i-1] = pObj1;
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int Hop_NodeBalanceCone_rec(Hop_Obj_t *pRoot, Hop_Obj_t *pObj, Vec_Ptr_t *vSuper)
int Hop_NodeCompareLevelsDecrease(Hop_Obj_t **pp1, Hop_Obj_t **pp2)
Hop_Obj_t * Hop_NodeBalanceBuildSuper(Hop_Man_t *p, Vec_Ptr_t *vSuper, Hop_Type_t Type, int fUpdateLevel)
Hop_Man_t * Hop_ManBalance(Hop_Man_t *p, int fUpdateLevel)
FUNCTION DEFINITIONS ///.
Hop_Obj_t * Hop_ObjCreatePo(Hop_Man_t *p, Hop_Obj_t *pDriver)
typedefABC_NAMESPACE_HEADER_START struct Hop_Man_t_ Hop_Man_t
INCLUDES ///.
int Hop_ManCheck(Hop_Man_t *p)
DECLARATIONS ///.
#define Hop_ManForEachPi(p, pObj, i)
ITERATORS ///.
Hop_Obj_t * Hop_TableLookup(Hop_Man_t *p, Hop_Obj_t *pGhost)
FUNCTION DEFINITIONS ///.
Hop_Obj_t * Hop_Oper(Hop_Man_t *p, Hop_Obj_t *p0, Hop_Obj_t *p1, Hop_Type_t Type)
#define Hop_ManForEachPo(p, pObj, i)
Hop_Obj_t * Hop_ObjCreatePi(Hop_Man_t *p)
DECLARATIONS ///.
Hop_Man_t * Hop_ManStart()
DECLARATIONS ///.
struct Hop_Obj_t_ Hop_Obj_t
void Hop_ManCleanData(Hop_Man_t *p)
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 ///.