summaryrefslogtreecommitdiffstats
path: root/src/opt/mfs
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2008-03-29 08:01:00 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2008-03-29 08:01:00 -0700
commit93c3f16066b69c840dc636f827f5f3ca18749906 (patch)
tree17e925b73259f4411e6b19ad38cffcf473d85fda /src/opt/mfs
parent416ffc117ab7d0ea2ec3b8aaeb4724f25031db7a (diff)
downloadabc-93c3f16066b69c840dc636f827f5f3ca18749906.tar.gz
abc-93c3f16066b69c840dc636f827f5f3ca18749906.tar.bz2
abc-93c3f16066b69c840dc636f827f5f3ca18749906.zip
Version abc80329
Diffstat (limited to 'src/opt/mfs')
-rw-r--r--src/opt/mfs/mfsCore.c84
-rw-r--r--src/opt/mfs/mfsResub.c4
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 );