summaryrefslogtreecommitdiffstats
path: root/src/base
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2013-04-28 16:21:58 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2013-04-28 16:21:58 -0700
commit58e1041ad85add626a48e98f2ed49f7b0c7cf0ad (patch)
tree125f18a741ef7345fe4d32124d380192e1647a16 /src/base
parenta33821ab38129116fd9ac94b7df83db2b18c66be (diff)
downloadabc-58e1041ad85add626a48e98f2ed49f7b0c7cf0ad.tar.gz
abc-58e1041ad85add626a48e98f2ed49f7b0c7cf0ad.tar.bz2
abc-58e1041ad85add626a48e98f2ed49f7b0c7cf0ad.zip
Modified command 'eliminate' to perform traditional 'eliminate -1'.
Diffstat (limited to 'src/base')
-rw-r--r--src/base/abc/abcMinBase.c30
-rw-r--r--src/base/abci/abc.c30
2 files changed, 48 insertions, 12 deletions
diff --git a/src/base/abc/abcMinBase.c b/src/base/abc/abcMinBase.c
index 2cfabc41..7f43e24f 100644
--- a/src/base/abc/abcMinBase.c
+++ b/src/base/abc/abcMinBase.c
@@ -511,6 +511,14 @@ int Abc_NodeCountAppearances( Abc_Obj_t * pFanin, Abc_Obj_t * pFanout )
assert( iFanin >= 0 && iFanin < Hop_ManPiNum(pMan) );
return Hop_ObjFanoutCount( (Hop_Obj_t *)pFanout->pData, Hop_IthVar(pMan, iFanin) );
}
+int Abc_NodeCountAppearancesAll( Abc_Obj_t * pNode )
+{
+ Abc_Obj_t * pFanout;
+ int i, Count = 0;
+ Abc_ObjForEachFanout( pNode, pFanout, i )
+ Count += Abc_NodeCountAppearances( pNode, pFanout );
+ return Count;
+}
/**Function*************************************************************
@@ -570,7 +578,7 @@ int Abc_NodeCollapse1( Abc_Obj_t * pFanin, Abc_Obj_t * pFanout, Vec_Ptr_t * vFan
Abc_NtkDeleteObj_rec( pFanout, 1 );
return 1;
}
-int Abc_NtkEliminate1( Abc_Ntk_t * pNtk, int nMaxSize, int fReverse, int fVerbose )
+int Abc_NtkEliminate1One( Abc_Ntk_t * pNtk, int ElimValue, int nMaxSize, int fReverse, int fVerbose )
{
Vec_Ptr_t * vFanouts, * vFanins, * vNodes;
Abc_Obj_t * pNode, * pFanout;
@@ -600,10 +608,10 @@ int Abc_NtkEliminate1( Abc_Ntk_t * pNtk, int nMaxSize, int fReverse, int fVerbos
if ( Abc_ObjFaninNum(pNode) > nMaxSize )
continue;
// skip nodes with more than one fanout
- if ( Abc_ObjFanoutNum(pNode) != 1 )
- continue;
+// if ( Abc_ObjFanoutNum(pNode) != 1 )
+// continue;
// skip nodes that appear in the FF of their fanout more than once
- if ( Abc_NodeCountAppearances( pNode, Abc_ObjFanout(pNode, 0) ) != 1 )
+ if ( Abc_NodeCountAppearancesAll( pNode ) > ElimValue + 2 )
continue;
Abc_ObjForEachFanout( pNode, pFanout, k )
if ( Abc_NodeCollapseSuppSize(pNode, pFanout, vFanins) > nMaxSize )
@@ -634,6 +642,20 @@ int Abc_NtkEliminate1( Abc_Ntk_t * pNtk, int nMaxSize, int fReverse, int fVerbos
ABC_FREE( pPermFanout );
return 1;
}
+int Abc_NtkEliminate1( Abc_Ntk_t * pNtk, int ElimValue, int nMaxSize, int fReverse, int fVerbose )
+{
+ int i;
+ for ( i = 0; i < 3; i++ )
+ {
+ int nNodes = Abc_NtkNodeNum(pNtk);
+// printf( "%d ", nNodes );
+ if ( !Abc_NtkEliminate1One(pNtk, ElimValue, nMaxSize, fReverse, fVerbose) )
+ return 0;
+ if ( nNodes == Abc_NtkNodeNum(pNtk) )
+ break;
+ }
+ return 1;
+}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c
index 242afb8c..b89a6924 100644
--- a/src/base/abci/abc.c
+++ b/src/base/abci/abc.c
@@ -3668,23 +3668,36 @@ int Abc_CommandEliminate( Abc_Frame_t * pAbc, int argc, char ** argv )
{
Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
int nMaxSize;
+ int ElimValue;
int fGreedy;
int fReverse;
int fVerbose;
int c;
extern int Abc_NtkEliminate( Abc_Ntk_t * pNtk, int nMaxSize, int fReverse, int fVerbose );
- extern int Abc_NtkEliminate1( Abc_Ntk_t * pNtk, int nMaxSize, int fReverse, int fVerbose );
+ extern int Abc_NtkEliminate1( Abc_Ntk_t * pNtk, int ElimValue, int nMaxSize, int fReverse, int fVerbose );
// set the defaults
- nMaxSize = 30;
- fGreedy = 0;
- fReverse = 0;
- fVerbose = 0;
+ nMaxSize = 30;
+ ElimValue = -1;
+ fGreedy = 0;
+ fReverse = 0;
+ fVerbose = 0;
Extra_UtilGetoptReset();
- while ( (c = Extra_UtilGetopt(argc, argv, "Ngrvh")) != EOF )
+ while ( (c = Extra_UtilGetopt(argc, argv, "VNgrvh")) != EOF )
{
switch (c)
{
+ case 'V':
+ if ( globalUtilOptind >= argc )
+ {
+ Abc_Print( -1, "Command line switch \"-V\" should be followed by an integer that is -1 or larger.\n" );
+ goto usage;
+ }
+ ElimValue = atoi(argv[globalUtilOptind]);
+ globalUtilOptind++;
+ if ( ElimValue < -1 )
+ goto usage;
+ break;
case 'N':
if ( globalUtilOptind >= argc )
{
@@ -3734,13 +3747,14 @@ int Abc_CommandEliminate( Abc_Frame_t * pAbc, int argc, char ** argv )
if ( fGreedy )
Abc_NtkEliminate( pNtk, nMaxSize, fReverse, fVerbose );
else
- Abc_NtkEliminate1( pNtk, nMaxSize, fReverse, fVerbose );
+ Abc_NtkEliminate1( pNtk, ElimValue, nMaxSize, fReverse, fVerbose );
return 0;
usage:
- Abc_Print( -2, "usage: eliminate [-N <num>] [-grvh]\n");
+ Abc_Print( -2, "usage: eliminate [-VN <num>] [-grvh]\n");
Abc_Print( -2, "\t traditional \"eliminate -1\", which collapses the node into its fanout\n");
Abc_Print( -2, "\t if the node's variable appears in the fanout's factored form only once\n");
+ Abc_Print( -2, "\t-V <num> : the \"value\" parameter used by \"eliminate\" in SIS [default = %d]\n", ElimValue );
Abc_Print( -2, "\t-N <num> : the maximum node support after collapsing [default = %d]\n", nMaxSize );
Abc_Print( -2, "\t-g : toggle using greedy eliminate (without \"value\") [default = %s]\n", fGreedy? "yes": "no" );
Abc_Print( -2, "\t-r : use the reverse topological order [default = %s]\n", fReverse? "yes": "no" );