32static int Ivy_NodeCountMffc(
Ivy_Obj_t * pNode );
52 Vec_Ptr_t * vFront, * vLeaves, * vCone, * vSol;
54 int i, RetValue, LevelR, nNodesOld;
55 int CountUsed, CountUndo;
57 vFront = Vec_PtrAlloc( 100 );
58 vLeaves = Vec_PtrAlloc( 100 );
59 vCone = Vec_PtrAlloc( 100 );
60 vSol = Vec_PtrAlloc( 100 );
62 CountUsed = CountUndo = 0;
63 nNodesOld = Ivy_ManObjIdNext(
p);
66 assert( !Ivy_ObjIsBuf(pObj) );
74 if ( pObj->
Id == 297 )
79 RetValue = Ivy_ManFindAlgCut( pObj, vFront, vLeaves, vCone );
89 assert( Vec_PtrSize(vLeaves) > 2 );
91 LevelR = vRequired? Vec_IntEntry(vRequired, pObj->
Id) : 1000000;
93 pResult = Ivy_NodeRewriteAlg( pObj, vFront, vLeaves, vCone, vSol, LevelR, fUseZeroCost );
94 if ( pResult == NULL || pResult == pObj )
96 assert( Vec_PtrSize(vSol) == 1 || !Ivy_IsComplement(pResult) );
97 if ( Ivy_ObjLevel(Ivy_Regular(pResult)) > LevelR && Ivy_ObjRefs(Ivy_Regular(pResult)) == 0 )
102 printf(
"Used = %d. Undo = %d.\n", CountUsed, CountUndo );
103 Vec_PtrFree( vFront );
104 Vec_PtrFree( vCone );
106 if ( vRequired ) Vec_IntFree( vRequired );
108 printf(
"Cleanup after rewriting removed %d dangling nodes.\n", i );
110 printf(
"Ivy_ManRewriteAlg(): The check has failed.\n" );
129 int k, Counter, nMffc, RetValue;
133 if ( Ivy_ObjIsExor(pObj) )
147 if ( Ivy_ObjIsExor(pObj) )
155 Ivy_ObjRefsDec( Ivy_ObjFanin0(pTemp) );
156 Ivy_ObjRefsDec( Ivy_ObjFanin1(pTemp) );
162 Ivy_Regular(pTemp)->fMarkA = 1;
163 nMffc = Ivy_NodeCountMffc( pObj );
165 Ivy_Regular(pTemp)->fMarkA = 0;
171 Counter += (Ivy_ObjRefs(pTemp) > 0);
172 printf(
"%5d : Leaves = %2d. Cone = %2d. ConeRef = %2d. Mffc = %d. Lev = %d. LevR = %d.\n",
173 pObj->
Id, Vec_PtrSize(vFront), Vec_PtrSize(vCone), Counter-1, nMffc, Ivy_ObjLevel(pObj), LevelR );
187 RetValue =
Ivy_MultiPlus( vLeaves, vCone, Ivy_ObjType(pObj), nMffc + fUseZeroCost, vSols );
192 Ivy_ObjRefsInc( Ivy_ObjFanin0(pTemp) );
193 Ivy_ObjRefsInc( Ivy_ObjFanin1(pTemp) );
201 if ( Vec_PtrSize( vSols ) == 1 )
202 return Vec_PtrEntry( vSols, 0 );
219 if ( Ivy_ObjRefs(pNode) > 0 || Ivy_ObjIsCi(pNode) || pNode->
fMarkA )
224 if ( Ivy_ObjIsBuf(pNode) )
240int Ivy_NodeCountMffc(
Ivy_Obj_t * pNode )
281 int RetValue0, RetValue1;
283 assert( !Ivy_ObjIsBuf(pObjR) );
287 if ( Ivy_IsComplement(pObj) )
299 Vec_PtrPush( vCone, pObjR );
302 if ( Ivy_IsComplement(pObj) || Ivy_ObjType(pObj) != Type )
304 if ( Ivy_ObjRefs(pObjR) == 1 )
306 assert( Ivy_ObjRefs(pObjR) > 1 );
307 Vec_PtrPush( vFront, pObj );
312 assert( !Ivy_IsComplement(pObj) );
313 assert( Ivy_ObjIsNode(pObj) );
317 if ( RetValue0 == -1 || RetValue1 == -1 )
321 if ( RetValue0 && RetValue1 )
323 if ( Ivy_ObjRefs(pObj) == 1 )
325 assert( Ivy_ObjRefs(pObj) > 1 );
326 Vec_PtrPush( vFront, pObj );
331 Vec_PtrPush( vFront,
Ivy_ObjReal( Ivy_ObjChild0(pObj) ) );
333 Vec_PtrPush( vFront,
Ivy_ObjReal( Ivy_ObjChild1(pObj) ) );
354 assert( !Ivy_IsComplement(pRoot) );
355 assert( Ivy_ObjIsNode(pRoot) );
357 Vec_PtrClear( vCone );
358 Vec_PtrClear( vFront );
359 Vec_PtrClear( vLeaves );
365 if ( RetValue == -1 )
371 if ( Vec_PtrSize(vFront) <= 2 )
376 pPrev = Vec_PtrEntry(vFront, 0);
377 Vec_PtrPush( vLeaves, pPrev );
383 if ( Ivy_ObjIsExor(pRoot) )
387 pPrev = Vec_PtrSize(vLeaves) == 0 ? NULL : Vec_PtrEntryLast(vLeaves);
391 if ( pObj == Ivy_Not(pPrev) )
393 assert( Ivy_ObjIsAnd(pRoot) );
397 Vec_PtrPush( vLeaves, pObj );
399 if ( Vec_PtrSize(vLeaves) == 0 )
401 if ( Vec_PtrSize(vLeaves) <= 2 )
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int Ivy_NodeCountMffc_rec(Ivy_Obj_t *pNode)
int Ivy_ManFindAlgCutCompare(Ivy_Obj_t **pp1, Ivy_Obj_t **pp2)
int Ivy_ManFindAlgCut_rec(Ivy_Obj_t *pObj, Ivy_Type_t Type, Vec_Ptr_t *vFront, Vec_Ptr_t *vCone)
int Ivy_ManRewriteAlg(Ivy_Man_t *p, int fUpdateLevel, int fUseZeroCost)
FUNCTION DEFINITIONS ///.
int Ivy_MultiPlus(Ivy_Man_t *p, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vCone, Ivy_Type_t Type, int nLimit, Vec_Ptr_t *vSol)
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_NodeBalanceBuildSuper(Ivy_Man_t *p, Vec_Ptr_t *vSuper, Ivy_Type_t Type, int fUpdateLevel)
Vec_Int_t * Ivy_ManRequiredLevels(Ivy_Man_t *p)
int Ivy_ManCleanup(Ivy_Man_t *p)
#define Ivy_ManForEachObj(p, pObj, i)
Ivy_Obj_t * Ivy_ObjReal(Ivy_Obj_t *pObj)
struct Ivy_Obj_t_ Ivy_Obj_t
void Ivy_ObjReplace(Ivy_Man_t *p, Ivy_Obj_t *pObjOld, Ivy_Obj_t *pObjNew, int fDeleteOld, int fFreeTop, int fUpdateLevel)
int Ivy_ObjIsMuxType(Ivy_Obj_t *pObj)
void Ivy_ObjDelete_rec(Ivy_Man_t *p, Ivy_Obj_t *pObj, int fFreeTop)
void Ivy_ManCollectCone(Ivy_Obj_t *pObj, Vec_Ptr_t *vFront, Vec_Ptr_t *vCone)
#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 ///.