42static inline int Nwk_ObjSetPred(
Nwk_Obj_t * pObj,
Nwk_Obj_t *
p ) { pObj->pCopy =
p;
return 1; }
44static inline int Nwk_ObjIsSink(
Nwk_Obj_t * pObj ) {
return pObj->MarkA; }
45static inline void Nwk_ObjSetSink(
Nwk_Obj_t * pObj ) { pObj->MarkA = 1; }
47static inline int Nwk_ObjHasFlow(
Nwk_Obj_t * pObj ) {
return pObj->MarkB; }
48static inline void Nwk_ObjSetFlow(
Nwk_Obj_t * pObj ) { pObj->MarkB = 1; }
49static inline void Nwk_ObjClearFlow(
Nwk_Obj_t * pObj ) { pObj->MarkB = 0; }
56static inline int Nwk_ObjVisitedBotOnly(
Nwk_Obj_t * pObj )
58 return pObj->TravId == pObj->pMan->nTravIds - 2;
60static inline int Nwk_ObjVisitedBot(
Nwk_Obj_t * pObj )
62 return pObj->TravId == pObj->pMan->nTravIds - 2 || pObj->TravId == pObj->pMan->nTravIds;
64static inline int Nwk_ObjVisitedTop(
Nwk_Obj_t * pObj )
66 return pObj->TravId == pObj->pMan->nTravIds - 1 || pObj->TravId == pObj->pMan->nTravIds;
68static inline void Nwk_ObjSetVisitedBot(
Nwk_Obj_t * pObj )
70 if ( pObj->TravId < pObj->pMan->nTravIds - 2 )
71 pObj->TravId = pObj->pMan->nTravIds - 2;
72 else if ( pObj->TravId == pObj->pMan->nTravIds - 1 )
73 pObj->TravId = pObj->pMan->nTravIds;
77static inline void Nwk_ObjSetVisitedTop(
Nwk_Obj_t * pObj )
79 if ( pObj->TravId < pObj->pMan->nTravIds - 2 )
80 pObj->TravId = pObj->pMan->nTravIds - 1;
81 else if ( pObj->TravId == pObj->pMan->nTravIds - 2 )
82 pObj->TravId = pObj->pMan->nTravIds;
86static inline Nwk_ManIncrementTravIdFlow(
Nwk_Man_t * pMan )
162 if ( Nwk_ObjIsTravIdCurrent( pObj ) )
164 Nwk_ObjSetTravIdCurrent( pObj );
165 if ( Nwk_ObjHasFlow(pObj) )
167 if ( Nwk_ObjIsSink(pObj) )
169 Nwk_ObjSetFlow(pObj);
170 return Nwk_ObjSetPred( pObj, pPred );
175 Nwk_ObjSetFlow(pObj);
176 return Nwk_ObjSetPred( pObj, pPred );
196 if ( Nwk_ObjIsTravIdCurrent( pObj ) )
198 Nwk_ObjSetTravIdCurrent( pObj );
199 if ( Nwk_ObjHasFlow(pObj) )
201 if ( Nwk_ObjIsSink(pObj) )
203 Nwk_ObjSetFlow(pObj);
204 return Nwk_ObjSetPred( pObj, pPred );
209 Nwk_ObjSetFlow(pObj);
210 return Nwk_ObjSetPred( pObj, pPred );
230 if ( Nwk_ObjVisitedBot(pObj) )
232 Nwk_ObjSetVisitedBot(pObj);
237 if ( Nwk_ObjHasFlow(pObj) )
239 if ( Nwk_ObjPred(pObj) )
240 if ( Nwk_ManPushForwardTop_rec( Nwk_ObjPred(pObj), Nwk_ObjPred(pObj) ) )
243 return Nwk_ObjSetPred( pObj, pPred );
246 else if ( Nwk_ManPushForwardTop_rec(pObj, pObj) )
249 Nwk_ObjSetFlow( pObj );
250 return Nwk_ObjSetPred( pObj, pPred );
254 if ( Nwk_ManPushForwardBot_rec( pNext, pPred ) )
278 if ( Nwk_ObjVisitedTop(pObj) )
280 Nwk_ObjSetVisitedTop(pObj);
282 if ( Nwk_ObjIsSink(pObj) )
289 if ( Nwk_ManPushForwardBot_rec( pNext, pPred ) )
295 if ( Nwk_ObjHasFlow(pObj) && !Nwk_ObjIsCi(pObj) )
296 if ( Nwk_ManPushForwardBot_rec( pObj, Nwk_ObjPred(pObj) ) )
299 Nwk_ObjClearFlow( pObj );
300 return Nwk_ObjSetPred( pObj, NULL );
319 if ( Nwk_ObjVisitedBot(pObj) )
321 Nwk_ObjSetVisitedBot(pObj);
323 if ( Nwk_ObjHasFlow(pObj) )
325 if ( Nwk_ObjPred(pObj) )
326 if ( Nwk_ManPushBackwardTop_rec( Nwk_ObjPred(pObj), Nwk_ObjPred(pObj) ) )
327 return Nwk_ObjSetPred( pObj, pPred );
329 else if ( Nwk_ManPushBackwardTop_rec(pObj, pObj) )
331 Nwk_ObjSetFlow( pObj );
332 return Nwk_ObjSetPred( pObj, pPred );
352 if ( Nwk_ObjVisitedTop(pObj) )
354 Nwk_ObjSetVisitedTop(pObj);
356 if ( Nwk_ObjIsSink(pObj) )
360 if ( Nwk_ManPushBackwardBot_rec( pNext, pPred ) )
364 if ( !Nwk_ObjIsCo(pObj) && Nwk_ManPushBackwardTop_rec( pNext, pPred ) )
367 if ( Nwk_ObjHasFlow(pObj) )
368 if ( Nwk_ObjPred(pObj) && Nwk_ManPushBackwardBot_rec( pObj, Nwk_ObjPred(pObj) ) )
370 Nwk_ObjClearFlow( pObj );
371 return Nwk_ObjSetPred( pObj, NULL );
393 if ( Nwk_ObjIsLo(pObj) )
395 if ( Nwk_ObjIsTravIdCurrent( pObj ) )
397 Nwk_ObjSetTravIdCurrent( pObj );
422 assert( pObj->MarkA == 0 );
429 printf(
"Nwk_ManRetimeVerifyCutForward(): Internal cut verification failed.\n" );
467 int i, RetValue, Counter = 0, Counter2 = 0;
468 clock_t clk = clock();
471 pMan->
nTruePis = Nwk_ManCiNum(pMan) - nLatches;
472 pMan->
nTruePos = Nwk_ManCoNum(pMan) - nLatches;
479 Nwk_ManIncrementTravIdFlow( pMan );
484 Nwk_ManIncrementTravIdFlow( pMan );
488 printf(
"Forward: Max-flow = %4d -> ", Counter );
491 Nwk_ManIncrementTravIdFlow( pMan );
495 if ( !Nwk_ManPushForwardBot_rec( pObj, NULL ) )
498 Nwk_ManIncrementTravIdFlow( pMan );
503 printf(
"%4d. ", Counter+Counter2 );
507 Nwk_ManIncrementTravIdFlow( pMan );
510 RetValue = Nwk_ManPushForwardBot_rec( pObj, NULL );
515 vNodes = Vec_PtrAlloc( Counter+Counter2 );
519 if ( Nwk_ObjVisitedBotOnly(pObj) )
521 assert( Nwk_ObjHasFlow(pObj) );
522 assert( !Nwk_ObjIsCo(pObj) );
523 Vec_PtrPush( vNodes, pObj );
524 Counter += Nwk_ObjIsCi(pObj);
531 printf(
"Min-cut = %4d. Unmoved = %4d. ", Vec_PtrSize(vNodes), Counter );
532 PRT(
"Time", clock() - clk );
552 int i, RetValue, Counter = 0, Counter2 = 0;
553 clock_t clk = clock();
556 pMan->
nTruePis = Nwk_ManCiNum(pMan) - nLatches;
557 pMan->
nTruePos = Nwk_ManCoNum(pMan) - nLatches;
564 if ( Nwk_ObjFaninNum(pObj) == 0 )
567 Nwk_ManIncrementTravIdFlow( pMan );
572 Nwk_ManIncrementTravIdFlow( pMan );
576 printf(
"Backward: Max-flow = %4d -> ", Counter );
578 Nwk_ManIncrementTravIdFlow( pMan );
581 if ( !Nwk_ManPushBackwardBot_rec( Nwk_ObjFanin0(pObj), NULL ) )
583 Nwk_ManIncrementTravIdFlow( pMan );
587 printf(
"%4d. ", Counter+Counter2 );
591 Nwk_ManIncrementTravIdFlow( pMan );
594 RetValue = Nwk_ManPushBackwardBot_rec( Nwk_ObjFanin0(pObj), NULL );
599 vNodes = Vec_PtrAlloc( Counter+Counter2 );
602 if ( Nwk_ObjVisitedBotOnly(pObj) )
604 assert( Nwk_ObjHasFlow(pObj) );
605 assert( !Nwk_ObjIsCo(pObj) );
606 Vec_PtrPush( vNodes, pObj );
612 if ( Nwk_ObjVisitedBotOnly( Nwk_ObjFanin0(pObj) ) )
618 printf(
"Min-cut = %4d. Unmoved = %4d. ", Vec_PtrSize(vNodes), Counter );
619 PRT(
"Time", clock() - clk );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
struct Nwk_Man_t_ Nwk_Man_t
ABC_NAMESPACE_IMPL_START int DepthFwdMax
ABC_NAMESPACE_IMPL_START int DepthBwd
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)
ABC_NAMESPACE_IMPL_START int DepthBwdMax
void Nwk_ManMarkTfoCone_rec(Nwk_Obj_t *pObj)
ABC_NAMESPACE_IMPL_START int DepthFwd
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 ///.