/**Function************************************************************* Synopsis [Recursively collects roots of the window.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline int Sfm_NtkCheckRoot( Sfm_Ntk_t * p, int iNode, int nLevelMax ) { int i, iFanout; // the node is the root if one of the following is true: // (1) the node has more than fanouts than the limit or has no fanouts (should not happen in general) if ( Sfm_ObjFanoutNum(p, iNode) == 0 || Sfm_ObjFanoutNum(p, iNode) > p->pPars->nFanoutMax ) return 1; // (2) the node has CO fanouts // (3) the node has fanouts above the cutoff level Sfm_ObjForEachFanout( p, iNode, iFanout, i ) if ( Sfm_ObjIsPo(p, iFanout) || Sfm_ObjLevel(p, iFanout) > nLevelMax )//|| !Sfm_NtkCheckOverlap(p, iFanout, iNode) ) return 1; return 0; }
int Sfm_ObjMffcSize( Sfm_Ntk_t * p, int iObj ) { int Count1, Count2; if ( Sfm_ObjIsPi(p, iObj) ) return 0; if ( Sfm_ObjFanoutNum(p, iObj) != 1 ) return 0; assert( Sfm_ObjIsNode( p, iObj ) ); Count1 = Sfm_ObjDeref( p, iObj ); Count2 = Sfm_ObjRef( p, iObj ); assert( Count1 == Count2 ); return Count1; }
int Sfm_NodeResub( Sfm_Ntk_t * p, int iNode ) { int i, iFanin; p->nNodesTried++; // prepare SAT solver if ( !Sfm_NtkCreateWindow( p, iNode, p->pPars->fVeryVerbose ) ) return 0; if ( !Sfm_NtkWindowToSolver( p ) ) return 0; // try replacing area critical fanins Sfm_ObjForEachFanin( p, iNode, iFanin, i ) if ( Sfm_ObjIsNode(p, iFanin) && Sfm_ObjFanoutNum(p, iFanin) == 1 ) { if ( Sfm_NodeResubSolve( p, iNode, i, 0 ) ) return 1; } if ( p->pPars->fArea ) return 0; // try removing redundant edges Sfm_ObjForEachFanin( p, iNode, iFanin, i ) if ( !(Sfm_ObjIsNode(p, iFanin) && Sfm_ObjFanoutNum(p, iFanin) == 1) ) { if ( Sfm_NodeResubSolve( p, iNode, i, 1 ) ) return 1; } /* // try replacing area critical fanins while adding two new fanins if ( Sfm_ObjFaninNum(p, iNode) < p->nFaninMax ) Abc_ObjForEachFanin( pNode, pFanin, i ) if ( !Abc_ObjIsCi(pFanin) && Abc_ObjFanoutNum(pFanin) == 1 ) { if ( Abc_NtkMfsSolveSatResub2( p, pNode, i, -1 ) ) return 1; } */ return 0; }