50 int Diff = Aig_ObjToLit(*pp1) - Aig_ObjToLit(*pp2);
67 if ( i + 1 == Vec_PtrSize(vNodes) )
69 Vec_PtrWriteEntry( vNodes, k++, pTemp );
72 pTempNext = (
Aig_Obj_t *)Vec_PtrEntry( vNodes, i+1 );
73 if ( !fExor && pTemp == Aig_Not(pTempNext) )
75 Vec_PtrClear( vNodes );
78 if ( pTemp != pTempNext )
79 Vec_PtrWriteEntry( vNodes, k++, pTemp );
83 Vec_PtrShrink( vNodes, k );
84 if ( Vec_PtrSize(vNodes) < 2 )
87 pTemp = (
Aig_Obj_t *)Vec_PtrEntry( vNodes, 0 );
90 assert( pTemp != pTempNext );
108 if ( pObj != pRoot && (Aig_IsComplement(pObj) || Aig_ObjType(pObj) != Aig_ObjType(pRoot) || Aig_ObjRefs(pObj) > 1 || Vec_PtrSize(vSuper) > 10000) )
109 Vec_PtrPush( vSuper, pObj );
112 assert( !Aig_IsComplement(pObj) );
113 assert( Aig_ObjIsNode(pObj) );
122 assert( !Aig_IsComplement(pObj) );
123 assert( Aig_ObjIsNode(pObj) );
125 if ( Vec_VecSize( vStore ) <= Level )
126 Vec_VecPush( vStore, Level, 0 );
128 vNodes = Vec_VecEntry( vStore, Level );
129 Vec_PtrClear( vNodes );
241 if ( Vec_PtrSize(vSuper) < 3 )
244 Current = Vec_PtrSize(vSuper) - 2;
245 pObjRight = (
Aig_Obj_t *)Vec_PtrEntry( vSuper, Current );
247 for ( Current--; Current >= 0; Current-- )
250 pObjLeft = (
Aig_Obj_t *)Vec_PtrEntry( vSuper, Current );
252 if ( Aig_ObjLevel(Aig_Regular(pObjLeft)) != Aig_ObjLevel(Aig_Regular(pObjRight)) )
257 pObjLeft = (
Aig_Obj_t *)Vec_PtrEntry( vSuper, Current );
258 assert( Aig_ObjLevel(Aig_Regular(pObjLeft)) == Aig_ObjLevel(Aig_Regular(pObjRight)) );
276 Aig_Obj_t * pObj1, * pObj2, * pObj3, * pGhost;
279 RightBound = Vec_PtrSize(vSuper) - 2;
280 assert( LeftBound <= RightBound );
281 if ( LeftBound == RightBound )
284 pObj1 = (
Aig_Obj_t *)Vec_PtrEntry( vSuper, RightBound + 1 );
285 pObj2 = (
Aig_Obj_t *)Vec_PtrEntry( vSuper, RightBound );
286 if ( Aig_Regular(pObj1) ==
p->pConst1 || Aig_Regular(pObj2) ==
p->pConst1 || Aig_Regular(pObj1) == Aig_Regular(pObj2) )
289 for ( i = RightBound; i >= LeftBound; i-- )
291 pObj3 = (
Aig_Obj_t *)Vec_PtrEntry( vSuper, i );
292 if ( Aig_Regular(pObj3) ==
p->pConst1 )
294 Vec_PtrWriteEntry( vSuper, i, pObj2 );
295 Vec_PtrWriteEntry( vSuper, RightBound, pObj3 );
298 if ( Aig_Regular(pObj1) == Aig_Regular(pObj3) )
300 if ( pObj3 == pObj2 )
302 Vec_PtrWriteEntry( vSuper, i, pObj2 );
303 Vec_PtrWriteEntry( vSuper, RightBound, pObj3 );
309 if ( pObj3 == pObj2 )
311 Vec_PtrWriteEntry( vSuper, i, pObj2 );
312 Vec_PtrWriteEntry( vSuper, RightBound, pObj3 );
342 int Diff = Aig_ObjLevel(Aig_Regular(*pp1)) - Aig_ObjLevel(Aig_Regular(*pp2));
347 Diff = Aig_ObjId(Aig_Regular(*pp1)) - Aig_ObjId(Aig_Regular(*pp2));
370 if ( Vec_PtrPushUnique(vStore, pObj) )
373 Vec_PtrRemove(vStore, pObj);
377 for ( i = vStore->nSize-1; i > 0; i-- )
380 pObj2 = (
Aig_Obj_t *)vStore->pArray[i-1];
381 if ( Aig_ObjLevel(Aig_Regular(pObj1)) <= Aig_ObjLevel(Aig_Regular(pObj2)) )
383 vStore->pArray[i ] = pObj2;
384 vStore->pArray[i-1] = pObj1;
403 assert( vSuper->nSize > 1 );
407 while ( vSuper->nSize > 1 )
418 return vSuper->nSize ? (
Aig_Obj_t *)Vec_PtrEntry(vSuper, 0) : Aig_ManConst0(
p);
436 pObj = Aig_Regular(pObj);
437 if ( Aig_ObjIsConst1(pObj) )
439 if ( Aig_ObjLevel(pObj) >= nLutSize )
442 if ( nBaseSize >= nLutSize )
462 int i, nBaseSizeAll, nBaseSize;
463 assert( vSuper->nSize > 1 );
467 while ( Vec_PtrSize(vSuper) > 1 )
471 vSubset = Vec_PtrAlloc( nLutSize );
475 if ( nBaseSizeAll + nBaseSize > nLutSize && Vec_PtrSize(vSubset) > 1 )
477 nBaseSizeAll += nBaseSize;
478 Vec_PtrPush( vSubset, pObj );
481 Vec_PtrShrink( vSuper, Vec_PtrSize(vSuper) - Vec_PtrSize(vSubset) );
484 Vec_PtrFree( vSubset );
488 return (
Aig_Obj_t *)Vec_PtrEntry(vSuper, 0);
507 assert( !Aig_IsComplement(pObjOld) );
508 assert( !Aig_ObjIsBuf(pObjOld) );
510 if ( pObjOld->
pData )
512 assert( Aig_ObjIsNode(pObjOld) );
516 if ( vSuper->nSize == 0 )
519 for ( i = 0; i < Vec_PtrSize(vSuper); i++ )
522 if ( pObjNew == NULL )
524 vSuper->pArray[i] = Aig_NotCond( pObjNew, Aig_IsComplement((
Aig_Obj_t *)vSuper->pArray[i]) );
527 if ( vSuper->nSize == 1 )
528 return (
Aig_Obj_t *)Vec_PtrEntry(vSuper, 0);
530#ifdef USE_LUTSIZE_BALANCE
535 if ( pNew->Time2Quit && !(Aig_Regular(pObjNew)->Id & 255) && Abc_Clock() > pNew->Time2Quit )
563 pNew->pName = Abc_UtilStrsav(
p->pName );
564 pNew->pSpec = Abc_UtilStrsav(
p->pSpec );
565 pNew->nAsserts =
p->nAsserts;
566 pNew->nConstrs =
p->nConstrs;
567 pNew->nBarBufs =
p->nBarBufs;
568 pNew->Time2Quit =
p->Time2Quit;
570 pNew->vFlopNums = Vec_IntDup(
p->vFlopNums );
573 Aig_ManConst1(
p)->pData = Aig_ManConst1(pNew);
574 vStore = Vec_VecAlloc( 50 );
575 if (
p->pManTime != NULL )
582 if ( Aig_ObjIsNode(pObj) || Aig_ObjIsConst1(pObj) )
584 if ( Aig_ObjIsCi(pObj) )
588 pObj->
pData = pObjNew;
591 pObjNew->
Level = (int)arrTime;
593 else if ( Aig_ObjIsCo(pObj) )
597 pObjNew =
Dar_Balance_rec( pNew, Aig_Regular(pDriver), vStore, 0, fUpdateLevel );
598 if ( pObjNew == NULL )
600 Vec_VecFree( vStore );
604 pObjNew = Aig_NotCond( pObjNew, Aig_IsComplement(pDriver) );
606 arrTime = (float)Aig_Regular(pObjNew)->Level;
623 pObj->
pData = pObjNew;
625 if (
p->nBarBufs == 0 )
630 pObjNew =
Dar_Balance_rec( pNew, Aig_Regular(pDriver), vStore, 0, fUpdateLevel );
631 if ( pObjNew == NULL )
633 Vec_VecFree( vStore );
637 pObjNew = Aig_NotCond( pObjNew, Aig_IsComplement(pDriver) );
643 Vec_Ptr_t * vLits = Vec_PtrStart( Aig_ManCoNum(
p) );
646 int k = i <
p->nBarBufs ? Aig_ManCoNum(
p) -
p->nBarBufs + i : i -
p->nBarBufs;
647 pObj = Aig_ManCo(
p, k );
649 pObjNew =
Dar_Balance_rec( pNew, Aig_Regular(pDriver), vStore, 0, fUpdateLevel );
650 if ( pObjNew == NULL )
652 Vec_VecFree( vStore );
656 pObjNew = Aig_NotCond( pObjNew, Aig_IsComplement(pDriver) );
657 Vec_PtrWriteEntry( vLits, k, pObjNew );
658 if ( i < p->nBarBufs )
659 Aig_ManCi(pNew, Aig_ManCiNum(
p) -
p->nBarBufs + i)->Level = Aig_Regular(pObjNew)->Level;
666 Vec_VecFree( vStore );
672 printf(
"Dar_ManBalance(): The check has failed.\n" );
721 if ( Aig_ManExorNum(
p) == 0 )
723 printf(
"There is no EXOR gates.\n" );
728 Aig_ObjFanin0(pObj)->fMarkA = 1;
729 Aig_ObjFanin1(pObj)->fMarkA = 1;
730 assert( !Aig_ObjFaninC0(pObj) );
731 assert( !Aig_ObjFaninC1(pObj) );
733 vSuper = Vec_PtrAlloc( 1000 );
738 Vec_PtrClear( vSuper );
742 if ( Vec_PtrSize(vSuper) < 3 )
744 printf(
" %d(", Vec_PtrSize(vSuper) );
746 printf(
" %d", pTemp->
Level );
749 Vec_PtrFree( vSuper );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
Aig_Man_t * Aig_ManDupExor(Aig_Man_t *p)
void Aig_ManSetCioIds(Aig_Man_t *p)
int Aig_ManVerifyTopoOrder(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachObj(p, pObj, i)
void Aig_ManStop(Aig_Man_t *p)
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
Aig_Obj_t * Aig_Oper(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1, Aig_Type_t Type)
void Aig_ManCleanCioIds(Aig_Man_t *p)
int Aig_SupportSize(Aig_Man_t *p, Aig_Obj_t *pObj)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
#define Aig_ManForEachCo(p, pObj, i)
Aig_Obj_t * Aig_TableLookup(Aig_Man_t *p, Aig_Obj_t *pGhost)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
Aig_Obj_t * Aig_ObjReal_rec(Aig_Obj_t *pObj)
void Aig_ManCleanData(Aig_Man_t *p)
#define Aig_ManForEachExor(p, pObj, i)
ABC_DLL int Aig_ManCheck(Aig_Man_t *p)
FUNCTION DECLARATIONS ///.
Aig_Obj_t * Dar_BalanceBuildSuper(Aig_Man_t *p, Vec_Ptr_t *vSuper, Aig_Type_t Type, int fUpdateLevel)
Aig_Man_t * Dar_ManBalanceXor(Aig_Man_t *pAig, int fExor, int fUpdateLevel, int fVerbose)
Vec_Ptr_t * Dar_BalanceCone(Aig_Obj_t *pObj, Vec_Vec_t *vStore, int Level)
Aig_Obj_t * Dar_BalanceBuildSuperTop(Aig_Man_t *p, Vec_Ptr_t *vSuper, Aig_Type_t Type, int fUpdateLevel, int nLutSize)
void Dar_BalanceUniqify(Aig_Obj_t *pObj, Vec_Ptr_t *vNodes, int fExor)
Aig_Man_t * Dar_ManBalance(Aig_Man_t *p, int fUpdateLevel)
void Dar_BalancePermute(Aig_Man_t *p, Vec_Ptr_t *vSuper, int LeftBound, int fExor)
int Aig_BaseSize(Aig_Man_t *p, Aig_Obj_t *pObj, int nLutSize)
void Dar_BalancePrintStats(Aig_Man_t *p)
ABC_NAMESPACE_IMPL_START int Dar_ObjCompareLits(Aig_Obj_t **pp1, Aig_Obj_t **pp2)
DECLARATIONS ///.
void Dar_BalanceCone_rec(Aig_Obj_t *pRoot, Aig_Obj_t *pObj, Vec_Ptr_t *vSuper)
void Dar_BalancePushUniqueOrderByLevel(Vec_Ptr_t *vStore, Aig_Obj_t *pObj, int fExor)
int Dar_BalanceFindLeft(Vec_Ptr_t *vSuper)
Aig_Obj_t * Dar_Balance_rec(Aig_Man_t *pNew, Aig_Obj_t *pObjOld, Vec_Vec_t *vStore, int Level, int fUpdateLevel)
int Aig_NodeCompareLevelsDecrease(Aig_Obj_t **pp1, Aig_Obj_t **pp2)
void Tim_ManSetCoArrival(Tim_Man_t *p, int iCo, float Delay)
typedefABC_NAMESPACE_HEADER_START struct Tim_Man_t_ Tim_Man_t
INCLUDES ///.
void Tim_ManIncrementTravId(Tim_Man_t *p)
DECLARATIONS ///.
Tim_Man_t * Tim_ManDup(Tim_Man_t *p, int fUnitDelay)
float Tim_ManGetCiArrival(Tim_Man_t *p, int iCi)
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)
#define Vec_PtrForEachEntryReverse(Type, vVec, pEntry, i)
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 ///.