blob: 7868ba78e61990d17478dd16e17919fd25d700ff [file] [log] [blame]
/**CFile****************************************************************
FileName [super.c]
PackageName [MVSIS 1.3: Multi-valued logic synthesis system.]
Synopsis [Pre-computation of supergates.]
Author [MVSIS Group]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - August 18, 2003.]
Revision [$Id: super.c,v 1.6 2004/10/30 20:51:11 satrajit Exp $]
***********************************************************************/
#include "superInt.h"
#include "base/main/mainInt.h"
#include "map/mio/mio.h"
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
static int Super_CommandSupergates ( Abc_Frame_t * pAbc, int argc, char **argv );
static int Super_CommandSupergatesAnd( Abc_Frame_t * pAbc, int argc, char **argv );
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Super_Init( Abc_Frame_t * pAbc )
{
Cmd_CommandAdd( pAbc, "SC mapping", "super", Super_CommandSupergates, 0 );
Cmd_CommandAdd( pAbc, "SC mapping", "super2", Super_CommandSupergatesAnd, 0 );
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Super_End( Abc_Frame_t * pAbc )
{
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int Super_CommandSupergatesAnd( Abc_Frame_t * pAbc, int argc, char **argv )
{
FILE * pOut, * pErr;
int nVarsMax, nLevels;
int fVerbose;
int c;
pOut = Abc_FrameReadOut(pAbc);
pErr = Abc_FrameReadErr(pAbc);
// set the defaults
nVarsMax = 4;
nLevels = 3;
fVerbose = 0;
Extra_UtilGetoptReset();
while ( (c = Extra_UtilGetopt(argc, argv, "ILvh")) != EOF )
{
switch (c)
{
case 'I':
nVarsMax = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( nVarsMax < 0 )
goto usage;
break;
case 'L':
nLevels = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( nLevels < 0 )
goto usage;
break;
case 'v':
fVerbose ^= 1;
break;
case 'h':
goto usage;
break;
default:
goto usage;
}
}
Super2_Precompute( nVarsMax, nLevels, fVerbose );
return 0;
usage:
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-v : enable verbose output\n");
fprintf( pErr, "\t-h : print the help message\n");
return 1; /* error exit */
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int Super_CommandSupergates( Abc_Frame_t * pAbc, int argc, char **argv )
{
FILE * pFile;
FILE * pOut, * pErr;
Mio_Library_t * pLib;
char * FileName, * ExcludeFile;
float DelayLimit;
float AreaLimit;
int fSkipInvs;
int fWriteOldFormat;
int nVarsMax, nLevels, nGatesMax, TimeLimit;
int fVerbose;
int c;
pOut = Abc_FrameReadOut(pAbc);
pErr = Abc_FrameReadErr(pAbc);
// set the defaults
nVarsMax = 5;
nLevels = 2;
DelayLimit = 0;
AreaLimit = 0;
nGatesMax = 0;
TimeLimit = 0;
fSkipInvs = 1;
fVerbose = 0;
fWriteOldFormat = 0;
ExcludeFile = 0;
Extra_UtilGetoptReset();
while ( (c = Extra_UtilGetopt(argc, argv, "ILNTDAEsovh")) != EOF )
{
switch (c)
{
case 'I':
nVarsMax = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( nVarsMax < 0 )
goto usage;
break;
case 'L':
nLevels = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( nLevels < 0 )
goto usage;
break;
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':
DelayLimit = (float)atof(argv[globalUtilOptind]);
globalUtilOptind++;
if ( DelayLimit <= 0.0 )
goto usage;
break;
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;
case 'o':
fWriteOldFormat ^= 1;
break;
case 'v':
fVerbose ^= 1;
break;
case 'h':
goto usage;
break;
default:
goto usage;
}
}
if ( argc != globalUtilOptind + 1 )
{
fprintf( pErr, "The genlib library file should be given on the command line.\n" );
goto usage;
}
if ( nVarsMax < 2 || nVarsMax > 6 )
{
fprintf( pErr, "The max number of variables (%d) should be more than 1 and less than 7.\n", nVarsMax );
goto usage;
}
// get the input file name
FileName = argv[globalUtilOptind];
if ( (pFile = Io_FileOpen( FileName, "open_path", "r", 0 )) == NULL )
// if ( (pFile = fopen( FileName, "r" )) == NULL )
{
fprintf( pErr, "Cannot open input file \"%s\". ", FileName );
if (( FileName = Extra_FileGetSimilarName( FileName, ".genlib", ".lib", ".gen", ".g", NULL ) ))
fprintf( pErr, "Did you mean \"%s\"?", FileName );
fprintf( pErr, "\n" );
return 1;
}
fclose( pFile );
// set the new network
pLib = Mio_LibraryRead( FileName, NULL, ExcludeFile, fVerbose );
if ( pLib == NULL )
{
fprintf( pErr, "Reading library has failed.\n" );
goto usage;
}
// compute the gates
FileName = Extra_FileNameGenericAppend(Mio_LibraryReadName(pLib), ".super");
Super_Precompute( pLib, nVarsMax, nLevels, nGatesMax, DelayLimit, AreaLimit, TimeLimit, fSkipInvs, fVerbose, FileName );
// delete the library
Mio_LibraryDelete( pLib );
return 0;
usage:
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-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-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 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 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 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");
fprintf( pErr, "\tIn some cases, the runtime has to be reduced if the supergate library\n");
fprintf( pErr, "\tcontains too many supergates (> 500K).\n");
fprintf( pErr, "\t\n");
fprintf( pErr, "\tWhen precomputing libraries of 6 inputs (-i 6), start with even more \n");
fprintf( pErr, "\trestricted parameters and gradually increase them until the goal is met.\n");
fprintf( pErr, "\t\n");
return 1; /* error exit */
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END