/**Function************************************************************* Synopsis [Performs area recovery for each node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void If_ManImproveMark_rec( If_Man_t * p, If_Obj_t * pObj, Vec_Ptr_t * vVisited ) { if ( pObj->fMark ) return; assert( If_ObjIsAnd(pObj) ); If_ManImproveMark_rec( p, If_ObjFanin0(pObj), vVisited ); If_ManImproveMark_rec( p, If_ObjFanin1(pObj), vVisited ); Vec_PtrPush( vVisited, pObj ); pObj->fMark = 1; }
/**Function************************************************************* Synopsis [Derive truth table for each cofactor.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int If_ManCutTruthCheck_rec( If_Obj_t * pObj, word * pTruths ) { word T0, T1; if ( pObj->fMark ) return pTruths[If_ObjId(pObj)]; assert( If_ObjIsAnd(pObj) ); T0 = If_ManCutTruthCheck_rec( If_ObjFanin0(pObj), pTruths ); T1 = If_ManCutTruthCheck_rec( If_ObjFanin1(pObj), pTruths ); T0 = If_ObjFaninC0(pObj) ? ~T0 : T0; T1 = If_ObjFaninC1(pObj) ? ~T1 : T1; return T0 & T1; }
/**Function************************************************************* Synopsis [Returns 1 if the node Leaf is reachable on the path.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int If_ManCutReach_rec( If_Obj_t * pPath, If_Obj_t * pLeaf ) { if ( pPath == pLeaf ) return 1; if ( pPath->fMark ) return 0; assert( If_ObjIsAnd(pPath) ); if ( If_ManCutReach_rec( If_ObjFanin0(pPath), pLeaf ) ) return 1; if ( If_ManCutReach_rec( If_ObjFanin1(pPath), pLeaf ) ) return 1; return 0; }
/**Function************************************************************* Synopsis [Computes area of the first level.] Description [The cut need to be derefed.] SideEffects [] SeeAlso [] ***********************************************************************/ float If_CutDeref( If_Man_t * p, If_Cut_t * pCut, int nLevels ) { If_Obj_t * pLeaf; float Area; int i; Area = If_CutLutArea(p, pCut); If_CutForEachLeaf( p, pCut, pLeaf, i ) { assert( pLeaf->nRefs > 0 ); if ( --pLeaf->nRefs > 0 || !If_ObjIsAnd(pLeaf) || nLevels == 1 ) continue; Area += If_CutDeref( p, If_ObjCutBest(pLeaf), nLevels - 1 ); }