/**Function************************************************************* Synopsis [Pushing the flow through the top part of the node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Nwk_ManPushBackwardTop_rec( Nwk_Obj_t * pObj, Nwk_Obj_t * pPred ) { Nwk_Obj_t * pNext; int i; if ( Nwk_ObjVisitedTop(pObj) ) return 0; Nwk_ObjSetVisitedTop(pObj); // check if this is the sink if ( Nwk_ObjIsSink(pObj) ) return 1; // try to push through the fanins Nwk_ObjForEachFanin( pObj, pNext, i ) if ( Nwk_ManPushBackwardBot_rec( pNext, pPred ) ) return 1; // try to push through the fanouts Nwk_ObjForEachFanout( pObj, pNext, i ) if ( !Nwk_ObjIsCo(pObj) && Nwk_ManPushBackwardTop_rec( pNext, pPred ) ) return 1; // redirect the flow if ( Nwk_ObjHasFlow(pObj) ) if ( Nwk_ObjPred(pObj) && Nwk_ManPushBackwardBot_rec( pObj, Nwk_ObjPred(pObj) ) ) { Nwk_ObjClearFlow( pObj ); return Nwk_ObjSetPred( pObj, NULL ); } return 0; }
/**Function************************************************************* Synopsis [Pushing the flow through the top part of the node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Nwk_ManPushForwardTop_rec( Nwk_Obj_t * pObj, Nwk_Obj_t * pPred ) { Nwk_Obj_t * pNext; int i; if ( Nwk_ObjVisitedTop(pObj) ) return 0; Nwk_ObjSetVisitedTop(pObj); // check if this is the sink if ( Nwk_ObjIsSink(pObj) ) return 1; DepthFwd++; if ( DepthFwdMax < DepthFwd ) DepthFwdMax = DepthFwd; // try to push through the fanouts Nwk_ObjForEachFanout( pObj, pNext, i ) if ( Nwk_ManPushForwardBot_rec( pNext, pPred ) ) { DepthFwd--; return 1; } // redirect the flow if ( Nwk_ObjHasFlow(pObj) && !Nwk_ObjIsCi(pObj) ) if ( Nwk_ManPushForwardBot_rec( pObj, Nwk_ObjPred(pObj) ) ) { DepthFwd--; Nwk_ObjClearFlow( pObj ); return Nwk_ObjSetPred( pObj, NULL ); } DepthFwd--; return 0; }
/**Function************************************************************* Synopsis [Pushing the flow through the bottom part of the node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Nwk_ManPushBackwardBot_rec( Nwk_Obj_t * pObj, Nwk_Obj_t * pPred ) { if ( Nwk_ObjVisitedBot(pObj) ) return 0; Nwk_ObjSetVisitedBot(pObj); // propagate through the internal edge if ( Nwk_ObjHasFlow(pObj) ) { if ( Nwk_ObjPred(pObj) ) if ( Nwk_ManPushBackwardTop_rec( Nwk_ObjPred(pObj), Nwk_ObjPred(pObj) ) ) return Nwk_ObjSetPred( pObj, pPred ); } else if ( Nwk_ManPushBackwardTop_rec(pObj, pObj) ) { Nwk_ObjSetFlow( pObj ); return Nwk_ObjSetPred( pObj, pPred ); } return 0; }
/**Function************************************************************* Synopsis [Fast backward flow pushing.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Nwk_ManPushBackwardFast_rec( Nwk_Obj_t * pObj, Nwk_Obj_t * pPred ) { Nwk_Obj_t * pNext; int i; if ( Nwk_ObjIsTravIdCurrent( pObj ) ) return 0; Nwk_ObjSetTravIdCurrent( pObj ); if ( Nwk_ObjHasFlow(pObj) ) return 0; if ( Nwk_ObjIsSink(pObj) ) { Nwk_ObjSetFlow(pObj); return Nwk_ObjSetPred( pObj, pPred ); } Nwk_ObjForEachFanin( pObj, pNext, i ) if ( Nwk_ManPushBackwardFast_rec( pNext, pObj ) ) { Nwk_ObjSetFlow(pObj); return Nwk_ObjSetPred( pObj, pPred ); } return 0; }
/**Function************************************************************* Synopsis [Pushing the flow through the bottom part of the node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Nwk_ManPushForwardBot_rec( Nwk_Obj_t * pObj, Nwk_Obj_t * pPred ) { Nwk_Obj_t * pNext; int i; if ( Nwk_ObjVisitedBot(pObj) ) return 0; Nwk_ObjSetVisitedBot(pObj); DepthFwd++; if ( DepthFwdMax < DepthFwd ) DepthFwdMax = DepthFwd; // propagate through the internal edge if ( Nwk_ObjHasFlow(pObj) ) { if ( Nwk_ObjPred(pObj) ) if ( Nwk_ManPushForwardTop_rec( Nwk_ObjPred(pObj), Nwk_ObjPred(pObj) ) ) { DepthFwd--; return Nwk_ObjSetPred( pObj, pPred ); } } else if ( Nwk_ManPushForwardTop_rec(pObj, pObj) ) { DepthFwd--; Nwk_ObjSetFlow( pObj ); return Nwk_ObjSetPred( pObj, pPred ); } // try to push through the fanins Nwk_ObjForEachFanin( pObj, pNext, i ) if ( Nwk_ManPushForwardBot_rec( pNext, pPred ) ) { DepthFwd--; return 1; } DepthFwd--; return 0; }