32static int Ivy_NodeBalanceFindLeft(
Vec_Ptr_t * vSuper );
33static void Ivy_NodeBalancePermute(
Ivy_Man_t *
p,
Vec_Ptr_t * vSuper,
int LeftBound,
int fExor );
34static void Ivy_NodeBalancePushUniqueOrderByLevel(
Vec_Ptr_t * vStore,
Ivy_Obj_t * pObj );
62 Ivy_ManConst1(
p)->TravId = Ivy_EdgeFromNode( Ivy_ManConst1(pNew) );
69 vStore = Vec_VecAlloc( 50 );
73 NewNodeId = Ivy_NodeBalance_rec( pNew, Ivy_Regular(pDriver), vStore, 0, fUpdateLevel );
74 NewNodeId = Ivy_EdgeNotCond( NewNodeId, Ivy_IsComplement(pDriver) );
77 Vec_VecFree( vStore );
84 printf(
"Ivy_ManBalance(): The check has failed.\n" );
101 int Diff = Ivy_Regular(*pp1)->Level - Ivy_Regular(*pp2)->Level;
106 Diff = Ivy_Regular(*pp1)->Id - Ivy_Regular(*pp2)->Id;
130 assert( !Ivy_IsComplement(pObjOld) );
131 assert( !Ivy_ObjIsBuf(pObjOld) );
133 if ( Ivy_ObjIsConst1(pObjOld) )
137 assert( Ivy_ObjIsNode(pObjOld) );
139 vSuper = Ivy_NodeBalanceCone( pObjOld, vStore, Level );
140 if ( vSuper->nSize == 0 )
142 pObjOld->
TravId = Ivy_EdgeFromNode( Ivy_ManConst0(pNew) );
145 if ( vSuper->nSize < 2 )
148 for ( i = 0; i < vSuper->nSize; i++ )
150 NewNodeId = Ivy_NodeBalance_rec( pNew, Ivy_Regular((
Ivy_Obj_t *)vSuper->pArray[i]), vStore, Level + 1, fUpdateLevel );
151 NewNodeId = Ivy_EdgeNotCond( NewNodeId, Ivy_IsComplement((
Ivy_Obj_t *)vSuper->pArray[i]) );
152 vSuper->pArray[i] = Ivy_EdgeToNode( pNew, NewNodeId );
159 pObjOld->
TravId = Ivy_EdgeFromNode( pObjNew );
179 assert( vSuper->nSize > 1 );
183 while ( vSuper->nSize > 1 )
186 LeftBound = (!fUpdateLevel)? 0 : Ivy_NodeBalanceFindLeft( vSuper );
188 Ivy_NodeBalancePermute(
p, vSuper, LeftBound, Type ==
IVY_EXOR );
192 Ivy_NodeBalancePushUniqueOrderByLevel( vSuper,
Ivy_Oper(
p, pObj1, pObj2, Type) );
194 return (
Ivy_Obj_t *)Vec_PtrEntry(vSuper, 0);
210 int RetValue1, RetValue2, i;
212 if ( Ivy_Regular(pObj)->fMarkB )
215 for ( i = 0; i < vSuper->nSize; i++ )
216 if ( vSuper->pArray[i] == pObj )
219 for ( i = 0; i < vSuper->nSize; i++ )
220 if ( vSuper->pArray[i] == Ivy_Not(pObj) )
226 if ( pObj != pRoot && (Ivy_IsComplement(pObj) || Ivy_ObjType(pObj) != Ivy_ObjType(pRoot) || Ivy_ObjRefs(pObj) > 1 || Vec_PtrSize(vSuper) > 10000) )
228 Vec_PtrPush( vSuper, pObj );
229 Ivy_Regular(pObj)->fMarkB = 1;
232 assert( !Ivy_IsComplement(pObj) );
233 assert( Ivy_ObjIsNode(pObj) );
237 if ( RetValue1 == -1 || RetValue2 == -1 )
240 return RetValue1 || RetValue2;
258 assert( !Ivy_IsComplement(pObj) );
260 if ( Vec_VecSize( vStore ) <= Level )
261 Vec_VecPush( vStore, Level, 0 );
263 vNodes = Vec_VecEntry( vStore, Level );
264 Vec_PtrClear( vNodes );
267 assert( vNodes->nSize > 1 );
270 Ivy_Regular(pObj)->fMarkB = 0;
273 if ( RetValue == -1 )
293int Ivy_NodeBalanceFindLeft(
Vec_Ptr_t * vSuper )
298 if ( Vec_PtrSize(vSuper) < 3 )
301 Current = Vec_PtrSize(vSuper) - 2;
302 pObjRight = (
Ivy_Obj_t *)Vec_PtrEntry( vSuper, Current );
304 for ( Current--; Current >= 0; Current-- )
307 pObjLeft = (
Ivy_Obj_t *)Vec_PtrEntry( vSuper, Current );
309 if ( Ivy_Regular(pObjLeft)->Level != Ivy_Regular(pObjRight)->Level )
314 pObjLeft = (
Ivy_Obj_t *)Vec_PtrEntry( vSuper, Current );
315 assert( Ivy_Regular(pObjLeft)->Level == Ivy_Regular(pObjRight)->Level );
333 Ivy_Obj_t * pObj1, * pObj2, * pObj3, * pGhost;
336 RightBound = Vec_PtrSize(vSuper) - 2;
337 assert( LeftBound <= RightBound );
338 if ( LeftBound == RightBound )
341 pObj1 = (
Ivy_Obj_t *)Vec_PtrEntry( vSuper, RightBound + 1 );
342 pObj2 = (
Ivy_Obj_t *)Vec_PtrEntry( vSuper, RightBound );
343 if ( Ivy_Regular(pObj1) ==
p->pConst1 || Ivy_Regular(pObj2) ==
p->pConst1 )
346 for ( i = RightBound; i >= LeftBound; i-- )
348 pObj3 = (
Ivy_Obj_t *)Vec_PtrEntry( vSuper, i );
349 if ( Ivy_Regular(pObj3) ==
p->pConst1 )
351 Vec_PtrWriteEntry( vSuper, i, pObj2 );
352 Vec_PtrWriteEntry( vSuper, RightBound, pObj3 );
358 if ( pObj3 == pObj2 )
360 Vec_PtrWriteEntry( vSuper, i, pObj2 );
361 Vec_PtrWriteEntry( vSuper, RightBound, pObj3 );
393 if ( Vec_PtrPushUnique(vStore, pObj) )
396 for ( i = vStore->nSize-1; i > 0; i-- )
399 pObj2 = (
Ivy_Obj_t *)vStore->pArray[i-1];
400 if ( Ivy_Regular(pObj1)->Level <= Ivy_Regular(pObj2)->Level )
402 vStore->pArray[i ] = pObj2;
403 vStore->pArray[i-1] = pObj1;
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Ivy_Obj_t * Ivy_NodeBalanceBuildSuper(Ivy_Man_t *p, Vec_Ptr_t *vSuper, Ivy_Type_t Type, int fUpdateLevel)
int Ivy_NodeBalanceCone_rec(Ivy_Obj_t *pRoot, Ivy_Obj_t *pObj, Vec_Ptr_t *vSuper)
int Ivy_NodeCompareLevelsDecrease(Ivy_Obj_t **pp1, Ivy_Obj_t **pp2)
Ivy_Man_t * Ivy_ManBalance(Ivy_Man_t *p, int fUpdateLevel)
FUNCTION DEFINITIONS ///.
int Ivy_ManCheck(Ivy_Man_t *p)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Ivy_Man_t_ Ivy_Man_t
INCLUDES ///.
Ivy_Obj_t * Ivy_TableLookup(Ivy_Man_t *p, Ivy_Obj_t *pObj)
FUNCTION DEFINITIONS ///.
int Ivy_ManCleanup(Ivy_Man_t *p)
Ivy_Man_t * Ivy_ManStart()
DECLARATIONS ///.
Ivy_Obj_t * Ivy_ObjCreatePo(Ivy_Man_t *p, Ivy_Obj_t *pDriver)
Ivy_Obj_t * Ivy_ObjReal(Ivy_Obj_t *pObj)
Ivy_Obj_t * Ivy_Oper(Ivy_Man_t *p, Ivy_Obj_t *p0, Ivy_Obj_t *p1, Ivy_Type_t Type)
FUNCTION DEFINITIONS ///.
#define Ivy_ManForEachPo(p, pObj, i)
struct Ivy_Obj_t_ Ivy_Obj_t
Ivy_Obj_t * Ivy_ObjCreatePi(Ivy_Man_t *p)
DECLARATIONS ///.
void Ivy_ManCleanTravId(Ivy_Man_t *p)
#define Ivy_ManForEachPi(p, pObj, i)
ITERATORS ///.
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 ///.