36 assert( Abc_ObjGetPath(pObj) );
38 if ( Abc_ObjGetPath(pFanout) == pObj )
46 assert( Abc_ObjGetPath(pObj) );
48 if ( Abc_ObjGetPath(pFanin) == pObj )
57 if ( Abc_ObjGetPath(pNext) == pObj )
60 if ( Abc_ObjGetPath(pNext) == pObj )
69 if ( Abc_ObjGetPath(pNext) == pObj )
72 if ( Abc_ObjGetPath(pNext) == pObj )
77static int Abc_NtkMaxFlowBwdPath_rec(
Abc_Obj_t * pObj );
78static int Abc_NtkMaxFlowFwdPath_rec(
Abc_Obj_t * pObj );
79static int Abc_NtkMaxFlowBwdPath2_rec(
Abc_Obj_t * pObj );
80static int Abc_NtkMaxFlowFwdPath2_rec(
Abc_Obj_t * pObj );
82static int Abc_NtkMaxFlowFwdPath3_rec(
Abc_Obj_t * pObj,
Abc_Obj_t * pPrev,
int fFanin );
84static void Abc_NtkMaxFlowMinCutUpdate(
Abc_Ntk_t * pNtk,
Vec_Ptr_t * vMinCut,
int fForward );
85static int Abc_NtkMaxFlowVerifyCut(
Abc_Ntk_t * pNtk,
Vec_Ptr_t * vMinCut,
int fForward );
87static void Abc_NtkMaxFlowPrintFlow(
Abc_Ntk_t * pNtk,
int fForward );
114 pObj->
fMarkA = Abc_ObjFanin0(pObj)->fMarkA = 1;
117 Vec_PtrFree( vMinCut );
124 pObj->
fMarkA = Abc_ObjFanout0(pObj)->fMarkA = 1;
127 Vec_PtrFree( vMinCut );
147 int Flow, FlowCur, RetValue, i;
149 int fUseDirectedFlow = 1;
154 Abc_NtkIncrementTravId(pNtk);
160 FlowCur = Abc_NtkMaxFlowFwdPath2_rec( Abc_ObjFanout0(pLatch) );
166 assert( !Abc_ObjFanin0(pLatch)->fMarkA );
167 FlowCur = Abc_NtkMaxFlowBwdPath2_rec( Abc_ObjFanin0(pLatch) );
171 Abc_NtkIncrementTravId(pNtk);
174 if ( !fUseDirectedFlow )
176 Abc_NtkIncrementTravId(pNtk);
182 FlowCur = Abc_NtkMaxFlowFwdPath_rec( Abc_ObjFanout0(pLatch) );
187 assert( !Abc_ObjFanin0(pLatch)->fMarkA );
188 FlowCur = Abc_NtkMaxFlowBwdPath_rec( Abc_ObjFanin0(pLatch) );
192 Abc_NtkIncrementTravId(pNtk);
198 Abc_NtkIncrementTravId(pNtk);
204 if ( fUseDirectedFlow )
205 RetValue = Abc_NtkMaxFlowFwdPath2_rec( Abc_ObjFanout0(pLatch) );
208 RetValue = Abc_NtkMaxFlowFwdPath_rec( Abc_ObjFanout0(pLatch) );
212 assert( !Abc_ObjFanin0(pLatch)->fMarkA );
213 if ( fUseDirectedFlow )
214 RetValue = Abc_NtkMaxFlowBwdPath2_rec( Abc_ObjFanin0(pLatch) );
216 RetValue = Abc_NtkMaxFlowBwdPath_rec( Abc_ObjFanin0(pLatch) );
222 vMinCut = Abc_NtkMaxFlowMinCut( pNtk, fForward );
224 if ( !Abc_NtkMaxFlowVerifyCut(pNtk, vMinCut, fForward) )
225 printf(
"Abc_NtkMaxFlow() error! The computed min-cut is not a cut!\n" );
227 Abc_NtkMaxFlowMinCutUpdate( pNtk, vMinCut, fForward );
232 printf(
"L = %6d. %s max-flow = %6d. Min-cut = %6d. ",
233 Abc_NtkLatchNum(pNtk), fForward?
"Forward " :
"Backward", Flow, Vec_PtrSize(vMinCut) );
234ABC_PRT(
"Time", Abc_Clock() - clk );
252int Abc_NtkMaxFlowBwdPath_rec(
Abc_Obj_t * pObj )
257 if ( Abc_NodeIsTravIdCurrent(pObj) )
259 Abc_NodeSetTravIdCurrent(pObj);
261 pPred = Abc_ObjGetPredecessorBwd( pObj );
263 if ( !Abc_ObjGetPath(pObj) )
267 return Abc_ObjSetPath( pObj, (
Abc_Obj_t *)1 );
270 if ( pNext != pPred && !Abc_ObjIsLatch(pNext) && Abc_NtkMaxFlowBwdPath_rec(pNext) )
271 return Abc_ObjSetPath( pObj, pNext );
273 if ( pNext != pPred && !Abc_ObjIsLatch(pNext) && Abc_NtkMaxFlowBwdPath_rec(pNext) )
274 return Abc_ObjSetPath( pObj, pNext );
282 if ( !Abc_ObjIsLatch(pNext) && Abc_NtkMaxFlowBwdPath_rec( pNext ) )
283 return Abc_ObjSetPath( pPred, pNext );
285 if ( !Abc_ObjIsLatch(pNext) && Abc_NtkMaxFlowBwdPath_rec( pNext ) )
286 return Abc_ObjSetPath( pPred, pNext );
288 if ( Abc_NtkMaxFlowBwdPath_rec( pPred ) )
289 return Abc_ObjSetPath( pPred, NULL );
304int Abc_NtkMaxFlowFwdPath_rec(
Abc_Obj_t * pObj )
309 if ( Abc_NodeIsTravIdCurrent(pObj) )
311 Abc_NodeSetTravIdCurrent(pObj);
313 pPred = Abc_ObjGetPredecessorFwd( pObj );
315 if ( !Abc_ObjGetPath(pObj) )
319 return Abc_ObjSetPath( pObj, (
Abc_Obj_t *)1 );
322 if ( pNext != pPred && !Abc_ObjIsLatch(pNext) && Abc_NtkMaxFlowFwdPath_rec(pNext) )
323 return Abc_ObjSetPath( pObj, pNext );
325 if ( pNext != pPred && !Abc_ObjIsLatch(pNext) && Abc_NtkMaxFlowFwdPath_rec(pNext) )
326 return Abc_ObjSetPath( pObj, pNext );
334 if ( !Abc_ObjIsLatch(pNext) && Abc_NtkMaxFlowFwdPath_rec( pNext ) )
335 return Abc_ObjSetPath( pPred, pNext );
337 if ( !Abc_ObjIsLatch(pNext) && Abc_NtkMaxFlowFwdPath_rec( pNext ) )
338 return Abc_ObjSetPath( pPred, pNext );
340 if ( Abc_NtkMaxFlowFwdPath_rec( pPred ) )
341 return Abc_ObjSetPath( pPred, NULL );
362 if ( Abc_NodeIsTravIdCurrent(pObj) )
364 Abc_NodeSetTravIdCurrent(pObj);
366 if ( fFanin && Abc_ObjGetPath(pPrev) )
369 if ( !Abc_ObjGetPath(pObj) )
373 return Abc_ObjSetPath( pObj, (
Abc_Obj_t *)1 );
376 if ( Abc_NtkMaxFlowFwdPath3_rec(pFanout, pObj, 1) )
377 return fFanin? Abc_ObjSetPath(pPrev, pObj) : 1;
381 if ( !Abc_ObjIsLatch(pFanin) && Abc_NtkMaxFlowFwdPath3_rec(pFanin, pObj, 0) )
382 return Abc_ObjSetPath( pFanin, NULL );
397int Abc_NtkMaxFlowBwdPath2_rec(
Abc_Obj_t * pObj )
402 if ( Abc_NodeIsTravIdCurrent(pObj) )
404 Abc_NodeSetTravIdCurrent(pObj);
406 if ( !Abc_ObjGetPath(pObj) )
410 return Abc_ObjSetPath( pObj, (
Abc_Obj_t *)1 );
413 if ( Abc_NtkMaxFlowBwdPath2_rec(pFanin) )
414 return Abc_ObjSetPath( pObj, pFanin );
418 pFanout = Abc_ObjGetFanoutPath( pObj );
419 if ( pFanout == NULL )
423 if ( Abc_NtkMaxFlowBwdPath2_rec( pFanin ) )
424 return Abc_ObjSetPath( pFanout, pFanin );
426 if ( Abc_NtkMaxFlowBwdPath2_rec( pFanout ) )
427 return Abc_ObjSetPath( pFanout, NULL );
442int Abc_NtkMaxFlowFwdPath2_rec(
Abc_Obj_t * pObj )
447 if ( Abc_NodeIsTravIdCurrent(pObj) )
449 Abc_NodeSetTravIdCurrent(pObj);
451 if ( !Abc_ObjGetPath(pObj) )
455 return Abc_ObjSetPath( pObj, (
Abc_Obj_t *)1 );
458 if ( Abc_NtkMaxFlowFwdPath2_rec(pFanout) )
459 return Abc_ObjSetPath( pObj, pFanout );
463 pFanin = Abc_ObjGetFaninPath( pObj );
464 if ( pFanin == NULL )
468 if ( Abc_NtkMaxFlowFwdPath2_rec( pFanout ) )
469 return Abc_ObjSetPath( pFanin, pFanout );
471 if ( Abc_NtkMaxFlowFwdPath2_rec( pFanin ) )
472 return Abc_ObjSetPath( pFanin, NULL );
493 vMinCut = Vec_PtrAlloc( Abc_NtkLatchNum(pNtk) );
497 if ( !Abc_ObjGetPath(pObj) )
500 if ( !Abc_NodeIsTravIdCurrent(pObj) )
503 if ( pObj->
fMarkA || !Abc_NodeIsTravIdCurrent( Abc_ObjGetPath(pObj) ) )
504 Vec_PtrPush( vMinCut, pObj );
546 if ( Abc_NodeIsTravIdCurrent(pObj) )
548 Abc_NodeSetTravIdCurrent(pObj);
551 Vec_PtrPush( vNodes, pObj );
579 Abc_ObjFanout0(pObj)->fMarkA = 1;
586 Vec_PtrClear( vMinCut );
595 Vec_PtrPush( vMinCut, pObj );
603 Vec_PtrClear( vMinCut );
604 Abc_NtkIncrementTravId(pNtk);
609 pObj->
fMarkA = Abc_NodeIsTravIdCurrent(pObj);
632 if ( Abc_NodeIsTravIdCurrent(pObj) )
634 Abc_NodeSetTravIdCurrent(pObj);
638 if ( Abc_ObjIsCo(pObj) )
647 if ( Abc_ObjIsCi(pObj) )
673 Abc_NtkIncrementTravId(pNtk);
675 Abc_NodeSetTravIdCurrent( pObj );
713void Abc_NtkMaxFlowPrintFlow(
Abc_Ntk_t * pNtk,
int fForward )
722 assert( !Abc_ObjFanout0(pLatch)->fMarkA );
723 if ( Abc_ObjGetPath(Abc_ObjFanout0(pLatch)) == NULL )
726 for ( pNext = Abc_ObjFanout0(pLatch); pNext != (
void *)1; pNext = Abc_ObjGetPath(pNext) )
731 if ( !Abc_ObjIsPo(pPrev) )
732 printf(
"%s(%d) ",
Abc_ObjName(Abc_ObjFanout0(pPrev)), Abc_ObjFanout0(pPrev)->Id );
740 assert( !Abc_ObjFanin0(pLatch)->fMarkA );
741 if ( Abc_ObjGetPath(Abc_ObjFanin0(pLatch)) == NULL )
744 for ( pNext = Abc_ObjFanin0(pLatch); pNext != (
void *)1; pNext = Abc_ObjGetPath(pNext) )
749 if ( !Abc_ObjIsPi(pPrev) )
750 printf(
"%s(%d) ",
Abc_ObjName(Abc_ObjFanin0(pPrev)), Abc_ObjFanin0(pPrev)->Id );
771 printf(
"Min-cut: " );
775 printf(
"Marked nodes: " );
struct Abc_Obj_t_ Abc_Obj_t
ABC_DLL void Abc_NtkCleanMarkA(Abc_Ntk_t *pNtk)
#define Abc_NtkForEachPo(pNtk, pPo, i)
#define Abc_NtkForEachLatch(pNtk, pObj, i)
#define Abc_NtkForEachObj(pNtk, pObj, i)
ITERATORS ///.
#define Abc_ObjForEachFanin(pObj, pFanin, i)
#define Abc_ObjForEachFanout(pObj, pFanout, i)
ABC_DLL char * Abc_ObjName(Abc_Obj_t *pNode)
DECLARATIONS ///.
struct Abc_Ntk_t_ Abc_Ntk_t
#define Abc_NtkForEachPi(pNtk, pPi, i)
ABC_DLL void Abc_NtkCleanCopy(Abc_Ntk_t *pNtk)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Abc_NtkMaxFlowCollectCut_rec(Abc_Obj_t *pObj, Vec_Ptr_t *vNodes)
void Abc_NtkMaxFlowTest(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
void Abc_NtkMaxFlowMarkCut_rec(Abc_Obj_t *pObj)
Vec_Ptr_t * Abc_NtkMaxFlow(Abc_Ntk_t *pNtk, int fForward, int fVerbose)
int Abc_NtkMaxFlowVerifyCut_rec(Abc_Obj_t *pObj, int fForward)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.