summaryrefslogtreecommitdiffstats
path: root/src/map/super/super.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2012-02-29 16:44:16 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2012-02-29 16:44:16 -0800
commitb90f1c73ae22bd44965dd48eb5f42fed98278e2b (patch)
treec32e418b7ac0b3e1881210fad6816866c18c66dc /src/map/super/super.c
parentb30791ba622cd9b4f5eed1caf8a9567f2b3ad3a4 (diff)
downloadabc-b90f1c73ae22bd44965dd48eb5f42fed98278e2b.tar.gz
abc-b90f1c73ae22bd44965dd48eb5f42fed98278e2b.tar.bz2
abc-b90f1c73ae22bd44965dd48eb5f42fed98278e2b.zip
Adding switch -N to 'super' to set an upper bound on the number of supergates generated.
Diffstat (limited to 'src/map/super/super.c')
-rw-r--r--src/map/super/super.c74
1 files changed, 41 insertions, 33 deletions
diff --git a/src/map/super/super.c b/src/map/super/super.c
index 2cbf0718..ff95a6c5 100644
--- a/src/map/super/super.c
+++ b/src/map/super/super.c
@@ -94,17 +94,17 @@ int Super_CommandSupergatesAnd( Abc_Frame_t * pAbc, int argc, char **argv )
nLevels = 3;
fVerbose = 0;
Extra_UtilGetoptReset();
- while ( (c = Extra_UtilGetopt(argc, argv, "ilvh")) != EOF )
+ while ( (c = Extra_UtilGetopt(argc, argv, "ILvh")) != EOF )
{
switch (c)
{
- case 'i':
+ case 'I':
nVarsMax = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( nVarsMax < 0 )
goto usage;
break;
- case 'l':
+ case 'L':
nLevels = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( nLevels < 0 )
@@ -126,10 +126,10 @@ int Super_CommandSupergatesAnd( Abc_Frame_t * pAbc, int argc, char **argv )
return 0;
usage:
- fprintf( pErr, "usage: super2 [-i num] [-l num] [-vh]\n");
+ fprintf( pErr, "usage: super2 [-IL num] [-vh]\n");
fprintf( pErr, "\t precomputes the supergates composed of AND2s and INVs\n" );
- fprintf( pErr, "\t-i num : the max number of inputs to the supergate [default = %d]\n", nVarsMax );
- fprintf( pErr, "\t-l num : the max number of logic levels of gates [default = %d]\n", nLevels );
+ fprintf( pErr, "\t-I num : the max number of inputs to the supergate [default = %d]\n", nVarsMax );
+ fprintf( pErr, "\t-L num : the max number of logic levels of gates [default = %d]\n", nLevels );
fprintf( pErr, "\t-v : enable verbose output\n");
fprintf( pErr, "\t-h : print the help message\n");
return 1; /* error exit */
@@ -157,7 +157,7 @@ int Super_CommandSupergates( Abc_Frame_t * pAbc, int argc, char **argv )
float AreaLimit;
int fSkipInvs;
int fWriteOldFormat;
- int nVarsMax, nLevels, TimeLimit;
+ int nVarsMax, nLevels, nGatesMax, TimeLimit;
int fVerbose;
int c;
@@ -169,6 +169,7 @@ int Super_CommandSupergates( Abc_Frame_t * pAbc, int argc, char **argv )
nLevels = 3;
DelayLimit = 3.5;
AreaLimit = 9;
+ nGatesMax = 10000;
TimeLimit = 10;
fSkipInvs = 1;
fVerbose = 0;
@@ -176,46 +177,52 @@ int Super_CommandSupergates( Abc_Frame_t * pAbc, int argc, char **argv )
ExcludeFile = 0;
Extra_UtilGetoptReset();
- while ( (c = Extra_UtilGetopt(argc, argv, "eiltdasovh")) != EOF )
+ while ( (c = Extra_UtilGetopt(argc, argv, "ILNTDAEsovh")) != EOF )
{
switch (c)
{
- case 'e':
- ExcludeFile = argv[globalUtilOptind];
- if ( ExcludeFile == 0 )
- goto usage;
- globalUtilOptind++;
- break;
- case 'i':
+ case 'I':
nVarsMax = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( nVarsMax < 0 )
goto usage;
break;
- case 'l':
+ case 'L':
nLevels = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( nLevels < 0 )
goto usage;
break;
- case 't':
+ case 'N':
+ nGatesMax = atoi(argv[globalUtilOptind]);
+ globalUtilOptind++;
+ if ( nGatesMax < 0 )
+ goto usage;
+ break;
+ case 'T':
TimeLimit = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( TimeLimit < 0 )
goto usage;
break;
- case 'd':
+ case 'D':
DelayLimit = (float)atof(argv[globalUtilOptind]);
globalUtilOptind++;
if ( DelayLimit <= 0.0 )
goto usage;
break;
- case 'a':
+ case 'A':
AreaLimit = (float)atof(argv[globalUtilOptind]);
globalUtilOptind++;
if ( AreaLimit <= 0.0 )
goto usage;
break;
+ case 'E':
+ ExcludeFile = argv[globalUtilOptind];
+ if ( ExcludeFile == 0 )
+ goto usage;
+ globalUtilOptind++;
+ break;
case 's':
fSkipInvs ^= 1;
break;
@@ -268,41 +275,42 @@ int Super_CommandSupergates( Abc_Frame_t * pAbc, int argc, char **argv )
}
// compute the gates
- Super_Precompute( pLib, nVarsMax, nLevels, DelayLimit, AreaLimit, TimeLimit, fSkipInvs, fWriteOldFormat, fVerbose );
+ Super_Precompute( pLib, nVarsMax, nLevels, nGatesMax, DelayLimit, AreaLimit, TimeLimit, fSkipInvs, fWriteOldFormat, fVerbose );
// delete the library
Mio_LibraryDelete( pLib );
return 0;
usage:
- fprintf( pErr, "usage: super [-i num] [-l num] [-d float] [-a float] [-t num] [-sovh] <genlib_file>\n");
+ fprintf( pErr, "usage: super [-ILNT num] [-DA float] [-E file] [-sovh] <genlib_file>\n");
fprintf( pErr, "\t precomputes the supergates for the given GENLIB library\n" );
- fprintf( pErr, "\t-i num : the max number of supergate inputs [default = %d]\n", nVarsMax );
- fprintf( pErr, "\t-l num : the max number of levels of gates [default = %d]\n", nLevels );
- fprintf( pErr, "\t-d float : the max delay of the supergates [default = %.2f]\n", DelayLimit );
- fprintf( pErr, "\t-a float : the max area of the supergates [default = %.2f]\n", AreaLimit );
- fprintf( pErr, "\t-t num : the approximate runtime limit in seconds [default = %d]\n", TimeLimit );
+ fprintf( pErr, "\t-I num : the max number of supergate inputs [default = %d]\n", nVarsMax );
+ fprintf( pErr, "\t-L num : the max number of levels of gates [default = %d]\n", nLevels );
+ fprintf( pErr, "\t-N num : the limit on the number of considered supergates [default = %d]\n", nGatesMax );
+ fprintf( pErr, "\t-T num : the approximate runtime limit in seconds [default = %d]\n", TimeLimit );
+ fprintf( pErr, "\t-D float : the max delay of the supergates [default = %.2f]\n", DelayLimit );
+ fprintf( pErr, "\t-A float : the max area of the supergates [default = %.2f]\n", AreaLimit );
+ fprintf( pErr, "\t-E file : file contains list of genlib gates to exclude\n" );
fprintf( pErr, "\t-s : toggle the use of inverters at the inputs [default = %s]\n", (fSkipInvs? "no": "yes") );
fprintf( pErr, "\t-o : toggle dumping the supergate library in old format [default = %s]\n", (fWriteOldFormat? "yes": "no") );
- fprintf( pErr, "\t-e file : file contains list of genlib gates to exclude\n" );
fprintf( pErr, "\t-v : enable verbose output [default = %s]\n", (fVerbose? "yes" : "no") );
fprintf( pErr, "\t-h : print the help message\n");
fprintf( pErr, "\n");
fprintf( pErr, "\tHere is a piece of advice on precomputing supergate libraries:\n");
fprintf( pErr, "\t\n");
- fprintf( pErr, "\tStart with the number of inputs equal to 5 (-i 5), the number of \n");
- fprintf( pErr, "\tlevels equal to 3 (-l 3), the delay equal to 2-3 delays of inverter, \n");
- fprintf( pErr, "\tthe area equal to 3-4 areas of two input NAND, and runtime limit equal \n");
- fprintf( pErr, "\tto 10 seconds (-t 10). Run precomputation and learn from the result.\n");
+ fprintf( pErr, "\tStart with the number of inputs equal to 5 (-I 5), the number of \n");
+ fprintf( pErr, "\tlevels equal to 2 (-L 2), the delay equal to 2-3 delays of inverter, \n");
+ fprintf( pErr, "\tthe area equal to 2-3 areas of two input NAND, and runtime limit equal \n");
+ fprintf( pErr, "\tto 10 seconds (-T 10). Run precomputation and learn from the result.\n");
fprintf( pErr, "\tDetermine what parameter is most constraining and try to increase \n");
fprintf( pErr, "\tthe value of that parameter. The goal is to have a well-balanced\n");
fprintf( pErr, "\tset of constraints and the resulting supergate library containing\n");
- fprintf( pErr, "\tapproximately 100K-200K supergates. Typically, it is better to increase\n");
+ fprintf( pErr, "\tapproximately 5K-20K supergates. Typically, it is better to increase\n");
fprintf( pErr, "\tdelay limit rather than area limit, because having large-area supergates\n");
fprintf( pErr, "\tmay result in a considerable increase in area.\n");
fprintf( pErr, "\t\n");
fprintf( pErr, "\tNote that a good supergate library for experiments typically can be \n");
- fprintf( pErr, "\tprecomputed in 30 sec. Increasing the runtime limit makes sense when\n");
+ fprintf( pErr, "\tprecomputed in 30 sec or less. Increasing runtime limit makes sense when\n");
fprintf( pErr, "\tother parameters are well-balanced and it is needed to enumerate more\n");
fprintf( pErr, "\tchoices to have a good result. In the end, to compute the final library\n");
fprintf( pErr, "\tthe runtime can be set to 300 sec to ensure the ultimate quality.\n");