Commit 4394bc86 by Alan Mishchenko

Add special handling of script-level assertions.

parent f0efc6e0
......@@ -96,6 +96,100 @@ void Cmd_CommandAdd( Abc_Frame_t * pAbc, const char * sGroup, const char * sName
SeeAlso []
***********************************************************************/
int Cmd_CommandHandleSpecial( Abc_Frame_t * pAbc, const char * sCommand )
{
Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc);
int piCountNew = pNtk ? Abc_NtkCiNum(pNtk) : 0, piCount = 0;
int poCountNew = pNtk ? Abc_NtkCoNum(pNtk) : 0, poCount = 0;
int ndCountNew = pNtk ? Abc_NtkNodeNum(pNtk) : 0, ndCount = 0;
double AreaNew = pNtk ? Abc_NtkGetMappedArea(pNtk) : 0, Area = 0;
int DepthNew = 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( 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;
......@@ -107,12 +201,14 @@ int Cmd_CommandExecute( Abc_Frame_t * pAbc, const char * sCommand )
sCommandNext = sCommand;
do
{
sCommandNext = CmdSplitLine( pAbc, sCommandNext, &argc, &argv );
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 );
CmdFreeArgv( argc, argv );
}
while ( fStatus == 0 && *sCommandNext != '\0' );
return fStatus;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment