abc/src/base/cmd/cmdApi.c

224 lines
7.0 KiB
C

/**CFile****************************************************************
FileName [cmdApi.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Command processing package.]
Synopsis [External procedures of the command package.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: cmdApi.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#include "base/abc/abc.h"
#include "base/main/mainInt.h"
#include "cmdInt.h"
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int Cmd_CommandIsDefined( Abc_Frame_t * pAbc, const char * sName )
{
return st__is_member( pAbc->tCommands, sName );
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Cmd_CommandAdd( Abc_Frame_t * pAbc, const char * sGroup, const char * sName, Cmd_CommandFuncType pFunc, int fChanges )
{
const char * key;
char * value;
Abc_Command * pCommand;
int fStatus;
key = sName;
if ( st__delete( pAbc->tCommands, &key, &value ) )
{
// delete existing definition for this command
fprintf( pAbc->Err, "Cmd warning: redefining '%s'\n", sName );
CmdCommandFree( (Abc_Command *)value );
}
// create the new command
pCommand = ABC_ALLOC( Abc_Command, 1 );
pCommand->sName = Extra_UtilStrsav( sName );
pCommand->sGroup = Extra_UtilStrsav( sGroup );
pCommand->pFunc = pFunc;
pCommand->fChange = fChanges;
fStatus = st__insert( pAbc->tCommands, pCommand->sName, (char *)pCommand );
assert( !fStatus ); // the command should not be in the table
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int Cmd_CommandHandleSpecial( Abc_Frame_t * pAbc, const char * sCommand )
{
Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
int piCountNew = (pNtk && Abc_NtkHasMapping(pNtk)) ? Abc_NtkCiNum(pNtk) : 0, piCount = 0;
int poCountNew = (pNtk && Abc_NtkHasMapping(pNtk)) ? Abc_NtkCoNum(pNtk) : 0, poCount = 0;
int ndCountNew = (pNtk && Abc_NtkHasMapping(pNtk)) ? Abc_NtkNodeNum(pNtk) : 0, ndCount = 0;
double AreaNew = (pNtk && Abc_NtkHasMapping(pNtk)) ? Abc_NtkGetMappedArea(pNtk) : 0, Area = 0;
int DepthNew = (pNtk && Abc_NtkHasMapping(pNtk)) ? Abc_NtkLevel(pNtk) : 0, Depth = 0;
if ( strstr(sCommand, "#PS") )
{
printf( "pi=%d ", piCountNew );
printf( "po=%d ", poCountNew );
printf( "fn=%d ", ndCountNew );
printf( "ma=%.1f ", AreaNew );
printf( "de=%d ", DepthNew );
printf( "\n" );
return 1;
}
if ( strstr(sCommand, "#CEC") )
{
//int proofStatus = Abc_NtkVerifyUsingCec(pNtk);
int proofStatus = 1;
// -1 (undecided), 0 (different), 1 (equivalent)
printf( "proofStatus=%d\n", proofStatus );
return 1;
}
if ( strstr(sCommand, "#ASSERT") )
{
int Status = 0;
char * pNumb = strrchr( (char *)sCommand, '=' );
if ( strstr(sCommand, "_PI_") )
{
piCount = pNumb ? atoi(pNumb+1) : 0;
if ( strstr( sCommand, "==" ) )
Status = piCountNew == piCount;
else if ( strstr( sCommand, "<=" ) )
Status = piCountNew <= piCount;
else return 0;
}
else if ( strstr(sCommand, "_PO_") )
{
poCount = pNumb ? atoi(pNumb+1) : 0;
if ( strstr( sCommand, "==" ) )
Status = poCountNew == poCount;
else if ( strstr( sCommand, "<=" ) )
Status = poCountNew <= poCount;
else return 0;
}
else if ( strstr(sCommand, "_NODE_") )
{
ndCount = pNumb ? atoi(pNumb+1) : 0;
if ( strstr( sCommand, "==" ) )
Status = ndCountNew == ndCount;
else if ( strstr( sCommand, "<=" ) )
Status = ndCountNew <= ndCount;
else return 0;
}
else if ( strstr(sCommand, "_AREA_") )
{
double Eplison = 1.0;
Area = pNumb ? atof(pNumb+1) : 0;
if ( strstr( sCommand, "==" ) )
Status = AreaNew >= Area - Eplison && AreaNew <= Area + Eplison;
else if ( strstr( sCommand, "<=" ) )
Status = AreaNew <= Area + Eplison;
else return 0;
}
else if ( strstr(sCommand, "_DEPTH_") )
{
Depth = pNumb ? atoi(pNumb+1) : 0;
if ( strstr( sCommand, "==" ) )
Status = DepthNew == Depth;
else if ( strstr( sCommand, "<=" ) )
Status = DepthNew <= Depth;
else return 0;
}
else return 0;
printf( "%s\n", Status ? "succeeded" : "failed" );
return 1;
}
return 0;
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int Cmd_CommandExecute( Abc_Frame_t * pAbc, const char * sCommand )
{
int fStatus = 0, argc, loop;
const char * sCommandNext;
char **argv;
if ( !pAbc->fAutoexac && !pAbc->fSource )
Cmd_HistoryAddCommand(pAbc, sCommand);
sCommandNext = sCommand;
do
{
if ( sCommandNext[0] == '#' && Cmd_CommandHandleSpecial( pAbc, sCommandNext ) )
break;
sCommandNext = CmdSplitLine( pAbc, sCommandNext, &argc, &argv );
loop = 0;
fStatus = CmdApplyAlias( pAbc, &argc, &argv, &loop );
if ( fStatus == 0 )
fStatus = CmdCommandDispatch( pAbc, &argc, &argv );
CmdFreeArgv( argc, argv );
}
while ( fStatus == 0 && *sCommandNext != '\0' );
return fStatus;
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END