47 int i, iFanin, Value, Count;
48 if ( Sfm_ObjIsPi(
p, iObj) )
50 assert( Sfm_ObjIsNode(
p, iObj) );
51 Value = Sfm_ObjRefIncrement(
p, iObj);
62 int i, iFanin, Count = 1;
69 int i, iFanin, Value, Count;
70 if ( Sfm_ObjIsPi(
p, iObj) )
72 assert( Sfm_ObjIsNode(
p, iObj) );
73 Value = Sfm_ObjRefDecrement(
p, iObj);
84 int i, iFanin, Count = 1;
92 if ( Sfm_ObjIsPi(
p, iObj) )
94 if ( Sfm_ObjFanoutNum(
p, iObj) != 1 )
96 assert( Sfm_ObjIsNode(
p, iObj ) );
99 assert( Count1 == Count2 );
114static inline void Sfm_NtkIncrementTravId(
Sfm_Ntk_t *
p ) {
p->nTravIds++; }
115static inline void Sfm_ObjSetTravIdCurrent(
Sfm_Ntk_t *
p,
int Id ) { Vec_IntWriteEntry( &
p->vTravIds, Id,
p->nTravIds ); }
116static inline int Sfm_ObjIsTravIdCurrent(
Sfm_Ntk_t *
p,
int Id ) {
return (Vec_IntEntry(&
p->vTravIds, Id) ==
p->nTravIds); }
117static inline int Sfm_ObjIsTravIdPrevious(
Sfm_Ntk_t *
p,
int Id ) {
return (Vec_IntEntry(&
p->vTravIds, Id) ==
p->nTravIds-1); }
119static inline void Sfm_NtkIncrementTravId2(
Sfm_Ntk_t *
p ) {
p->nTravIds2++; }
120static inline void Sfm_ObjSetTravIdCurrent2(
Sfm_Ntk_t *
p,
int Id ) { Vec_IntWriteEntry( &
p->vTravIds2, Id,
p->nTravIds2 ); }
121static inline int Sfm_ObjIsTravIdCurrent2(
Sfm_Ntk_t *
p,
int Id ) {
return (Vec_IntEntry(&
p->vTravIds2, Id) ==
p->nTravIds2); }
139 if ( Sfm_ObjIsPi(
p, iNode) )
141 if ( Sfm_ObjIsTravIdCurrent(
p, iNode) )
143 if ( Vec_IntEntry(vGroupMap, iNode) >= 0 )
145 int k, iGroup = Abc_Lit2Var( Vec_IntEntry(vGroupMap, iNode) );
146 Vec_Int_t * vGroup = Vec_WecEntry( vGroups, iGroup );
148 assert( Sfm_ObjIsNode(
p, iNode) );
150 Sfm_ObjSetTravIdCurrent(
p, iNode );
155 Vec_IntPush( vNodes, iNode );
156 Vec_IntPush( vBoxesLeft, iGroup );
160 Sfm_ObjSetTravIdCurrent(
p, iNode);
163 Vec_IntPush( vNodes, iNode );
170 Vec_IntClear( vBoxesLeft );
171 vNodes = Vec_IntAlloc(
p->nObjs );
172 Sfm_NtkIncrementTravId(
p );
177 Sfm_NtkDfs_rec(
p, Vec_IntEntry(vGroup, 0), vNodes, vGroups, vGroupMap, vBoxesLeft );
180 Sfm_NtkDfs_rec(
p, Sfm_ObjFanin(
p, i, 0), vNodes, vGroups, vGroupMap, vBoxesLeft );
198 if ( Sfm_ObjIsTravIdCurrent2(
p, iThis) || iThis == iNode )
201 if ( Sfm_ObjIsTravIdPrevious(
p, iThis) )
203 Sfm_ObjSetTravIdCurrent2(
p, iThis);
211 Sfm_NtkIncrementTravId2(
p );
226static inline int Sfm_NtkCheckRoot(
Sfm_Ntk_t *
p,
int iNode,
int nLevelMax )
231 if ( Sfm_ObjFanoutNum(
p, iNode) == 0 || Sfm_ObjFanoutNum(
p, iNode) >
p->pPars->nFanoutMax )
236 if ( Sfm_ObjIsPo(
p, iFanout) || Sfm_ObjLevel(
p, iFanout) > nLevelMax )
243 assert( Sfm_ObjIsNode(
p, iNode) );
244 if ( Sfm_ObjIsTravIdCurrent(
p, iNode) )
246 Sfm_ObjSetTravIdCurrent(
p, iNode);
247 if ( iNode !=
p->iPivotNode )
248 Vec_IntPush( vTfo, iNode );
250 if ( Sfm_NtkCheckRoot(
p, iNode, nLevelMax ) )
251 Vec_IntPush( vRoots, iNode );
274 if (
p->pPars->nFanoutMax && i >
p->pPars->nFanoutMax )
277 if ( Sfm_ObjIsTravIdCurrent(
p, iFanout) || Sfm_ObjIsPo(
p, iFanout) || Sfm_ObjLevel(
p, iFanout) > nLevelMax )
280 if ( Sfm_ObjFaninNum(
p, iFanout) == 1 )
281 Vec_IntPush(
p->vDivs, iFanout );
283 else if ( !Sfm_ObjIsTravIdCurrent2(
p, iFanout) )
285 assert( Sfm_ObjFaninNum(
p, iFanout) > 1 );
286 Sfm_ObjSetTravIdCurrent2(
p, iFanout );
287 Sfm_ObjResetFaninCount(
p, iFanout );
290 else if ( Sfm_ObjUpdateFaninCount(
p, iFanout) == 0 )
291 Vec_IntPush(
p->vDivs, iFanout );
306static inline int Sfm_ObjIsUseful(
Sfm_Ntk_t *
p,
int iNode )
309 if ( !Sfm_ObjIsFixed(
p, iNode) )
312 if ( !Sfm_ObjIsFixed(
p, iFanout) )
331 if ( Sfm_ObjIsTravIdCurrent(
p, iNode ) )
333 Sfm_ObjSetTravIdCurrent(
p, iNode );
337 Vec_IntPush( vNodes, iNode );
338 return p->pPars->nWinSizeMax && (Vec_IntSize(vNodes) >
p->pPars->nWinSizeMax);
343 abctime clkDiv, clkWin = Abc_Clock();
345 assert( Sfm_ObjIsNode(
p, iNode ) );
346 p->iPivotNode = iNode;
347 Vec_IntClear(
p->vNodes );
348 Vec_IntClear(
p->vDivs );
349 Vec_IntClear(
p->vRoots );
350 Vec_IntClear(
p->vTfo );
351 Vec_IntClear(
p->vOrder );
354 Sfm_NtkIncrementTravId(
p );
358 p->timeWin += Abc_Clock() - clkWin;
363 clkDiv = Abc_Clock();
364 Vec_IntClear(
p->vDivs );
365 Vec_IntAppend(
p->vDivs,
p->vNodes );
366 Vec_IntPop(
p->vDivs );
368 if ( !
p->pPars->nWinSizeMax || Vec_IntSize(
p->vDivs) <
p->pPars->nWinSizeMax + 0 )
370 Sfm_NtkIncrementTravId2(
p );
372 if ( !
p->pPars->nWinSizeMax || Vec_IntSize(
p->vDivs) <
p->pPars->nWinSizeMax + 0 )
376 if (
p->pPars->nWinSizeMax && Vec_IntSize(
p->vDivs) >
p->pPars->nWinSizeMax )
384 Vec_IntShrink(
p->vDivs,
p->pPars->nWinSizeMax );
386 assert( !
p->pPars->nWinSizeMax || Vec_IntSize(
p->vDivs) <=
p->pPars->nWinSizeMax );
387 p->nMaxDivs += (int)(
p->pPars->nWinSizeMax && Vec_IntSize(
p->vDivs) ==
p->pPars->nWinSizeMax);
390 Sfm_NtkIncrementTravId2(
p );
391 Sfm_ObjSetTravIdCurrent2(
p, iNode );
393 Sfm_ObjSetTravIdCurrent2(
p, iTemp );
397 if ( !Sfm_ObjIsTravIdCurrent2(
p, iTemp) && Sfm_ObjIsUseful(
p, iTemp) )
398 Vec_IntWriteEntry(
p->vDivs, k++, iTemp );
399 Vec_IntShrink(
p->vDivs, k );
400 assert( !
p->pPars->nWinSizeMax || Vec_IntSize(
p->vDivs) <=
p->pPars->nWinSizeMax );
401 clkDiv = Abc_Clock() - clkDiv;
402 p->timeDiv += clkDiv;
403 p->nTotalDivs += Vec_IntSize(
p->vDivs);
406 if (
p->pPars->nTfoLevMax > 0 && !Sfm_NtkCheckRoot(
p, iNode, Sfm_ObjLevel(
p, iNode) +
p->pPars->nTfoLevMax) )
409 Sfm_NtkIncrementTravId(
p );
411 assert( Vec_IntSize(
p->vRoots) > 0 );
412 assert( Vec_IntSize(
p->vTfo) > 0 );
414 Sfm_NtkIncrementTravId(
p );
418 Vec_IntClear(
p->vRoots );
419 Vec_IntClear(
p->vTfo );
420 Vec_IntClear(
p->vOrder );
423 if ( Vec_IntSize(
p->vRoots) > 0 )
427 Vec_IntClear(
p->vRoots );
428 Vec_IntClear(
p->vTfo );
429 Vec_IntClear(
p->vOrder );
432 if ( Vec_IntSize(
p->vRoots) > 0 )
436 Vec_IntClear(
p->vRoots );
437 Vec_IntClear(
p->vTfo );
438 Vec_IntClear(
p->vOrder );
443 if ( Vec_IntSize(
p->vOrder) == 0 )
445 int Temp =
p->pPars->nWinSizeMax;
446 p->pPars->nWinSizeMax = 0;
447 Sfm_NtkIncrementTravId(
p );
451 p->pPars->nWinSizeMax = Temp;
455 p->timeWin += Abc_Clock() - clkWin - clkDiv;
460 printf(
"%6d : ", iNode );
461 printf(
"Leaves = %5d. ", 0 );
462 printf(
"Nodes = %5d. ", Vec_IntSize(
p->vNodes) );
463 printf(
"Roots = %5d. ", Vec_IntSize(
p->vRoots) );
464 printf(
"Divs = %5d. ", Vec_IntSize(
p->vDivs) );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Sfm_ObjForEachFanin(p, Node, Fan, i)
#define Sfm_NtkForEachPo(p, i)
#define Sfm_NtkForEachNode(p, i)
#define Sfm_ObjForEachFanout(p, Node, Fan, i)
int Sfm_NtkCreateWindow(Sfm_Ntk_t *p, int iNode, int fVerbose)
int Sfm_ObjDeref(Sfm_Ntk_t *p, int iObj)
void Sfm_NtkWindowTest(Sfm_Ntk_t *p, int iNode)
ABC_NAMESPACE_IMPL_START int Sfm_ObjRef_rec(Sfm_Ntk_t *p, int iObj)
DECLARATIONS ///.
void Sfm_NtkDfs_rec(Sfm_Ntk_t *p, int iNode, Vec_Int_t *vNodes, Vec_Wec_t *vGroups, Vec_Int_t *vGroupMap, Vec_Int_t *vBoxesLeft)
int Sfm_NtkCheckOverlap_rec(Sfm_Ntk_t *p, int iThis, int iNode)
int Sfm_ObjDeref_rec(Sfm_Ntk_t *p, int iObj)
int Sfm_NtkCollectTfi_rec(Sfm_Ntk_t *p, int iNode, Vec_Int_t *vNodes)
Vec_Int_t * Sfm_NtkDfs(Sfm_Ntk_t *p, Vec_Wec_t *vGroups, Vec_Int_t *vGroupMap, Vec_Int_t *vBoxesLeft, int fAllBoxes)
void Sfm_NtkComputeRoots_rec(Sfm_Ntk_t *p, int iNode, int nLevelMax, Vec_Int_t *vRoots, Vec_Int_t *vTfo)
int Sfm_NtkCheckOverlap(Sfm_Ntk_t *p, int iFan, int iNode)
void Sfm_NtkAddDivisors(Sfm_Ntk_t *p, int iNode, int nLevelMax)
int Sfm_ObjMffcSize(Sfm_Ntk_t *p, int iObj)
int Sfm_ObjRef(Sfm_Ntk_t *p, int iObj)
typedefABC_NAMESPACE_HEADER_START struct Sfm_Ntk_t_ Sfm_Ntk_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.