40static inline int Nwk_ObjSetPred(
Nwk_Obj_t * pObj,
Nwk_Obj_t *
p ) { pObj->pCopy =
p;
return 1; }
42static inline int Nwk_ObjIsSink(
Nwk_Obj_t * pObj ) {
return pObj->MarkA; }
43static inline void Nwk_ObjSetSink(
Nwk_Obj_t * pObj ) { pObj->MarkA = 1; }
45static inline int Nwk_ObjHasFlow(
Nwk_Obj_t * pObj ) {
return pObj->MarkB; }
46static inline void Nwk_ObjSetFlow(
Nwk_Obj_t * pObj ) { pObj->MarkB = 1; }
47static inline void Nwk_ObjClearFlow(
Nwk_Obj_t * pObj ) { pObj->MarkB = 0; }
54static inline int Nwk_ObjVisitedBotOnly(
Nwk_Obj_t * pObj )
56 return pObj->TravId == pObj->pMan->nTravIds - 2;
58static inline int Nwk_ObjVisitedBot(
Nwk_Obj_t * pObj )
60 return pObj->TravId == pObj->pMan->nTravIds - 2 || pObj->TravId == pObj->pMan->nTravIds;
62static inline int Nwk_ObjVisitedTop(
Nwk_Obj_t * pObj )
64 return pObj->TravId == pObj->pMan->nTravIds - 1 || pObj->TravId == pObj->pMan->nTravIds;
66static inline void Nwk_ObjSetVisitedBot(
Nwk_Obj_t * pObj )
68 if ( pObj->TravId < pObj->pMan->nTravIds - 2 )
69 pObj->TravId = pObj->pMan->nTravIds - 2;
70 else if ( pObj->TravId == pObj->pMan->nTravIds - 1 )
71 pObj->TravId = pObj->pMan->nTravIds;
75static inline void Nwk_ObjSetVisitedTop(
Nwk_Obj_t * pObj )
77 if ( pObj->TravId < pObj->pMan->nTravIds - 2 )
78 pObj->TravId = pObj->pMan->nTravIds - 1;
79 else if ( pObj->TravId == pObj->pMan->nTravIds - 2 )
80 pObj->TravId = pObj->pMan->nTravIds;
84static inline void Nwk_ManIncrementTravIdFlow(
Nwk_Man_t * pMan )
160 if ( Nwk_ObjIsTravIdCurrent( pObj ) )
162 Nwk_ObjSetTravIdCurrent( pObj );
163 if ( Nwk_ObjHasFlow(pObj) )
165 if ( Nwk_ObjIsSink(pObj) )
167 Nwk_ObjSetFlow(pObj);
168 return Nwk_ObjSetPred( pObj, pPred );
173 Nwk_ObjSetFlow(pObj);
174 return Nwk_ObjSetPred( pObj, pPred );
194 if ( Nwk_ObjIsTravIdCurrent( pObj ) )
196 Nwk_ObjSetTravIdCurrent( pObj );
197 if ( Nwk_ObjHasFlow(pObj) )
199 if ( Nwk_ObjIsSink(pObj) )
201 Nwk_ObjSetFlow(pObj);
202 return Nwk_ObjSetPred( pObj, pPred );
207 Nwk_ObjSetFlow(pObj);
208 return Nwk_ObjSetPred( pObj, pPred );
228 if ( Nwk_ObjVisitedBot(pObj) )
230 Nwk_ObjSetVisitedBot(pObj);
232 if ( Nwk_ObjHasFlow(pObj) )
234 if ( Nwk_ObjPred(pObj) )
235 if ( Nwk_ManPushForwardTop_rec( Nwk_ObjPred(pObj), Nwk_ObjPred(pObj) ) )
236 return Nwk_ObjSetPred( pObj, pPred );
238 else if ( Nwk_ManPushForwardTop_rec(pObj, pObj) )
240 Nwk_ObjSetFlow( pObj );
241 return Nwk_ObjSetPred( pObj, pPred );
245 if ( Nwk_ManPushForwardBot_rec( pNext, pPred ) )
265 if ( Nwk_ObjVisitedTop(pObj) )
267 Nwk_ObjSetVisitedTop(pObj);
269 if ( Nwk_ObjIsSink(pObj) )
273 if ( Nwk_ManPushForwardBot_rec( pNext, pPred ) )
276 if ( Nwk_ObjHasFlow(pObj) && !Nwk_ObjIsCi(pObj) )
277 if ( Nwk_ManPushForwardBot_rec( pObj, Nwk_ObjPred(pObj) ) )
279 Nwk_ObjClearFlow( pObj );
280 return Nwk_ObjSetPred( pObj, NULL );
298 if ( Nwk_ObjVisitedBot(pObj) )
300 Nwk_ObjSetVisitedBot(pObj);
302 if ( Nwk_ObjHasFlow(pObj) )
304 if ( Nwk_ObjPred(pObj) )
305 if ( Nwk_ManPushBackwardTop_rec( Nwk_ObjPred(pObj), Nwk_ObjPred(pObj) ) )
306 return Nwk_ObjSetPred( pObj, pPred );
308 else if ( Nwk_ManPushBackwardTop_rec(pObj, pObj) )
310 Nwk_ObjSetFlow( pObj );
311 return Nwk_ObjSetPred( pObj, pPred );
331 if ( Nwk_ObjVisitedTop(pObj) )
333 Nwk_ObjSetVisitedTop(pObj);
335 if ( Nwk_ObjIsSink(pObj) )
339 if ( Nwk_ManPushBackwardBot_rec( pNext, pPred ) )
343 if ( !Nwk_ObjIsCo(pObj) && Nwk_ManPushBackwardTop_rec( pNext, pPred ) )
346 if ( Nwk_ObjHasFlow(pObj) )
347 if ( Nwk_ObjPred(pObj) && Nwk_ManPushBackwardBot_rec( pObj, Nwk_ObjPred(pObj) ) )
349 Nwk_ObjClearFlow( pObj );
350 return Nwk_ObjSetPred( pObj, NULL );
372 if ( Nwk_ObjIsLo(pObj) )
374 if ( Nwk_ObjIsTravIdCurrent( pObj ) )
376 Nwk_ObjSetTravIdCurrent( pObj );
401 assert( pObj->MarkA == 0 );
408 printf(
"Nwk_ManRetimeVerifyCutForward(): Internal cut verification failed.\n" );
446 int i, RetValue, Counter = 0, Counter2 = 0;
450 pMan->
nTruePis = Nwk_ManCiNum(pMan) - nLatches;
451 pMan->
nTruePos = Nwk_ManCoNum(pMan) - nLatches;
458 Nwk_ManIncrementTravIdFlow( pMan );
463 Nwk_ManIncrementTravIdFlow( pMan );
467 printf(
"Forward: Max-flow = %4d -> ", Counter );
469 Nwk_ManIncrementTravIdFlow( pMan );
472 if ( !Nwk_ManPushForwardBot_rec( pObj, NULL ) )
474 Nwk_ManIncrementTravIdFlow( pMan );
478 printf(
"%4d. ", Counter+Counter2 );
482 Nwk_ManIncrementTravIdFlow( pMan );
485 RetValue = Nwk_ManPushForwardBot_rec( pObj, NULL );
490 vNodes = Vec_PtrAlloc( Counter+Counter2 );
494 if ( Nwk_ObjVisitedBotOnly(pObj) )
496 assert( Nwk_ObjHasFlow(pObj) );
497 assert( !Nwk_ObjIsCo(pObj) );
498 Vec_PtrPush( vNodes, pObj );
499 Counter += Nwk_ObjIsCi(pObj);
506 printf(
"Min-cut = %4d. Unmoved = %4d. ", Vec_PtrSize(vNodes), Counter );
507 ABC_PRT(
"Time", Abc_Clock() - clk );
527 int i, RetValue, Counter = 0, Counter2 = 0;
531 pMan->
nTruePis = Nwk_ManCiNum(pMan) - nLatches;
532 pMan->
nTruePos = Nwk_ManCoNum(pMan) - nLatches;
539 if ( Nwk_ObjFaninNum(pObj) == 0 )
542 Nwk_ManIncrementTravIdFlow( pMan );
547 Nwk_ManIncrementTravIdFlow( pMan );
551 printf(
"Backward: Max-flow = %4d -> ", Counter );
553 Nwk_ManIncrementTravIdFlow( pMan );
556 if ( !Nwk_ManPushBackwardBot_rec( Nwk_ObjFanin0(pObj), NULL ) )
558 Nwk_ManIncrementTravIdFlow( pMan );
562 printf(
"%4d. ", Counter+Counter2 );
566 Nwk_ManIncrementTravIdFlow( pMan );
569 RetValue = Nwk_ManPushBackwardBot_rec( Nwk_ObjFanin0(pObj), NULL );
574 vNodes = Vec_PtrAlloc( Counter+Counter2 );
577 if ( Nwk_ObjVisitedBotOnly(pObj) )
579 assert( Nwk_ObjHasFlow(pObj) );
580 assert( !Nwk_ObjIsCo(pObj) );
581 Vec_PtrPush( vNodes, pObj );
587 if ( Nwk_ObjVisitedBotOnly( Nwk_ObjFanin0(pObj) ) )
593 printf(
"Min-cut = %4d. Unmoved = %4d. ", Vec_PtrSize(vNodes), Counter );
594 ABC_PRT(
"Time", Abc_Clock() - clk );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
struct Nwk_Man_t_ Nwk_Man_t
int Nwk_ManPushBackwardFast_rec(Nwk_Obj_t *pObj, Nwk_Obj_t *pPred)
int Nwk_ManRetimeVerifyCutForward(Nwk_Man_t *pMan, Vec_Ptr_t *vNodes)
Vec_Ptr_t * Nwk_ManRetimeCutBackward(Nwk_Man_t *pMan, int nLatches, int fVerbose)
Vec_Ptr_t * Nwk_ManRetimeCutForward(Nwk_Man_t *pMan, int nLatches, int fVerbose)
void Nwk_ManMarkTfiCone_rec(Nwk_Obj_t *pObj)
FUNCTION DEFINITIONS ///.
int Nwk_ManVerifyCut_rec(Nwk_Obj_t *pObj)
int Nwk_ManPushForwardFast_rec(Nwk_Obj_t *pObj, Nwk_Obj_t *pPred)
int Nwk_ManRetimeVerifyCutBackward(Nwk_Man_t *pMan, Vec_Ptr_t *vNodes)
void Nwk_ManMarkTfoCone_rec(Nwk_Obj_t *pObj)
ABC_DLL void Nwk_ManIncrementTravId(Nwk_Man_t *pNtk)
DECLARATIONS ///.
#define Nwk_ManForEachNode(p, pObj, i)
#define Nwk_ManForEachCi(p, pObj, i)
ITERATORS ///.
#define Nwk_ManForEachLoSeq(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Nwk_Obj_t_ Nwk_Obj_t
INCLUDES ///.
#define Nwk_ManForEachPoSeq(p, pObj, i)
#define Nwk_ManForEachObj(p, pObj, i)
#define Nwk_ObjForEachFanout(pObj, pFanout, i)
#define Nwk_ManForEachCo(p, pObj, i)
#define Nwk_ObjForEachFanin(pObj, pFanin, i)
ABC_DLL void Nwk_ManCleanMarks(Nwk_Man_t *pNtk)
#define Nwk_ManForEachLiSeq(p, pObj, i)
#define Nwk_ManForEachPiSeq(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.