From b90f1c73ae22bd44965dd48eb5f42fed98278e2b Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Wed, 29 Feb 2012 16:44:16 -0800 Subject: Adding switch -N to 'super' to set an upper bound on the number of supergates generated. --- src/map/super/super.c | 74 ++++++++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 33 deletions(-) (limited to 'src/map/super/super.c') 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] \n"); + fprintf( pErr, "usage: super [-ILNT num] [-DA float] [-E file] [-sovh] \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"); -- cgit v1.2.3