diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2008-03-29 08:01:00 -0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2008-03-29 08:01:00 -0700 |
commit | 93c3f16066b69c840dc636f827f5f3ca18749906 (patch) | |
tree | 17e925b73259f4411e6b19ad38cffcf473d85fda /src/opt | |
parent | 416ffc117ab7d0ea2ec3b8aaeb4724f25031db7a (diff) | |
download | abc-93c3f16066b69c840dc636f827f5f3ca18749906.tar.gz abc-93c3f16066b69c840dc636f827f5f3ca18749906.tar.bz2 abc-93c3f16066b69c840dc636f827f5f3ca18749906.zip |
Version abc80329
Diffstat (limited to 'src/opt')
-rw-r--r-- | src/opt/mfs/mfsCore.c | 84 | ||||
-rw-r--r-- | src/opt/mfs/mfsResub.c | 4 |
2 files changed, 62 insertions, 26 deletions
diff --git a/src/opt/mfs/mfsCore.c b/src/opt/mfs/mfsCore.c index 2a2c9d43..fed528ef 100644 --- a/src/opt/mfs/mfsCore.c +++ b/src/opt/mfs/mfsCore.c @@ -180,10 +180,21 @@ int Abc_NtkMfs( Abc_Ntk_t * pNtk, Mfs_Par_t * pPars ) assert( Abc_NtkIsLogic(pNtk) ); nFaninMax = Abc_NtkGetFaninMax(pNtk); - if ( nFaninMax > MFS_FANIN_MAX ) + if ( pPars->fResub ) { - printf( "Nodes with more than %d fanins will node be processed.\n", MFS_FANIN_MAX ); - nFaninMax = MFS_FANIN_MAX; + if ( nFaninMax > 8 ) + { + printf( "Nodes with more than %d fanins will node be processed.\n", 8 ); + nFaninMax = 8; + } + } + else + { + if ( nFaninMax > MFS_FANIN_MAX ) + { + printf( "Nodes with more than %d fanins will node be processed.\n", MFS_FANIN_MAX ); + nFaninMax = MFS_FANIN_MAX; + } } // perform the network sweep Abc_NtkSweep( pNtk, 0 ); @@ -237,41 +248,62 @@ int Abc_NtkMfs( Abc_Ntk_t * pNtk, Mfs_Par_t * pPars ) nNodes = 0; p->nTotalNodesBeg = nTotalNodesBeg; p->nTotalEdgesBeg = nTotalEdgesBeg; - pProgress = Extra_ProgressBarStart( stdout, Abc_NtkNodeNum(pNtk) ); - vLevels = Abc_NtkLevelize( pNtk ); - Vec_VecForEachLevelStart( vLevels, vNodes, k, 1 ) + if ( pPars->fResub ) { - if ( !p->pPars->fVeryVerbose ) - Extra_ProgressBarUpdate( pProgress, nNodes, NULL ); - p->nNodesGainedLevel = 0; - p->nTotConfLevel = 0; - p->nTimeOutsLevel = 0; - clk2 = clock(); - Vec_PtrForEachEntry( vNodes, pObj, i ) + pProgress = Extra_ProgressBarStart( stdout, Abc_NtkObjNumMax(pNtk) ); + Abc_NtkForEachNode( pNtk, pObj, i ) { if ( p->pPars->nDepthMax && (int)pObj->Level > p->pPars->nDepthMax ) - break; - if ( Abc_ObjFaninNum(pObj) > MFS_FANIN_MAX ) continue; + if ( Abc_ObjFaninNum(pObj) < 2 || Abc_ObjFaninNum(pObj) > nFaninMax ) + continue; + if ( !p->pPars->fVeryVerbose ) + Extra_ProgressBarUpdate( pProgress, i, NULL ); if ( pPars->fResub ) Abc_NtkMfsResub( p, pObj ); - else if ( Abc_ObjFaninNum(pObj) > 1 && Abc_ObjFaninNum(pObj) <= 12 ) + else Abc_NtkMfsNode( p, pObj ); } - nNodes += Vec_PtrSize(vNodes); - if ( pPars->fVerbose ) + Extra_ProgressBarStop( pProgress ); + } + else + { + pProgress = Extra_ProgressBarStart( stdout, Abc_NtkNodeNum(pNtk) ); + vLevels = Abc_NtkLevelize( pNtk ); + Vec_VecForEachLevelStart( vLevels, vNodes, k, 1 ) { - printf( "Lev = %2d. Node = %4d. Ave gain = %6.2f. Ave conf = %6.2f. Timeouts = %6.2f %% ", - k, Vec_PtrSize(vNodes), - 1.0*p->nNodesGainedLevel/Vec_PtrSize(vNodes), - 1.0*p->nTotConfLevel/Vec_PtrSize(vNodes), - 100.0*p->nTimeOutsLevel/Vec_PtrSize(vNodes) ); - PRT( "Time", clock() - clk2 ); + if ( !p->pPars->fVeryVerbose ) + Extra_ProgressBarUpdate( pProgress, nNodes, NULL ); + p->nNodesGainedLevel = 0; + p->nTotConfLevel = 0; + p->nTimeOutsLevel = 0; + clk2 = clock(); + Vec_PtrForEachEntry( vNodes, pObj, i ) + { + if ( p->pPars->nDepthMax && (int)pObj->Level > p->pPars->nDepthMax ) + break; + if ( Abc_ObjFaninNum(pObj) < 2 || Abc_ObjFaninNum(pObj) > nFaninMax ) + continue; + if ( pPars->fResub ) + Abc_NtkMfsResub( p, pObj ); + else + Abc_NtkMfsNode( p, pObj ); + } + nNodes += Vec_PtrSize(vNodes); + if ( pPars->fVerbose ) + { + printf( "Lev = %2d. Node = %5d. Ave gain = %5.2f. Ave conf = %5.2f. T/o = %6.2f %% ", + k, Vec_PtrSize(vNodes), + 1.0*p->nNodesGainedLevel/Vec_PtrSize(vNodes), + 1.0*p->nTotConfLevel/Vec_PtrSize(vNodes), + 100.0*p->nTimeOutsLevel/Vec_PtrSize(vNodes) ); + PRT( "Time", clock() - clk2 ); + } } + Extra_ProgressBarStop( pProgress ); + Vec_VecFree( vLevels ); } - Extra_ProgressBarStop( pProgress ); Abc_NtkStopReverseLevels( pNtk ); - Vec_VecFree( vLevels ); // perform the sweeping if ( !pPars->fResub ) diff --git a/src/opt/mfs/mfsResub.c b/src/opt/mfs/mfsResub.c index 8908da2f..b6c7299b 100644 --- a/src/opt/mfs/mfsResub.c +++ b/src/opt/mfs/mfsResub.c @@ -176,6 +176,7 @@ int Abc_NtkMfsSolveSatResub( Mfs_Man_t * p, Abc_Obj_t * pNode, int iFanin, int f if ( fVeryVerbose ) printf( "Node %d: Fanin %d can be removed.\n", pNode->Id, iFanin ); p->nNodesResub++; + p->nNodesGainedLevel++; if ( fSkipUpdate ) return 1; clk = clock(); @@ -243,6 +244,7 @@ p->timeInt += clock() - clk; if ( fVeryVerbose ) printf( "Node %d: Fanin %d can be replaced by divisor %d.\n", pNode->Id, iFanin, iVar ); p->nNodesResub++; + p->nNodesGainedLevel++; if ( fSkipUpdate ) return 1; clk = clock(); @@ -315,6 +317,7 @@ int Abc_NtkMfsSolveSatResub2( Mfs_Man_t * p, Abc_Obj_t * pNode, int iFanin, int if ( fVeryVerbose ) printf( "Node %d: Fanins %d/%d can be removed.\n", pNode->Id, iFanin, iFanin2 ); p->nNodesResub++; + p->nNodesGainedLevel++; clk = clock(); // derive the function pFunc = Abc_NtkMfsInterplate( p, pCands, nCands ); @@ -388,6 +391,7 @@ p->timeInt += clock() - clk; if ( fVeryVerbose ) printf( "Node %d: Fanins %d/%d can be replaced by divisors %d/%d.\n", pNode->Id, iFanin, iFanin2, iVar, iVar2 ); p->nNodesResub++; + p->nNodesGainedLevel++; clk = clock(); // derive the function pFunc = Abc_NtkMfsInterplate( p, pCands, nCands+2 ); |