/**Function************************************************************* Synopsis [Fixed object is useful when it has a non-fixed fanout.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline int Sfm_ObjIsUseful( Sfm_Ntk_t * p, int iNode ) { int i, iFanout; if ( !Sfm_ObjIsFixed(p, iNode) ) return 1; Sfm_ObjForEachFanout( p, iNode, iFanout, i ) if ( !Sfm_ObjIsFixed(p, iFanout) ) return 1; return 0; }
/**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Sfm_NtkPerform( Sfm_Ntk_t * p, Sfm_Par_t * pPars ) { int i, k, Counter = 0; p->timeTotal = Abc_Clock(); if ( pPars->fVerbose && Vec_StrSum(p->vFixed) > 0 ) printf( "Performing MFS with %d fixed objects.\n", Vec_StrSum(p->vFixed) ); p->pPars = pPars; Sfm_NtkPrepare( p ); // Sfm_ComputeInterpolantCheck( p ); // return 0; p->nTotalNodesBeg = Vec_WecSizeUsedLimits( &p->vFanins, Sfm_NtkPiNum(p), Vec_WecSize(&p->vFanins) - Sfm_NtkPoNum(p) ); p->nTotalEdgesBeg = Vec_WecSizeSize(&p->vFanins) - Sfm_NtkPoNum(p); Sfm_NtkForEachNode( p, i ) { if ( Sfm_ObjIsFixed( p, i ) ) continue; if ( p->pPars->nDepthMax && Sfm_ObjLevel(p, i) > p->pPars->nDepthMax ) continue; if ( Sfm_ObjFaninNum(p, i) < 2 || Sfm_ObjFaninNum(p, i) > 6 ) continue; for ( k = 0; Sfm_NodeResub(p, i); k++ ) { // Counter++; // break; } Counter += (k > 0); } p->nTotalNodesEnd = Vec_WecSizeUsedLimits( &p->vFanins, Sfm_NtkPiNum(p), Vec_WecSize(&p->vFanins) - Sfm_NtkPoNum(p) ); p->nTotalEdgesEnd = Vec_WecSizeSize(&p->vFanins) - Sfm_NtkPoNum(p); p->timeTotal = Abc_Clock() - p->timeTotal; if ( pPars->fVerbose ) Sfm_NtkPrintStats( p ); return Counter; }