/**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] \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