blob: a00424432e90a5c05df663782c943a35a3134dca [file] [log] [blame]
/**CFile****************************************************************
FileName [cmd.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Command processing package.]
Synopsis [Command file.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: cmd.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#ifdef WIN32
#include <process.h>
#else
#include <unistd.h>
#endif
#include "base/abc/abc.h"
#include "base/main/mainInt.h"
#include "cmdInt.h"
#include "misc/util/utilSignal.h"
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
static int CmdCommandTime ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandEcho ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandQuit ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandAbcrc ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandHistory ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandAlias ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandUnalias ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandHelp ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandSource ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandSetVariable ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandUnsetVariable ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandUndo ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandRecall ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandEmpty ( Abc_Frame_t * pAbc, int argc, char ** argv );
#if defined(WIN32) && !defined(__cplusplus)
static int CmdCommandScanDir ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandRenameFiles ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandLs ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandScrGen ( Abc_Frame_t * pAbc, int argc, char ** argv );
#endif
static int CmdCommandVersion ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandSis ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandMvsis ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandCapo ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandStarter ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int CmdCommandAutoTuner ( Abc_Frame_t * pAbc, int argc, char ** argv );
extern int Cmd_CommandAbcLoadPlugIn( Abc_Frame_t * pAbc, int argc, char ** argv );
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function********************************************************************
Synopsis [Initializes the command package.]
SideEffects [Commands are added to the command table.]
SeeAlso [Cmd_End]
******************************************************************************/
void Cmd_Init( Abc_Frame_t * pAbc )
{
pAbc->tCommands = st__init_table(strcmp, st__strhash);
pAbc->tAliases = st__init_table(strcmp, st__strhash);
pAbc->tFlags = st__init_table(strcmp, st__strhash);
pAbc->aHistory = Vec_PtrAlloc( 100 );
Cmd_HistoryRead( pAbc );
Cmd_CommandAdd( pAbc, "Basic", "time", CmdCommandTime, 0 );
Cmd_CommandAdd( pAbc, "Basic", "echo", CmdCommandEcho, 0 );
Cmd_CommandAdd( pAbc, "Basic", "quit", CmdCommandQuit, 0 );
Cmd_CommandAdd( pAbc, "Basic", "abcrc", CmdCommandAbcrc, 0 );
Cmd_CommandAdd( pAbc, "Basic", "history", CmdCommandHistory, 0 );
Cmd_CommandAdd( pAbc, "Basic", "alias", CmdCommandAlias, 0 );
Cmd_CommandAdd( pAbc, "Basic", "unalias", CmdCommandUnalias, 0 );
Cmd_CommandAdd( pAbc, "Basic", "help", CmdCommandHelp, 0 );
Cmd_CommandAdd( pAbc, "Basic", "source", CmdCommandSource, 0 );
Cmd_CommandAdd( pAbc, "Basic", "set", CmdCommandSetVariable, 0 );
Cmd_CommandAdd( pAbc, "Basic", "unset", CmdCommandUnsetVariable, 0 );
Cmd_CommandAdd( pAbc, "Basic", "undo", CmdCommandUndo, 0 );
Cmd_CommandAdd( pAbc, "Basic", "recall", CmdCommandRecall, 0 );
Cmd_CommandAdd( pAbc, "Basic", "empty", CmdCommandEmpty, 0 );
#if defined(WIN32) && !defined(__cplusplus)
Cmd_CommandAdd( pAbc, "Basic", "scandir", CmdCommandScanDir, 0 );
Cmd_CommandAdd( pAbc, "Basic", "renamefiles", CmdCommandRenameFiles, 0 );
Cmd_CommandAdd( pAbc, "Basic", "ls", CmdCommandLs, 0 );
Cmd_CommandAdd( pAbc, "Basic", "scrgen", CmdCommandScrGen, 0 );
#endif
Cmd_CommandAdd( pAbc, "Basic", "version", CmdCommandVersion, 0 );
Cmd_CommandAdd( pAbc, "Various", "sis", CmdCommandSis, 1 );
Cmd_CommandAdd( pAbc, "Various", "mvsis", CmdCommandMvsis, 1 );
Cmd_CommandAdd( pAbc, "Various", "capo", CmdCommandCapo, 0 );
Cmd_CommandAdd( pAbc, "Various", "starter", CmdCommandStarter, 0 );
Cmd_CommandAdd( pAbc, "Various", "autotuner", CmdCommandAutoTuner, 0 );
Cmd_CommandAdd( pAbc, "Various", "load_plugin", Cmd_CommandAbcLoadPlugIn, 0 );
}
/**Function********************************************************************
Synopsis [Ends the command package.]
Description [Ends the command package. Tables are freed.]
SideEffects []
SeeAlso []
******************************************************************************/
void Cmd_End( Abc_Frame_t * pAbc )
{
st__generator * gen;
char * pKey, * pValue;
Cmd_HistoryWrite( pAbc, ABC_INFINITY );
// st__free_table( pAbc->tCommands, (void (*)()) 0, CmdCommandFree );
// st__free_table( pAbc->tAliases, (void (*)()) 0, CmdCommandAliasFree );
// st__free_table( pAbc->tFlags, free, free );
st__foreach_item( pAbc->tCommands, gen, (const char **)&pKey, (char **)&pValue )
CmdCommandFree( (Abc_Command *)pValue );
st__free_table( pAbc->tCommands );
st__foreach_item( pAbc->tAliases, gen, (const char **)&pKey, (char **)&pValue )
CmdCommandAliasFree( (Abc_Alias *)pValue );
st__free_table( pAbc->tAliases );
st__foreach_item( pAbc->tFlags, gen, (const char **)&pKey, (char **)&pValue )
ABC_FREE( pKey ), ABC_FREE( pValue );
st__free_table( pAbc->tFlags );
Vec_PtrFreeFree( pAbc->aHistory );
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandTime( Abc_Frame_t * pAbc, int argc, char **argv )
{
int c;
int fClear;
fClear = 0;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "ch" ) ) != EOF )
{
switch ( c )
{
case 'c':
fClear ^= 1;
break;
case 'h':
goto usage;
default:
goto usage;
}
}
if ( fClear )
{
pAbc->TimeTotal += pAbc->TimeCommand;
pAbc->TimeCommand = 0.0;
return 0;
}
if ( argc != globalUtilOptind )
{
goto usage;
}
pAbc->TimeTotal += pAbc->TimeCommand;
fprintf( pAbc->Out, "elapse: %3.2f seconds, total: %3.2f seconds\n",
pAbc->TimeCommand, pAbc->TimeTotal );
/*
{
FILE * pTable;
pTable = fopen( "runtimes.txt", "a+" );
fprintf( pTable, "%4.2f\n", pAbc->TimeCommand );
fclose( pTable );
}
*/
pAbc->TimeCommand = 0.0;
return 0;
usage:
fprintf( pAbc->Err, "usage: time [-ch]\n" );
fprintf( pAbc->Err, " \t\tprint the runtime since the last call\n" );
fprintf( pAbc->Err, " -c \t\tclears the elapsed time without printing it\n" );
fprintf( pAbc->Err, " -h \t\tprint the command usage\n" );
return 1;
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandEcho( Abc_Frame_t * pAbc, int argc, char **argv )
{
int i;
int c;
int n = 1;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "hn" ) ) != EOF )
{
switch ( c )
{
case 'n':
n = 0;
break;
case 'h':
goto usage;
break;
default:
goto usage;
}
}
if (pAbc->Out == stdout){
for ( i = globalUtilOptind; i < argc; i++ )
Abc_Print( 1, "%s ", argv[i] );
if ( n )
Abc_Print( 1, "\n" );
}else{
for ( i = globalUtilOptind; i < argc; i++ )
fprintf( pAbc->Out, "%s ", argv[i] );
if ( n )
fprintf( pAbc->Out, "\n" );
fflush ( pAbc->Out );
}
return 0;
usage:
fprintf( pAbc->Err, "usage: echo [-h] string \n" );
fprintf( pAbc->Err, " -n \t\tsuppress newline at the end\n" );
fprintf( pAbc->Err, " -h \t\tprint the command usage\n" );
return ( 1 );
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandQuit( Abc_Frame_t * pAbc, int argc, char **argv )
{
int c;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "hs" ) ) != EOF )
{
switch ( c )
{
case 'h':
goto usage;
break;
case 's':
return -2;
break;
default:
goto usage;
}
}
if ( argc != globalUtilOptind )
goto usage;
return -1;
usage:
fprintf( pAbc->Err, "usage: quit [-sh]\n" );
fprintf( pAbc->Err, " -h print the command usage\n" );
fprintf( pAbc->Err, " -s frees all the memory before quitting\n" );
return 1;
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandAbcrc( Abc_Frame_t * pAbc, int argc, char **argv )
{
int c;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF )
{
switch ( c )
{
case 'h':
goto usage;
break;
default:
goto usage;
}
}
Abc_UtilsSource( pAbc );
return 0;
usage:
fprintf( pAbc->Err, "usage: abcrc [-h]\n" );
fprintf( pAbc->Err, " -h sources \"abc.rc\" from the current/parent/grandparent directory\n" );
return 1;
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandHistory( Abc_Frame_t * pAbc, int argc, char **argv )
{
char * pName;
int i, c;
int nPrints = 20;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF )
{
switch ( c )
{
case 'h':
goto usage;
default :
goto usage;
}
}
if ( argc > globalUtilOptind + 1 )
goto usage;
// get the number from the command line
if ( argc == globalUtilOptind + 1 )
nPrints = atoi(argv[globalUtilOptind]);
// print the commands
Vec_PtrForEachEntryStart( char *, pAbc->aHistory, pName, i, Abc_MaxInt(0, Vec_PtrSize(pAbc->aHistory)-nPrints) )
fprintf( pAbc->Out, "%2d : %s\n", Vec_PtrSize(pAbc->aHistory)-i, pName );
return 0;
usage:
fprintf( pAbc->Err, "usage: history [-h] <num>\n" );
fprintf( pAbc->Err, "\t lists the last commands entered on the command line\n" );
fprintf( pAbc->Err, "\t-h : print the command usage\n" );
fprintf( pAbc->Err, "\t<num> : the maximum number of entries to show [default = %d]\n", nPrints );
return ( 1 );
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandAlias( Abc_Frame_t * pAbc, int argc, char **argv )
{
const char *key;
char *value;
int c;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF )
{
switch ( c )
{
case 'h':
goto usage;
break;
default:
goto usage;
}
}
if ( argc == 1 )
{
CmdPrintTable( pAbc->tAliases, 1 );
return 0;
}
else if ( argc == 2 )
{
if ( st__lookup( pAbc->tAliases, argv[1], &value ) )
CmdCommandAliasPrint( pAbc, ( Abc_Alias * ) value );
return 0;
}
// delete any existing alias
key = argv[1];
if ( st__delete( pAbc->tAliases, &key, &value ) )
CmdCommandAliasFree( ( Abc_Alias * ) value );
CmdCommandAliasAdd( pAbc, argv[1], argc - 2, argv + 2 );
return 0;
usage:
fprintf( pAbc->Err, "usage: alias [-h] [command [string]]\n" );
fprintf( pAbc->Err, " -h \t\tprint the command usage\n" );
return ( 1 );
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandUnalias( Abc_Frame_t * pAbc, int argc, char **argv )
{
int i;
const char *key;
char *value;
int c;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF )
{
switch ( c )
{
case 'h':
goto usage;
break;
default:
goto usage;
}
}
if ( argc < 2 )
{
goto usage;
}
for ( i = 1; i < argc; i++ )
{
key = argv[i];
if ( st__delete( pAbc->tAliases, &key, &value ) )
{
CmdCommandAliasFree( ( Abc_Alias * ) value );
}
}
return 0;
usage:
fprintf( pAbc->Err, "usage: unalias [-h] alias_names\n" );
fprintf( pAbc->Err, " -h \t\tprint the command usage\n" );
return 1;
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandHelp( Abc_Frame_t * pAbc, int argc, char **argv )
{
int fPrintAll, fDetails;
int c;
fPrintAll = 0;
fDetails = 0;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "adh" ) ) != EOF )
{
switch ( c )
{
case 'a':
case 'v':
fPrintAll ^= 1;
break;
break;
case 'd':
fDetails ^= 1;
break;
case 'h':
goto usage;
break;
default:
goto usage;
}
}
if ( argc != globalUtilOptind )
goto usage;
CmdCommandPrint( pAbc, fPrintAll, fDetails );
return 0;
usage:
fprintf( pAbc->Err, "usage: help [-a] [-d] [-h]\n" );
fprintf( pAbc->Err, " prints the list of available commands by group\n" );
fprintf( pAbc->Err, " -a toggle printing hidden commands [default = %s]\n", fPrintAll? "yes": "no" );
fprintf( pAbc->Err, " -d print usage details to all commands [default = %s]\n", fDetails? "yes": "no" );
fprintf( pAbc->Err, " -h print the command usage\n" );
return 1;
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandSource( Abc_Frame_t * pAbc, int argc, char **argv )
{
int c, echo, prompt, silent, interactive, quit_count, lp_count;
int status = 0; /* initialize so that lint doesn't complain */
int lp_file_index, did_subst;
char *prompt_string, *real_filename, line[ABC_MAX_STR], *command;
FILE *fp;
interactive = silent = prompt = echo = 0;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "ipsxh" ) ) != EOF )
{
switch ( c )
{
case 'i': /* a hack to distinguish EOF from stdin */
interactive = 1;
break;
case 'p':
prompt ^= 1;
break;
case 's':
silent ^= 1;
break;
case 'x':
echo ^= 1;
break;
case 'h':
goto usage;
default:
goto usage;
}
}
/* added to avoid core-dumping when no script file is specified */
if ( argc == globalUtilOptind )
{
goto usage;
}
lp_file_index = globalUtilOptind;
lp_count = 0;
/*
* FIX (Tom, 5/7/95): I'm not sure what the purpose of this outer do loop
* is. In particular, lp_file_index is never modified in the loop, so it
* looks it would just read the same file over again. Also, SIS had
* lp_count initialized to -1, and hence, any file sourced by SIS (if -l or
* -t options on "source" were used in SIS) would actually be executed twice.
*/
pAbc->fSource = 1;
do
{
char * pFileName, * pTemp;
// get the input file name
pFileName = argv[lp_file_index];
// fix the wrong symbol
for ( pTemp = pFileName; *pTemp; pTemp++ )
if ( *pTemp == '>' )
*pTemp = '\\';
lp_count++; /* increment the loop counter */
fp = CmdFileOpen( pAbc, pFileName, "r", &real_filename, silent );
if ( fp == NULL )
{
pAbc->fSource = 0;
ABC_FREE( real_filename );
return !silent; /* error return if not silent */
}
quit_count = 0;
do
{
if ( prompt )
{
prompt_string = Cmd_FlagReadByName( pAbc, "prompt" );
if ( prompt_string == NULL )
prompt_string = "abc> ";
}
else
{
prompt_string = NULL;
}
/* clear errors -- e.g., EOF reached from stdin */
clearerr( fp );
/* read another command line */
if ( fgets( line, ABC_MAX_STR, fp ) == NULL )
{
if ( interactive )
{
if ( quit_count++ < 5 )
{
fprintf( pAbc->Err, "\nUse \"quit\" to leave ABC.\n" );
continue;
}
status = -1; /* fake a 'quit' */
}
else
{
status = 0; /* successful end of 'source' ; loop? */
}
break;
}
quit_count = 0;
if ( echo )
{
fprintf( pAbc->Out, "abc - > %s", line );
}
command = CmdHistorySubstitution( pAbc, line, &did_subst );
if ( command == NULL )
{
status = 1;
break;
}
if ( did_subst )
{
if ( interactive )
{
fprintf( pAbc->Out, "%s\n", command );
}
}
if ( command != line )
{
strcpy( line, command );
}
if ( interactive && *line != '\0' )
{
Cmd_HistoryAddCommand( pAbc, line );
if ( pAbc->Hst != NULL )
{
fprintf( pAbc->Hst, "%s\n", line );
fflush( pAbc->Hst );
}
}
fflush( pAbc->Out );
status = Cmd_CommandExecute( pAbc, line );
}
while ( status == 0 );
if ( fp != stdin )
{
if ( status > 0 )
{
fprintf( pAbc->Err,
"** cmd error: aborting 'source %s'\n",
real_filename );
}
fclose( fp );
}
ABC_FREE( real_filename );
}
while ( ( status == 0 ) && ( lp_count <= 0 ) );
pAbc->fSource = 0;
return status;
usage:
fprintf( pAbc->Err, "usage: source [-psxh] <file_name>\n" );
fprintf( pAbc->Err, "\t-p supply prompt before reading each line [default = %s]\n", prompt? "yes": "no" );
fprintf( pAbc->Err, "\t-s silently ignore nonexistant file [default = %s]\n", silent? "yes": "no" );
fprintf( pAbc->Err, "\t-x echo each line as it is executed [default = %s]\n", echo? "yes": "no" );
fprintf( pAbc->Err, "\t-h print the command usage\n" );
return 1;
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandSetVariable( Abc_Frame_t * pAbc, int argc, char **argv )
{
char *flag_value, *value;
const char* key;
int c;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF )
{
switch ( c )
{
case 'h':
goto usage;
default:
goto usage;
}
}
if ( argc == 0 || argc > 3 )
{
goto usage;
}
else if ( argc == 1 )
{
CmdPrintTable( pAbc->tFlags, 0 );
return 0;
}
else
{
key = argv[1];
if ( st__delete( pAbc->tFlags, &key, &value ) )
{
ABC_FREE( key );
ABC_FREE( value );
}
flag_value = argc == 2 ? Extra_UtilStrsav( "" ) : Extra_UtilStrsav( argv[2] );
// flag_value = argc == 2 ? NULL : Extra_UtilStrsav(argv[2]);
st__insert( pAbc->tFlags, Extra_UtilStrsav(argv[1]), flag_value );
if ( strcmp( argv[1], "abcout" ) == 0 )
{
if ( pAbc->Out != stdout )
fclose( pAbc->Out );
if ( strcmp( flag_value, "" ) == 0 )
flag_value = "-";
pAbc->Out = CmdFileOpen( pAbc, flag_value, "w", NULL, 0 );
if ( pAbc->Out == NULL )
pAbc->Out = stdout;
#if HAVE_SETVBUF
setvbuf( pAbc->Out, ( char * ) NULL, _IOLBF, 0 );
#endif
}
if ( strcmp( argv[1], "abcerr" ) == 0 )
{
if ( pAbc->Err != stderr )
fclose( pAbc->Err );
if ( strcmp( flag_value, "" ) == 0 )
flag_value = "-";
pAbc->Err = CmdFileOpen( pAbc, flag_value, "w", NULL, 0 );
if ( pAbc->Err == NULL )
pAbc->Err = stderr;
#if HAVE_SETVBUF
setvbuf( pAbc->Err, ( char * ) NULL, _IOLBF, 0 );
#endif
}
if ( strcmp( argv[1], "history" ) == 0 )
{
if ( pAbc->Hst != NULL )
fclose( pAbc->Hst );
if ( strcmp( flag_value, "" ) == 0 )
pAbc->Hst = NULL;
else
{
pAbc->Hst = CmdFileOpen( pAbc, flag_value, "w", NULL, 0 );
if ( pAbc->Hst == NULL )
pAbc->Hst = NULL;
}
}
return 0;
}
usage:
fprintf( pAbc->Err, "usage: set [-h] <name> <value>\n" );
fprintf( pAbc->Err, "\t sets the value of parameter <name>\n" );
fprintf( pAbc->Err, "\t-h : print the command usage\n" );
return 1;
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandUnsetVariable( Abc_Frame_t * pAbc, int argc, char **argv )
{
int i;
const char *key;
char *value;
int c;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF )
{
switch ( c )
{
case 'h':
goto usage;
break;
default:
goto usage;
}
}
if ( argc < 2 )
{
goto usage;
}
for ( i = 1; i < argc; i++ )
{
key = argv[i];
if ( st__delete( pAbc->tFlags, &key, &value ) )
{
ABC_FREE( key );
ABC_FREE( value );
}
}
return 0;
usage:
fprintf( pAbc->Err, "usage: unset [-h] <name> \n" );
fprintf( pAbc->Err, "\t removes the value of parameter <name>\n" );
fprintf( pAbc->Err, "\t-h : print the command usage\n" );
return 1;
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandUndo( Abc_Frame_t * pAbc, int argc, char **argv )
{
if ( argc == 2 && !strcmp(argv[1], "-h") )
goto usage;
if ( pAbc->pNtkCur == NULL )
{
fprintf( pAbc->Out, "Empty network.\n" );
return 0;
}
// if there are no arguments on the command line
// set the current network to be the network from the previous step
if ( argc == 1 )
return CmdCommandRecall( pAbc, argc, argv );
usage:
fprintf( pAbc->Err, "usage: undo\n" );
fprintf( pAbc->Err, " sets the current network to be the previously saved network\n" );
return 1;
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandRecall( Abc_Frame_t * pAbc, int argc, char **argv )
{
Abc_Ntk_t * pNtk;
int iStep, iStepFound;
int nNetsToSave, c;
char * pValue;
int iStepStart, iStepStop;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF )
{
switch ( c )
{
case 'h':
goto usage;
default:
goto usage;
}
}
if ( pAbc->pNtkCur == NULL )
{
fprintf( pAbc->Out, "Empty network.\n" );
return 0;
}
// get the number of networks to save
pValue = Cmd_FlagReadByName( pAbc, "savesteps" );
// if the value of steps to save is not set, assume 1-level undo
if ( pValue == NULL )
nNetsToSave = 1;
else
nNetsToSave = atoi(pValue);
// if there are no arguments on the command line
// set the current network to be the network from the previous step
if ( argc == 1 )
{
// get the previously saved network
pNtk = Abc_NtkBackup(pAbc->pNtkCur);
if ( pNtk == NULL )
fprintf( pAbc->Out, "There is no previously saved network.\n" );
else // set the current network to be the copy of the previous one
Abc_FrameSetCurrentNetwork( pAbc, Abc_NtkDup(pNtk) );
return 0;
}
if ( argc == 2 ) // the second argument is the number of the step to return to
{
// read the number of the step to return to
iStep = atoi(argv[1]);
// check whether it is reasonable
if ( iStep >= pAbc->nSteps )
{
iStepStart = pAbc->nSteps - nNetsToSave;
if ( iStepStart <= 0 )
iStepStart = 1;
iStepStop = pAbc->nSteps;
if ( iStepStop <= 0 )
iStepStop = 1;
if ( iStepStart == iStepStop )
fprintf( pAbc->Out, "Can only recall step %d.\n", iStepStop );
else
fprintf( pAbc->Out, "Can only recall steps %d-%d.\n", iStepStart, iStepStop );
}
else if ( iStep < 0 )
fprintf( pAbc->Out, "Cannot recall step %d.\n", iStep );
else if ( iStep == 0 )
Abc_FrameDeleteAllNetworks( pAbc );
else
{
// scroll backward through the list of networks
// to determine if such a network exist
iStepFound = 0;
for ( pNtk = pAbc->pNtkCur; pNtk; pNtk = Abc_NtkBackup(pNtk) )
if ( (iStepFound = Abc_NtkStep(pNtk)) == iStep )
break;
if ( pNtk == NULL )
{
iStepStart = iStepFound;
if ( iStepStart <= 0 )
iStepStart = 1;
iStepStop = pAbc->nSteps;
if ( iStepStop <= 0 )
iStepStop = 1;
if ( iStepStart == iStepStop )
fprintf( pAbc->Out, "Can only recall step %d.\n", iStepStop );
else
fprintf( pAbc->Out, "Can only recall steps %d-%d.\n", iStepStart, iStepStop );
}
else
Abc_FrameSetCurrentNetwork( pAbc, Abc_NtkDup(pNtk) );
}
return 0;
}
usage:
fprintf( pAbc->Err, "usage: recall -h <num>\n" );
fprintf( pAbc->Err, " set the current network to be one of the previous networks\n" );
fprintf( pAbc->Err, "<num> : level to return to [default = previous]\n" );
fprintf( pAbc->Err, " -h : print the command usage\n");
return 1;
}
/**Function********************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandEmpty( Abc_Frame_t * pAbc, int argc, char **argv )
{
int c;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF )
{
switch ( c )
{
case 'h':
goto usage;
default:
goto usage;
}
}
Abc_FrameDeleteAllNetworks( pAbc );
Abc_FrameRestart( pAbc );
return 0;
usage:
fprintf( pAbc->Err, "usage: empty [-h]\n" );
fprintf( pAbc->Err, " removes all the currently stored networks\n" );
fprintf( pAbc->Err, " -h : print the command usage\n");
return 1;
}
#if 0
/**Function********************************************************************
Synopsis [Donald's version.]
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandUndo( Abc_Frame_t * pAbc, int argc, char **argv )
{
Abc_Ntk_t * pNtkTemp;
int id, c;
while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF )
{
switch ( c )
{
case 'h':
goto usage;
break;
default:
goto usage;
}
}
if (globalUtilOptind <= argc) {
pNtkTemp = pAbc->pNtk;
pAbc->pNtk = pAbc->pNtkSaved;
pAbc->pNtkSaved = pNtkTemp;
}
id = atoi(argv[globalUtilOptind]);
pNtkTemp = Cmd_HistoryGetSnapshot(pAbc, id);
if (!pNtkTemp)
fprintf( pAbc->Err, "Snapshot %d does not exist\n", id);
else
pAbc->pNtk = Abc_NtkDup(pNtkTemp, Abc_NtkMan(pNtkTemp));
return 0;
usage:
fprintf( pAbc->Err, "usage: undo\n" );
fprintf( pAbc->Err, " swaps the current network and the backup network\n" );
return 1;
}
#endif
#if defined(WIN32) && !defined(__cplusplus)
#include <direct.h>
#include <io.h>
/**Function*************************************************************
Synopsis [Command to print the contents of the current directory (Windows).]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int CmdCommandScanDir( Abc_Frame_t * pAbc, int argc, char **argv )
{
struct _finddata_t c_file;
char * pDirStr = NULL;
char* pDirCur = NULL;
long hFile;
char c;
Extra_UtilGetoptReset();
while ( (c = Extra_UtilGetopt(argc, argv, "D") ) != EOF )
{
switch (c)
{
case 'D':
if ( globalUtilOptind >= argc )
{
fprintf( pAbc->Err, "Command line switch \"-D\" should be followed by a string.\n" );
goto usage;
}
pDirStr = argv[globalUtilOptind];
globalUtilOptind++;
break;
default:
goto usage;
}
}
if ( pDirStr )
{
if( (pDirCur = _getcwd( NULL, 0 )) == NULL )
{
printf( "Cannot read current directory\n" );
return 0;
}
if ( _chdir(pDirStr) )
{
printf( "Cannot change to directory: %s\n", pDirStr );
return 0;
}
}
if( (hFile = _findfirst( "*.txt", &c_file )) == -1L )
{
if ( pDirStr )
printf( "No .txt files in the current directory.\n" );
else
printf( "No .txt files in directory: %s\n", pDirStr );
}
else
{
do
{
FILE * pFile = fopen( c_file.name, "rb" );
char * pStr1 = "Property UNDECIDED. Time =";
char * pStr2 = "Property proved. Time =";
char * pStr3 = "Time =";
char * pBuffer, * pPlace, * pThis, * pThat;
char FileName[100];
float Time = 0;
// get the file name
sprintf( FileName, "%s", c_file.name );
pThis = strrchr( FileName, '_' );
pThat = strchr( FileName, '.' );
if ( pThis == NULL || pThat == NULL || pThis >= pThat )
{
// printf( "Something is wrong with the file name %s\n", c_file.name );
continue;
}
*pThat = 0;
pThis++;
// get the time
if ( pFile == NULL )
{
printf( "Cannot open file %s\n", c_file.name );
continue;
}
fclose( pFile );
pBuffer = Extra_FileReadContents( c_file.name );
pPlace = strstr( pBuffer, pStr1 );
if ( pPlace == NULL )
{
pPlace = strstr( pBuffer, pStr2 );
if ( pPlace == NULL )
{
pPlace = strstr( pBuffer, pStr3 );
if ( pPlace == NULL )
{
// printf( "Cannot find substrings in file %s\n", c_file.name );
ABC_FREE( pBuffer );
continue;
}
else
pPlace += strlen( pStr3 );
}
else
pPlace += strlen( pStr2 );
}
else
pPlace += strlen( pStr1 );
sscanf( pPlace, "%f", &Time );
printf( "%s %.2f\n", pThis, Time );
ABC_FREE( pBuffer );
}
while( _findnext( hFile, &c_file ) == 0 );
_findclose( hFile );
}
if ( pDirStr )
{
if ( _chdir(pDirCur) )
{
ABC_FREE( pDirCur );
printf( "Cannot change to directory: %s\n", pDirCur );
return 0;
}
ABC_FREE( pDirCur );
}
return 0;
usage:
fprintf( pAbc->Err, "usage: scandir [-D string]\n" );
fprintf( pAbc->Err, " performs custom scanning of the files in the given directory\n" );
fprintf( pAbc->Err, "\t-D str : the directory to read files from [default = current]\n" );
return 1;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int CmfFindNumber( char * pName )
{
char * pTemp;
for ( pTemp = pName; *pTemp; pTemp++ )
if ( *pTemp == '.' )
break;
if ( *pTemp == 0 )
return -1;
for ( --pTemp; pTemp > pName; pTemp-- )
if ( *pTemp < '0' || *pTemp > '9' )
{
pTemp++;
break;
}
if ( *pTemp == '.' )
return -2;
return atoi( pTemp );
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void CnfDupFileUnzip( char * pOldName )
{
extern char * Io_MvLoadFileBz2( char * pFileName, int * pnFileSize );
char pNewName[1000];
FILE * pFile;
int nFileSize;
char * pBuffer = Io_MvLoadFileBz2( pOldName, &nFileSize );
assert( strlen(pOldName) < 1000 );
sprintf( pNewName, "%s.v", pOldName );
pFile = fopen( pNewName, "wb" );
fwrite( pBuffer, nFileSize, 1, pFile );
fclose( pFile );
ABC_FREE( pBuffer );
}
/**Function*************************************************************
Synopsis [Command to print the contents of the current directory (Windows).]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int CmdCommandRenameFiles( Abc_Frame_t * pAbc, int argc, char **argv )
{
struct _finddata_t c_file;
long hFile;
char pNewName[1000];
char * pDirStr = NULL;
char * pDirCur = NULL;
char * pNameNew = NULL;
char * pNameExt = NULL;
int c, i, nBase = 0;
Extra_UtilGetoptReset();
while ( (c = Extra_UtilGetopt(argc, argv, "DENB") ) != EOF )
{
switch (c)
{
case 'D':
if ( globalUtilOptind >= argc )
{
fprintf( pAbc->Err, "Command line switch \"-D\" should be followed by a string.\n" );
goto usage;
}
pDirStr = argv[globalUtilOptind];
globalUtilOptind++;
break;
case 'E':
if ( globalUtilOptind >= argc )
{
fprintf( pAbc->Err, "Command line switch \"-E\" should be followed by a string.\n" );
goto usage;
}
pNameExt = argv[globalUtilOptind];
globalUtilOptind++;
break;
case 'N':
if ( globalUtilOptind >= argc )
{
fprintf( pAbc->Err, "Command line switch \"-N\" should be followed by a string.\n" );
goto usage;
}
pNameNew = argv[globalUtilOptind];
globalUtilOptind++;
break;
case 'B':
if ( globalUtilOptind >= argc )
{
fprintf( pAbc->Err, "Command line switch \"-B\" should be followed by a positive integer.\n" );
goto usage;
}
nBase = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( nBase < 0 )
goto usage;
break;
default:
goto usage;
}
}
if ( pNameExt == NULL )
{
printf( "Extension of the files should be given on the command line.\n" );
return 0;
}
if ( pDirStr )
{
if( (pDirCur = _getcwd( NULL, 0 )) == NULL )
{
printf( "Cannot read current directory\n" );
return 0;
}
if ( _chdir(pDirStr) )
{
printf( "Cannot change to directory: %s\n", pDirStr );
return 0;
}
}
sprintf( pNewName, "*.%s", pNameExt );
if( (hFile = _findfirst( pNewName, &c_file )) == -1L )
{
if ( pDirStr )
printf( "No .aig files in the current directory.\n" );
else
printf( "No .aig files in directory: %s\n", pDirStr );
}
else
{
char * pName, * pOldName;
int nDigits, * pOrder;
Vec_Ptr_t * vNames = Vec_PtrAlloc( 1000 );
Vec_Int_t * vNums = Vec_IntAlloc( 1000 );
// collect names
do {
Vec_PtrPush( vNames, Abc_UtilStrsav(c_file.name) );
} while( _findnext( hFile, &c_file ) == 0 );
_findclose( hFile );
// sort files by number
Vec_PtrForEachEntry( char *, vNames, pName, i )
{
Vec_IntPush( vNums, CmfFindNumber(pName) );
if ( Vec_IntEntryLast(vNums) < 0 )
{
printf( "Directory \"%s\" contains file (%s) with extension %s without number\n", pDirStr, pName, pNameExt );
Vec_PtrFreeFree( vNames );
Vec_IntFree( vNums );
return 0;
}
}
// sort by number
pOrder = Abc_QuickSortCost( Vec_IntArray(vNums), Vec_IntSize(vNums), 0 );
// rename files in that order
// nDigits = Abc_Base10Log( nBase + Vec_IntSize(vNums) );
nDigits = Abc_Base10Log( nBase + Vec_IntEntry(vNums, pOrder[Vec_IntSize(vNums)-1]) + 1 );
for ( i = 0; i < Vec_IntSize(vNums); i++ )
{
pOldName = (char *)Vec_PtrEntry( vNames, pOrder[i] );
sprintf( pNewName, "%s%0*d.%s", pNameNew ? pNameNew : "", nDigits, nBase+Vec_IntEntry(vNums, pOrder[i]), pNameExt );
rename( pOldName, pNewName );
printf( "%s -> %s\n", pOldName, pNewName );
// CnfDupFileUnzip( pOldName );
}
// cleanup
Vec_PtrFreeFree( vNames );
Vec_IntFree( vNums );
ABC_FREE( pOrder );
}
if ( pDirStr )
{
if ( _chdir(pDirCur) )
{
ABC_FREE( pDirCur );
printf( "Cannot change to directory: %s\n", pDirCur );
return 0;
}
ABC_FREE( pDirCur );
}
return 0;
usage:
fprintf( pAbc->Err, "usage: renamefiles [-DEN str] [-B num]\n" );
fprintf( pAbc->Err, " performs renaming of files in the given directory\n" );
fprintf( pAbc->Err, "\t-D str : the directory to read files from [default = current]\n" );
fprintf( pAbc->Err, "\t-E str : the extension of files to look for [default = none]\n" );
fprintf( pAbc->Err, "\t-N str : the root of the resulting files [default = none]\n" );
fprintf( pAbc->Err, "\t-B num : the base number for all files [default = %d]\n", nBase );
return 1;
}
/**Function*************************************************************
Synopsis [Command to print the contents of the current directory (Windows).]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int CmdCommandLs( Abc_Frame_t * pAbc, int argc, char **argv )
{
struct _finddata_t c_file;
long hFile;
int fLong = 0;
int fOnlyBLIF = 0;
char Buffer[25];
int Counter = 0;
int fPrintedNewLine;
char c;
Extra_UtilGetoptReset();
while ( (c = Extra_UtilGetopt(argc, argv, "lb") ) != EOF )
{
switch (c)
{
case 'l':
fLong = 1;
break;
case 'b':
fOnlyBLIF = 1;
break;
default:
goto usage;
}
}
// find first .mv file in current directory
if( (hFile = _findfirst( ((fOnlyBLIF)? "*.mv": "*.*"), &c_file )) == -1L )
{
if ( fOnlyBLIF )
fprintf( pAbc->Out, "No *.mv files in the current directory.\n" );
else
fprintf( pAbc->Out, "No files in the current directory.\n" );
}
else
{
if ( fLong )
{
fprintf( pAbc->Out, " File Date Size | File Date Size \n" );
fprintf( pAbc->Out, " ----------------------------------------------------------------------------- \n" );
do
{
strcpy( Buffer, ctime( &(c_file.time_write) ) );
Buffer[16] = 0;
fprintf( pAbc->Out, " %-17s %.24s%7ld", c_file.name, Buffer+4, c_file.size );
if ( ++Counter % 2 == 0 )
{
fprintf( pAbc->Out, "\n" );
fPrintedNewLine = 1;
}
else
{
fprintf( pAbc->Out, " |" );
fPrintedNewLine = 0;
}
}
while( _findnext( hFile, &c_file ) == 0 );
}
else
{
do
{
fprintf( pAbc->Out, " %-18s", c_file.name );
if ( ++Counter % 4 == 0 )
{
fprintf( pAbc->Out, "\n" );
fPrintedNewLine = 1;
}
else
{
fprintf( pAbc->Out, " " );
fPrintedNewLine = 0;
}
}
while( _findnext( hFile, &c_file ) == 0 );
}
if ( !fPrintedNewLine )
fprintf( pAbc->Out, "\n" );
_findclose( hFile );
}
return 0;
usage:
fprintf( pAbc->Err, "usage: ls [-l] [-b]\n" );
fprintf( pAbc->Err, " print the file names in the current directory\n" );
fprintf( pAbc->Err, " -l : print in the long format [default = short]\n" );
fprintf( pAbc->Err, " -b : print only .mv files [default = all]\n" );
return 1;
}
/**Function*************************************************************
Synopsis [Generates the script for running ABC.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int CmdCommandScrGen( Abc_Frame_t * pAbc, int argc, char **argv )
{
struct _finddata_t c_file;
long hFile;
FILE * pFile = NULL;
char * pFileStr = "test.s";
char * pDirStr = NULL;
char * pComStr = "ps";
char * pWriteStr = NULL;
char Buffer[1000], Line[2000];
int nFileNameMax, nFileNameCur;
int Counter = 0;
int fUseCurrent;
char c;
fUseCurrent = 0;
Extra_UtilGetoptReset();
while ( (c = Extra_UtilGetopt(argc, argv, "FDCWch") ) != EOF )
{
switch (c)
{
case 'F':
if ( globalUtilOptind >= argc )
{
fprintf( pAbc->Err, "Command line switch \"-F\" should be followed by a string.\n" );
goto usage;
}
pFileStr = argv[globalUtilOptind];
globalUtilOptind++;
break;
case 'D':
if ( globalUtilOptind >= argc )
{
fprintf( pAbc->Err, "Command line switch \"-D\" should be followed by a string.\n" );
goto usage;
}
pDirStr = argv[globalUtilOptind];
globalUtilOptind++;
break;
case 'C':
if ( globalUtilOptind >= argc )
{
fprintf( pAbc->Err, "Command line switch \"-C\" should be followed by a string.\n" );
goto usage;
}
pComStr = argv[globalUtilOptind];
globalUtilOptind++;
break;
case 'W':
if ( globalUtilOptind >= argc )
{
fprintf( pAbc->Err, "Command line switch \"-W\" should be followed by a string.\n" );
goto usage;
}
pWriteStr = argv[globalUtilOptind];
globalUtilOptind++;
break;
case 'c':
fUseCurrent ^= 1;
break;
default:
goto usage;
}
}
// printf( "File = %s.\n", pFileStr );
// printf( "Dir = %s.\n", pDirStr );
// printf( "Com = %s.\n", pComStr );
if ( pDirStr == NULL )
fUseCurrent = 1;
if ( _getcwd( Buffer, 1000 ) == NULL )
{
printf( "Cannot get the current directory.\n" );
return 0;
}
if ( fUseCurrent )
pFile = fopen( pFileStr, "w" );
if ( pDirStr )
{
if ( _chdir(pDirStr) )
{
printf( "Cannot change to directory: %s\n", pDirStr );
return 0;
}
}
if ( !fUseCurrent )
pFile = fopen( pFileStr, "w" );
if ( pFile == NULL )
{
printf( "Cannot open file %s.\n", pFileStr );
if ( pDirStr && _chdir(Buffer) )
{
printf( "Cannot change to the current directory: %s\n", Buffer );
return 0;
}
return 0;
}
// find the first file in the directory
if( (hFile = _findfirst( "*.*", &c_file )) == -1L )
{
if ( pDirStr )
printf( "No files in the current directory.\n" );
else
printf( "No files in directory: %s\n", pDirStr );
if ( pDirStr && _chdir(Buffer) )
{
printf( "Cannot change to the current directory: %s\n", Buffer );
return 0;
}
}
// get the longest file name
{
nFileNameMax = 0;
do
{
// skip script and txt files
nFileNameCur = strlen(c_file.name);
if ( c_file.name[nFileNameCur-1] == '.' )
continue;
if ( nFileNameCur > 2 &&
c_file.name[nFileNameCur-1] == 's' &&
c_file.name[nFileNameCur-2] == '.' )
continue;
if ( nFileNameCur > 4 &&
c_file.name[nFileNameCur-1] == 't' &&
c_file.name[nFileNameCur-2] == 'x' &&
c_file.name[nFileNameCur-3] == 't' &&
c_file.name[nFileNameCur-4] == '.' )
continue;
if ( nFileNameMax < nFileNameCur )
nFileNameMax = nFileNameCur;
}
while( _findnext( hFile, &c_file ) == 0 );
_findclose( hFile );
}
// print the script file
{
if( (hFile = _findfirst( "*.*", &c_file )) == -1L )
{
if ( pDirStr )
printf( "No files in the current directory.\n" );
else
printf( "No files in directory: %s\n", pDirStr );
}
fprintf( pFile, "# Script file produced by ABC on %s\n", Extra_TimeStamp() );
fprintf( pFile, "# Command line was: scrgen -F %s -D %s -C \"%s\"%s%s\n",
pFileStr, pDirStr, pComStr, pWriteStr?" -W ":"", pWriteStr?pWriteStr:"" );
do
{
// skip script and txt files
nFileNameCur = strlen(c_file.name);
if ( c_file.name[nFileNameCur-1] == '.' )
continue;
if ( nFileNameCur > 2 &&
c_file.name[nFileNameCur-1] == 's' &&
c_file.name[nFileNameCur-2] == '.' )
continue;
if ( nFileNameCur > 4 &&
c_file.name[nFileNameCur-1] == 't' &&
c_file.name[nFileNameCur-2] == 'x' &&
c_file.name[nFileNameCur-3] == 't' &&
c_file.name[nFileNameCur-4] == '.' )
continue;
sprintf( Line, "r %s%s%-*s ; %s", pDirStr?pDirStr:"", pDirStr?"/":"", nFileNameMax, c_file.name, pComStr );
for ( c = (int)strlen(Line)-1; c >= 0; c-- )
if ( Line[c] == '\\' )
Line[c] = '/';
fprintf( pFile, "%s", Line );
if ( pWriteStr )
{
sprintf( Line, " ; w %s/%-*s", pWriteStr, nFileNameMax, c_file.name );
for ( c = (int)strlen(Line)-1; c >= 0; c-- )
if ( Line[c] == '\\' )
Line[c] = '/';
fprintf( pFile, "%s", Line );
}
fprintf( pFile, "\n", Line );
}
while( _findnext( hFile, &c_file ) == 0 );
_findclose( hFile );
}
fclose( pFile );
if ( pDirStr && _chdir(Buffer) )
{
printf( "Cannot change to the current directory: %s\n", Buffer );
return 0;
}
// report
if ( fUseCurrent )
printf( "Script file \"%s\" was saved in the current directory.\n", pFileStr );
else
printf( "Script file \"%s\" was saved in directory: %s\n", pFileStr, pDirStr );
return 0;
usage:
fprintf( pAbc->Err, "usage: scrgen -F <str> -D <str> -C <str> -W <str> -ch\n" );
fprintf( pAbc->Err, "\t generates script for running ABC\n" );
fprintf( pAbc->Err, "\t-F str : the name of the script file [default = \"test.s\"]\n" );
fprintf( pAbc->Err, "\t-D str : the directory to read files from [default = current]\n" );
fprintf( pAbc->Err, "\t-C str : the sequence of commands to run [default = \"ps\"]\n" );
fprintf( pAbc->Err, "\t-W str : the directory to write the resulting files [default = no writing]\n" );
fprintf( pAbc->Err, "\t-c : toggle placing file in current/target dir [default = %s]\n", fUseCurrent? "current": "target" );
fprintf( pAbc->Err, "\t-h : print the command usage\n\n");
fprintf( pAbc->Err, "\tExample : scrgen -F test1.s -D a/in -C \"ps; st; ps\" -W a/out\n" );
return 1;
}
#endif
#ifdef WIN32
#define unlink _unlink
#endif
/**Function********************************************************************
Synopsis [Calls SIS internally.]
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandSis( Abc_Frame_t * pAbc, int argc, char **argv )
{
FILE * pFile;
FILE * pOut, * pErr;
Abc_Ntk_t * pNtk, * pNtkNew, * pNetlist;
char * pNameWin = "sis.exe";
char * pNameUnix = "sis";
char Command[1000], Buffer[100];
char * pSisName;
int i;
pNtk = Abc_FrameReadNtk(pAbc);
pOut = Abc_FrameReadOut(pAbc);
pErr = Abc_FrameReadErr(pAbc);
if ( argc == 1 )
goto usage;
if ( strcmp( argv[1], "-h" ) == 0 )
goto usage;
if ( strcmp( argv[1], "-?" ) == 0 )
goto usage;
if ( pNtk == NULL )
{
fprintf( pErr, "Empty network.\n" );
goto usage;
}
if ( strcmp( argv[0], "sis" ) != 0 )
{
fprintf( pErr, "Wrong command: \"%s\".\n", argv[0] );
goto usage;
}
// get the names from the resource file
if ( Cmd_FlagReadByName(pAbc, "siswin") )
pNameWin = Cmd_FlagReadByName(pAbc, "siswin");
if ( Cmd_FlagReadByName(pAbc, "sisunix") )
pNameUnix = Cmd_FlagReadByName(pAbc, "sisunix");
// check if SIS is available
if ( (pFile = fopen( pNameWin, "r" )) )
pSisName = pNameWin;
else if ( (pFile = fopen( pNameUnix, "r" )) )
pSisName = pNameUnix;
else if ( pFile == NULL )
{
fprintf( pErr, "Cannot find \"%s\" or \"%s\" in the current directory.\n", pNameWin, pNameUnix );
goto usage;
}
fclose( pFile );
if ( Abc_NtkIsMappedLogic(pNtk) )
{
Abc_NtkMapToSop(pNtk);
printf( "The current network is unmapped before calling SIS.\n" );
}
// write out the current network
if ( Abc_NtkIsLogic(pNtk) )
Abc_NtkToSop(pNtk, -1, ABC_INFINITY);
pNetlist = Abc_NtkToNetlist(pNtk);
if ( pNetlist == NULL )
{
fprintf( pErr, "Cannot produce the intermediate network.\n" );
goto usage;
}
Io_WriteBlif( pNetlist, "_sis_in.blif", 1, 0, 0 );
Abc_NtkDelete( pNetlist );
// create the file for sis
sprintf( Command, "%s -x -c ", pSisName );
strcat ( Command, "\"" );
strcat ( Command, "read_blif _sis_in.blif" );
strcat ( Command, "; " );
for ( i = 1; i < argc; i++ )
{
sprintf( Buffer, " %s", argv[i] );
strcat( Command, Buffer );
}
strcat( Command, "; " );
strcat( Command, "write_blif _sis_out.blif" );
strcat( Command, "\"" );
// call SIS
if ( Util_SignalSystem( Command ) )
{
fprintf( pErr, "The following command has returned non-zero exit status:\n" );
fprintf( pErr, "\"%s\"\n", Command );
unlink( "_sis_in.blif" );
goto usage;
}
// read in the SIS output
if ( (pFile = fopen( "_sis_out.blif", "r" )) == NULL )
{
fprintf( pErr, "Cannot open SIS output file \"%s\".\n", "_sis_out.blif" );
unlink( "_sis_in.blif" );
goto usage;
}
fclose( pFile );
// set the new network
pNtkNew = Io_Read( "_sis_out.blif", IO_FILE_BLIF, 1, 0 );
// set the original spec of the new network
if ( pNtk->pSpec )
{
ABC_FREE( pNtkNew->pSpec );
pNtkNew->pSpec = Extra_UtilStrsav( pNtk->pSpec );
}
// replace the current network
Abc_FrameReplaceCurrentNetwork( pAbc, pNtkNew );
// remove temporary networks
unlink( "_sis_in.blif" );
unlink( "_sis_out.blif" );
return 0;
usage:
fprintf( pErr, "Usage: sis [-h] <com>\n");
fprintf( pErr, " invokes SIS command for the current ABC network\n" );
fprintf( pErr, " (the executable of SIS should be in the same directory)\n" );
fprintf( pErr, " -h : print the command usage\n" );
fprintf( pErr, " <com> : a SIS command (or a semicolon-separated list of commands in quotes)\n" );
fprintf( pErr, " Example 1: sis eliminate 0\n" );
fprintf( pErr, " Example 2: sis \"ps; rd; fx; ps\"\n" );
fprintf( pErr, " Example 3: sis source script.rugged\n" );
return 1; // error exit
}
/**Function********************************************************************
Synopsis [Calls SIS internally.]
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandMvsis( Abc_Frame_t * pAbc, int argc, char **argv )
{
FILE * pFile;
FILE * pOut, * pErr;
Abc_Ntk_t * pNtk, * pNtkNew, * pNetlist;
char Command[1000], Buffer[100];
char * pNameWin = "mvsis.exe";
char * pNameUnix = "mvsis";
char * pMvsisName;
int i;
pNtk = Abc_FrameReadNtk(pAbc);
pOut = Abc_FrameReadOut(pAbc);
pErr = Abc_FrameReadErr(pAbc);
if ( argc == 1 )
goto usage;
if ( strcmp( argv[1], "-h" ) == 0 )
goto usage;
if ( strcmp( argv[1], "-?" ) == 0 )
goto usage;
if ( pNtk == NULL )
{
fprintf( pErr, "Empty network.\n" );
goto usage;
}
if ( strcmp( argv[0], "mvsis" ) != 0 )
{
fprintf( pErr, "Wrong command: \"%s\".\n", argv[0] );
goto usage;
}
// get the names from the resource file
if ( Cmd_FlagReadByName(pAbc, "mvsiswin") )
pNameWin = Cmd_FlagReadByName(pAbc, "mvsiswin");
if ( Cmd_FlagReadByName(pAbc, "mvsisunix") )
pNameUnix = Cmd_FlagReadByName(pAbc, "mvsisunix");
// check if MVSIS is available
if ( (pFile = fopen( pNameWin, "r" )) )
pMvsisName = pNameWin;
else if ( (pFile = fopen( pNameUnix, "r" )) )
pMvsisName = pNameUnix;
else if ( pFile == NULL )
{
fprintf( pErr, "Cannot find \"%s\" or \"%s\" in the current directory.\n", pNameWin, pNameUnix );
goto usage;
}
fclose( pFile );
if ( Abc_NtkIsMappedLogic(pNtk) )
{
Abc_NtkMapToSop(pNtk);
printf( "The current network is unmapped before calling MVSIS.\n" );
}
// write out the current network
if ( Abc_NtkIsLogic(pNtk) )
Abc_NtkToSop(pNtk, -1, ABC_INFINITY);
pNetlist = Abc_NtkToNetlist(pNtk);
if ( pNetlist == NULL )
{
fprintf( pErr, "Cannot produce the intermediate network.\n" );
goto usage;
}
Io_WriteBlif( pNetlist, "_mvsis_in.blif", 1, 0, 0 );
Abc_NtkDelete( pNetlist );
// create the file for MVSIS
sprintf( Command, "%s -x -c ", pMvsisName );
strcat ( Command, "\"" );
strcat ( Command, "read_blif _mvsis_in.blif" );
strcat ( Command, "; " );
for ( i = 1; i < argc; i++ )
{
sprintf( Buffer, " %s", argv[i] );
strcat( Command, Buffer );
}
strcat( Command, "; " );
strcat( Command, "write_blif _mvsis_out.blif" );
strcat( Command, "\"" );
// call MVSIS
if ( Util_SignalSystem( Command ) )
{
fprintf( pErr, "The following command has returned non-zero exit status:\n" );
fprintf( pErr, "\"%s\"\n", Command );
unlink( "_mvsis_in.blif" );
goto usage;
}
// read in the MVSIS output
if ( (pFile = fopen( "_mvsis_out.blif", "r" )) == NULL )
{
fprintf( pErr, "Cannot open MVSIS output file \"%s\".\n", "_mvsis_out.blif" );
unlink( "_mvsis_in.blif" );
goto usage;
}
fclose( pFile );
// set the new network
pNtkNew = Io_Read( "_mvsis_out.blif", IO_FILE_BLIF, 1, 0 );
// set the original spec of the new network
if ( pNtk->pSpec )
{
ABC_FREE( pNtkNew->pSpec );
pNtkNew->pSpec = Extra_UtilStrsav( pNtk->pSpec );
}
// replace the current network
Abc_FrameReplaceCurrentNetwork( pAbc, pNtkNew );
// remove temporary networks
unlink( "_mvsis_in.blif" );
unlink( "_mvsis_out.blif" );
return 0;
usage:
fprintf( pErr, "Usage: mvsis [-h] <com>\n");
fprintf( pErr, " invokes MVSIS command for the current ABC network\n" );
fprintf( pErr, " (the executable of MVSIS should be in the same directory)\n" );
fprintf( pErr, " -h : print the command usage\n" );
fprintf( pErr, " <com> : a MVSIS command (or a semicolon-separated list of commands in quotes)\n" );
fprintf( pErr, " Example 1: mvsis fraig_sweep\n" );
fprintf( pErr, " Example 2: mvsis \"ps; fxu; ps\"\n" );
fprintf( pErr, " Example 3: mvsis source mvsis.rugged\n" );
return 1; // error exit
}
/**Function*************************************************************
Synopsis [Computes dimentions of the graph.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Gia_ManGnuplotShow( char * pPlotFileName )
{
FILE * pFile;
void * pAbc;
char * pProgNameGnuplotWin = "wgnuplot.exe";
char * pProgNameGnuplotUnix = "gnuplot";
char * pProgNameGnuplot = NULL;
// read in the Capo plotting output
if ( (pFile = fopen( pPlotFileName, "r" )) == NULL )
{
fprintf( stdout, "Cannot open the plot file \"%s\".\n\n", pPlotFileName );
return;
}
fclose( pFile );
pAbc = Abc_FrameGetGlobalFrame();
// get the names from the plotting software
if ( Cmd_FlagReadByName((Abc_Frame_t *)pAbc, "gnuplotwin") )
pProgNameGnuplotWin = Cmd_FlagReadByName((Abc_Frame_t *)pAbc, "gnuplotwin");
if ( Cmd_FlagReadByName((Abc_Frame_t *)pAbc, "gnuplotunix") )
pProgNameGnuplotUnix = Cmd_FlagReadByName((Abc_Frame_t *)pAbc, "gnuplotunix");
// check if Gnuplot is available
if ( (pFile = fopen( pProgNameGnuplotWin, "r" )) )
pProgNameGnuplot = pProgNameGnuplotWin;
else if ( (pFile = fopen( pProgNameGnuplotUnix, "r" )) )
pProgNameGnuplot = pProgNameGnuplotUnix;
else if ( pFile == NULL )
{
fprintf( stdout, "Cannot find \"%s\" or \"%s\" in the current directory.\n", pProgNameGnuplotWin, pProgNameGnuplotUnix );
return;
}
fclose( pFile );
// spawn the viewer
#ifdef WIN32
if ( _spawnl( _P_NOWAIT, pProgNameGnuplot, pProgNameGnuplot, pPlotFileName, NULL ) == -1 )
{
fprintf( stdout, "Cannot find \"%s\".\n", pProgNameGnuplot );
return;
}
#else
{
char Command[1000];
sprintf( Command, "%s %s ", pProgNameGnuplot, pPlotFileName );
if ( system( Command ) == -1 )
{
fprintf( stdout, "Cannot execute \"%s\".\n", Command );
return;
}
}
#endif
}
/**Function********************************************************************
Synopsis [Calls Capo internally.]
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandCapo( Abc_Frame_t * pAbc, int argc, char **argv )
{
FILE * pFile;
FILE * pOut, * pErr;
Abc_Ntk_t * pNtk, * pNetlist;
char Command[1000], Buffer[100];
char * pProgNameCapoWin = "capo.exe";
char * pProgNameCapoUnix = "capo";
char * pProgNameGnuplotWin = "wgnuplot.exe";
char * pProgNameGnuplotUnix = "gnuplot";
char * pProgNameCapo;
char * pProgNameGnuplot;
char * pPlotFileName;
int i;
pNtk = Abc_FrameReadNtk(pAbc);
pOut = Abc_FrameReadOut(pAbc);
pErr = Abc_FrameReadErr(pAbc);
if ( argc > 1 )
{
if ( strcmp( argv[1], "-h" ) == 0 )
goto usage;
if ( strcmp( argv[1], "-?" ) == 0 )
goto usage;
}
if ( pNtk == NULL )
{
fprintf( pErr, "Empty network.\n" );
goto usage;
}
if ( strcmp( argv[0], "capo" ) != 0 )
{
fprintf( pErr, "Wrong command: \"%s\".\n", argv[0] );
goto usage;
}
// get the names from the resource file
if ( Cmd_FlagReadByName(pAbc, "capowin") )
pProgNameCapoWin = Cmd_FlagReadByName(pAbc, "capowin");
if ( Cmd_FlagReadByName(pAbc, "capounix") )
pProgNameCapoUnix = Cmd_FlagReadByName(pAbc, "capounix");
// check if capo is available
if ( (pFile = fopen( pProgNameCapoWin, "r" )) )
pProgNameCapo = pProgNameCapoWin;
else if ( (pFile = fopen( pProgNameCapoUnix, "r" )) )
pProgNameCapo = pProgNameCapoUnix;
else if ( pFile == NULL )
{
fprintf( pErr, "Cannot find \"%s\" or \"%s\" in the current directory.\n", pProgNameCapoWin, pProgNameCapoUnix );
goto usage;
}
fclose( pFile );
if ( Abc_NtkIsMappedLogic(pNtk) )
{
Abc_NtkMapToSop(pNtk);
printf( "The current network is unmapped before calling Capo.\n" );
}
// write out the current network
if ( Abc_NtkIsLogic(pNtk) )
Abc_NtkToSop(pNtk, -1, ABC_INFINITY);
pNetlist = Abc_NtkToNetlist(pNtk);
if ( pNetlist == NULL )
{
fprintf( pErr, "Cannot produce the intermediate network.\n" );
goto usage;
}
Io_WriteBlif( pNetlist, "_capo_in.blif", 1, 0, 0 );
Abc_NtkDelete( pNetlist );
// create the file for Capo
sprintf( Command, "%s -f _capo_in.blif -log out.txt ", pProgNameCapo );
pPlotFileName = NULL;
for ( i = 1; i < argc; i++ )
{
sprintf( Buffer, " %s", argv[i] );
strcat( Command, Buffer );
if ( !strcmp( argv[i], "-plot" ) )
pPlotFileName = argv[i+1];
}
// call Capo
if ( Util_SignalSystem( Command ) )
{
fprintf( pErr, "The following command has returned non-zero exit status:\n" );
fprintf( pErr, "\"%s\"\n", Command );
unlink( "_capo_in.blif" );
goto usage;
}
// remove temporary networks
unlink( "_capo_in.blif" );
if ( pPlotFileName == NULL )
return 0;
// get the file name
sprintf( Buffer, "%s.plt", pPlotFileName );
pPlotFileName = Buffer;
// read in the Capo plotting output
if ( (pFile = fopen( pPlotFileName, "r" )) == NULL )
{
fprintf( pErr, "Cannot open the plot file \"%s\".\n\n", pPlotFileName );
goto usage;
}
fclose( pFile );
// get the names from the plotting software
if ( Cmd_FlagReadByName(pAbc, "gnuplotwin") )
pProgNameGnuplotWin = Cmd_FlagReadByName(pAbc, "gnuplotwin");
if ( Cmd_FlagReadByName(pAbc, "gnuplotunix") )
pProgNameGnuplotUnix = Cmd_FlagReadByName(pAbc, "gnuplotunix");
// check if Gnuplot is available
pProgNameGnuplot = NULL;
if ( (pFile = fopen( pProgNameGnuplotWin, "r" )) )
pProgNameGnuplot = pProgNameGnuplotWin;
else if ( (pFile = fopen( pProgNameGnuplotUnix, "r" )) )
pProgNameGnuplot = pProgNameGnuplotUnix;
else if ( pFile == NULL )
{
fprintf( pErr, "Cannot find \"%s\" or \"%s\" in the current directory.\n", pProgNameGnuplotWin, pProgNameGnuplotUnix );
goto usage;
}
fclose( pFile );
// spawn the viewer
#ifdef WIN32
if ( _spawnl( _P_NOWAIT, pProgNameGnuplot, pProgNameGnuplot, pPlotFileName, NULL ) == -1 )
{
fprintf( stdout, "Cannot find \"%s\".\n", pProgNameGnuplot );
goto usage;
}
#else
{
sprintf( Command, "%s %s ", pProgNameGnuplot, pPlotFileName );
if ( Util_SignalSystem( Command ) == -1 )
{
fprintf( stdout, "Cannot execute \"%s\".\n", Command );
goto usage;
}
}
#endif
// remove temporary networks
// unlink( pPlotFileName );
return 0;
usage:
fprintf( pErr, "Usage: capo [-h] <com>\n");
fprintf( pErr, " peforms placement of the current network using Capo\n" );
fprintf( pErr, " a Capo binary should be present in the same directory\n" );
fprintf( pErr, " (if plotting, the Gnuplot binary should also be present)\n" );
fprintf( pErr, " -h : print the command usage\n" );
fprintf( pErr, " <com> : a Capo command\n" );
fprintf( pErr, " Example 1: capo\n" );
fprintf( pErr, " (performs placement with default options)\n" );
fprintf( pErr, " Example 2: capo -AR <aspec_ratio> -WS <whitespace_percentage> -save\n" );
fprintf( pErr, " (specifies the aspect ratio [default = 1.0] and\n" );
fprintf( pErr, " the whitespace percentage [0%%; 100%%) [default = 15%%])\n" );
fprintf( pErr, " Example 3: capo -plot <base_fileName>\n" );
fprintf( pErr, " (produces <base_fileName.plt> and visualize it using Gnuplot)\n" );
fprintf( pErr, " Example 4: capo -help\n" );
fprintf( pErr, " (prints the default usage message of the Capo binary)\n" );
fprintf( pErr, " Please refer to the Capo webpage for additional information:\n" );
fprintf( pErr, " http://vlsicad.eecs.umich.edu/BK/PDtools/\n" );
return 1; // error exit
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int CmdCommandStarter( Abc_Frame_t * pAbc, int argc, char ** argv )
{
extern void Cmd_RunStarter( char * pFileName, char * pBinary, char * pCommand, int nCores );
FILE * pFile;
char * pFileName;
char * pCommand = NULL;
int c, nCores = 3;
int fVerbose = 0;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "NCvh" ) ) != EOF )
{
switch ( c )
{
case 'N':
if ( globalUtilOptind >= argc )
{
Abc_Print( -1, "Command line switch \"-N\" should be followed by an integer.\n" );
goto usage;
}
nCores = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( nCores < 0 )
goto usage;
break;
case 'C':
if ( globalUtilOptind >= argc )
{
Abc_Print( -1, "Command line switch \"-C\" should be followed by a string (possibly in quotes).\n" );
goto usage;
}
pCommand = argv[globalUtilOptind];
globalUtilOptind++;
break;
case 'v':
fVerbose ^= 1;
break;
case 'h':
goto usage;
default:
goto usage;
}
}
if ( argc != globalUtilOptind + 1 )
{
Abc_Print( -2, "The file name should be given on the command line.\n" );
return 1;
}
// get the input file name
pFileName = argv[globalUtilOptind];
if ( (pFile = Io_FileOpen( pFileName, "open_path", "rb", 0 )) == NULL )
// if ( (pFile = fopen( pFileName, "rb" )) == NULL )
{
Abc_Print( -2, "Cannot open input file \"%s\". ", pFileName );
if (( pFileName = Extra_FileGetSimilarName( pFileName, ".c", ".s", ".scr", ".script", NULL ) ))
Abc_Print( -2, "Did you mean \"%s\"?", pFileName );
Abc_Print( -2, "\n" );
return 1;
}
fclose( pFile );
// run commands
Cmd_RunStarter( pFileName, pAbc->sBinary, pCommand, nCores );
return 0;
usage:
Abc_Print( -2, "usage: starter [-N num] [-C cmd] [-vh] <file>\n" );
Abc_Print( -2, "\t runs command lines listed in <file> concurrently on <num> CPUs\n" );
Abc_Print( -2, "\t-N num : the number of concurrent jobs including the controler [default = %d]\n", nCores );
Abc_Print( -2, "\t-C cmd : (optional) ABC command line to execute on benchmarks in <file>\n" );
Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" );
Abc_Print( -2, "\t-h : print the command usage\n");
Abc_Print( -2, "\t<file> : file name with ABC command lines (or benchmark names, if <cmd> is given)\n");
return 1;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int CmdCommandAutoTuner( Abc_Frame_t * pAbc, int argc, char ** argv )
{
extern void Cmd_RunAutoTuner( char * pConfig, char * pFileList, int nCores );
FILE * pFile;
char * pFileConf = NULL;
char * pFileList = NULL;
char * pFileName;
int c, nCores = 3;
int fVerbose = 0;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "NCFvh" ) ) != EOF )
{
switch ( c )
{
case 'N':
if ( globalUtilOptind >= argc )
{
Abc_Print( -1, "Command line switch \"-N\" should be followed by an integer.\n" );
goto usage;
}
nCores = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
if ( nCores < 0 )
goto usage;
break;
case 'C':
if ( globalUtilOptind >= argc )
{
Abc_Print( -1, "Command line switch \"-C\" should be followed by a string (possibly in quotes).\n" );
goto usage;
}
pFileConf = argv[globalUtilOptind];
globalUtilOptind++;
break;
case 'F':
if ( globalUtilOptind >= argc )
{
Abc_Print( -1, "Command line switch \"-F\" should be followed by a string (possibly in quotes).\n" );
goto usage;
}
pFileList = argv[globalUtilOptind];
globalUtilOptind++;
break;
case 'v':
fVerbose ^= 1;
break;
case 'h':
goto usage;
default:
goto usage;
}
}
if ( pFileConf == NULL )
{
Abc_Print( -2, "File containing configuration for autotuning is not given.\n" );
return 1;
}
if ( pFileList == NULL )
{
Abc_Print( -2, "File contining list of files for autotuning is not given.\n" );
return 1;
}
// get the input file name
pFileName = pFileConf;
if ( (pFile = Io_FileOpen( pFileName, "open_path", "rb", 0 )) == NULL )
// if ( (pFile = fopen( pFileName, "rb" )) == NULL )
{
Abc_Print( -2, "Cannot open configuration file \"%s\". ", pFileName );
if (( pFileName = Extra_FileGetSimilarName( pFileName, ".c", ".s", ".scr", ".script", NULL ) ))
Abc_Print( -2, "Did you mean \"%s\"?", pFileName );
Abc_Print( -2, "\n" );
return 1;
}
fclose( pFile );
// get the input file name
pFileName = pFileList;
if ( (pFile = Io_FileOpen( pFileName, "open_path", "rb", 0 )) == NULL )
// if ( (pFile = fopen( pFileName, "rb" )) == NULL )
{
Abc_Print( -2, "Cannot open the file list \"%s\". ", pFileName );
if (( pFileName = Extra_FileGetSimilarName( pFileName, ".c", ".s", ".scr", ".script", NULL ) ))
Abc_Print( -2, "Did you mean \"%s\"?", pFileName );
Abc_Print( -2, "\n" );
return 1;
}
fclose( pFile );
// run commands
Cmd_RunAutoTuner( pFileConf, pFileList, nCores );
return 0;
usage:
Abc_Print( -2, "usage: autotuner [-N num] [-C file] [-F file] [-vh]\n" );
Abc_Print( -2, "\t performs autotuning\n" );
Abc_Print( -2, "\t-N num : the number of concurrent jobs including the controler [default = %d]\n", nCores );
Abc_Print( -2, "\t-C cmd : configuration file with settings for autotuning\n" );
Abc_Print( -2, "\t-F cmd : list of AIGER files to be used for autotuning\n" );
Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" );
Abc_Print( -2, "\t-h : print the command usage\n");
return 1;
}
/**Function********************************************************************
Synopsis [Print the version string.]
Description []
SideEffects []
SeeAlso []
******************************************************************************/
int CmdCommandVersion( Abc_Frame_t * pAbc, int argc, char **argv )
{
int c;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF )
{
switch ( c )
{
case 'h':
goto usage;
default:
goto usage;
}
}
printf("%s\n", Abc_UtilsGetVersion(pAbc));
return 0;
usage:
fprintf( pAbc->Err, "usage: version [-h]\n" );
fprintf( pAbc->Err, " print the version string\n" );
fprintf( pAbc->Err, " -h : print the command usage\n");
return 1;
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END