diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2019-03-20 22:07:55 +0200 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2019-03-20 22:07:55 +0200 |
commit | 4394bc865944ba0c24fcc0cf5b39af1ec64b83bc (patch) | |
tree | c3790c3fe2261081c52fbe888e5d2daab66669db /src | |
parent | f0efc6e098281ca55e837a3de68e48d4dbb121aa (diff) | |
download | abc-4394bc865944ba0c24fcc0cf5b39af1ec64b83bc.tar.gz abc-4394bc865944ba0c24fcc0cf5b39af1ec64b83bc.tar.bz2 abc-4394bc865944ba0c24fcc0cf5b39af1ec64b83bc.zip |
Add special handling of script-level assertions.
Diffstat (limited to 'src')
-rw-r--r-- | src/base/cmd/cmdApi.c | 100 |
1 files changed, 98 insertions, 2 deletions
diff --git a/src/base/cmd/cmdApi.c b/src/base/cmd/cmdApi.c index 29e13837..64e11ae8 100644 --- a/src/base/cmd/cmdApi.c +++ b/src/base/cmd/cmdApi.c @@ -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; |