From 1451e4551c84c0b57db264c129856eb3e52a7a76 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Sat, 14 Mar 2015 16:32:21 +0700 Subject: Adding flop-input-only switch -f in &fftest. --- src/base/abci/abc.c | 8 ++++++-- src/sat/bmc/bmc.h | 1 + src/sat/bmc/bmcFault.c | 47 ++++++++++++++++++++++++++++++++++------------- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 0aaee0f3..53838c76 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -36217,7 +36217,7 @@ int Abc_CommandAbc9FFTest( Abc_Frame_t * pAbc, int argc, char ** argv ) int c; Gia_ParFfSetDefault( pPars ); Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "ATNSGsbduvh" ) ) != EOF ) + while ( ( c = Extra_UtilGetopt( argc, argv, "ATNSGsbfduvh" ) ) != EOF ) { switch ( c ) { @@ -36278,6 +36278,9 @@ int Abc_CommandAbc9FFTest( Abc_Frame_t * pAbc, int argc, char ** argv ) case 'b': pPars->fBasic ^= 1; break; + case 'f': + pPars->fFfOnly ^= 1; + break; case 'd': pPars->fDump ^= 1; break; @@ -36362,7 +36365,7 @@ int Abc_CommandAbc9FFTest( Abc_Frame_t * pAbc, int argc, char ** argv ) return 0; usage: - Abc_Print( -2, "usage: &fftest [-ATN num] [-sbduvh] [-G file] [-S str]\n" ); + Abc_Print( -2, "usage: &fftest [-ATN num] [-sbfduvh] [-G file] [-S str]\n" ); Abc_Print( -2, "\t performs functional fault test generation\n" ); Abc_Print( -2, "\t-A num : selects fault model for all gates [default = %d]\n", pPars->Algo ); Abc_Print( -2, "\t 0: fault model is not selected (use -S str)\n" ); @@ -36374,6 +36377,7 @@ usage: Abc_Print( -2, "\t-N num : specifies iteration to check for fixed parameters [default = %d]\n", pPars->nIterCheck ); Abc_Print( -2, "\t-s : toggles starting with the all-0 and all-1 patterns [default = %s]\n", pPars->fStartPats? "yes": "no" ); Abc_Print( -2, "\t-b : toggles testing for single faults only [default = %s]\n", pPars->fBasic? "yes": "no" ); + Abc_Print( -2, "\t-f : toggles using flop inputs only with \"-A 1\" [default = %s]\n", pPars->fFfOnly? "yes": "no" ); Abc_Print( -2, "\t-d : toggles dumping test patterns into file \"tests.txt\" [default = %s]\n", pPars->fDump? "yes": "no" ); Abc_Print( -2, "\t-u : toggles dumping untestable faults into \"untest.txt\" [default = %s]\n", pPars->fDumpUntest? "yes": "no" ); Abc_Print( -2, "\t-v : toggles printing verbose information [default = %s]\n", pPars->fVerbose? "yes": "no" ); diff --git a/src/sat/bmc/bmc.h b/src/sat/bmc/bmc.h index d39f570f..e489c255 100644 --- a/src/sat/bmc/bmc.h +++ b/src/sat/bmc/bmc.h @@ -131,6 +131,7 @@ struct Bmc_ParFf_t_ int nTimeOut; int nIterCheck; int fBasic; + int fFfOnly; int fDump; int fDumpUntest; int fVerbose; diff --git a/src/sat/bmc/bmcFault.c b/src/sat/bmc/bmcFault.c index 4912d82c..d0186d31 100644 --- a/src/sat/bmc/bmcFault.c +++ b/src/sat/bmc/bmcFault.c @@ -57,6 +57,7 @@ void Gia_ParFfSetDefault( Bmc_ParFf_t * p ) p->nTimeOut = 0; p->nIterCheck = 0; p->fBasic = 0; + p->fFfOnly = 0; p->fDump = 0; p->fDumpUntest = 0; p->fVerbose = 0; @@ -178,7 +179,7 @@ static inline void Cnf_DataLiftGia( Cnf_Dat_t * p, Gia_Man_t * pGia, int nVarsPl SeeAlso [] ***********************************************************************/ -Gia_Man_t * Gia_ManFaultUnfold( Gia_Man_t * p, int fUseMuxes ) +Gia_Man_t * Gia_ManFaultUnfold( Gia_Man_t * p, int fUseMuxes, int fFfOnly ) { Gia_Man_t * pNew, * pTemp; Gia_Obj_t * pObj; @@ -201,20 +202,40 @@ Gia_Man_t * Gia_ManFaultUnfold( Gia_Man_t * p, int fUseMuxes ) pObj->Value = Gia_ObjRoToRi(p, pObj)->Value; Gia_ManForEachPi( p, pObj, i ) pObj->Value = Gia_ManAppendCi( pNew ); - Gia_ManForEachAnd( p, pObj, i ) + if ( fFfOnly ) { - iCtrl = Gia_ManAppendCi(pNew); - iThis = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) ); - if ( fUseMuxes ) - pObj->Value = Gia_ManHashMux( pNew, iCtrl, pObj->Value, iThis ); - else - pObj->Value = iThis; + Gia_ManForEachAnd( p, pObj, i ) + pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) ); + Gia_ManForEachPo( p, pObj, i ) + pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) ); + Gia_ManForEachRi( p, pObj, i ) + { + iCtrl = Gia_ManAppendCi(pNew); + iThis = Gia_ObjFanin0Copy(pObj); + if ( fUseMuxes ) + pObj->Value = Gia_ManHashMux( pNew, iCtrl, pObj->Value, iThis ); + else + pObj->Value = iThis; + pObj->Value = Gia_ManAppendCo( pNew, pObj->Value ); + } + } + else + { + Gia_ManForEachAnd( p, pObj, i ) + { + iCtrl = Gia_ManAppendCi(pNew); + iThis = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) ); + if ( fUseMuxes ) + pObj->Value = Gia_ManHashMux( pNew, iCtrl, pObj->Value, iThis ); + else + pObj->Value = iThis; + } + Gia_ManForEachCo( p, pObj, i ) + pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) ); } - Gia_ManForEachCo( p, pObj, i ) - pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) ); pNew = Gia_ManCleanup( pTemp = pNew ); Gia_ManStop( pTemp ); - assert( Gia_ManPiNum(pNew) == Gia_ManRegNum(p) + 2 * Gia_ManPiNum(p) + Gia_ManAndNum(p) ); + assert( Gia_ManPiNum(pNew) == Gia_ManRegNum(p) + 2 * Gia_ManPiNum(p) + (fFfOnly ? Gia_ManRegNum(p) : Gia_ManAndNum(p)) ); return pNew; } @@ -922,8 +943,8 @@ int Gia_ManFaultPrepare( Gia_Man_t * p, Gia_Man_t * pG, Bmc_ParFf_t * pPars, int else if ( pPars->Algo == 1 ) { assert( Gia_ManRegNum(p) > 0 ); - p0 = Gia_ManFaultUnfold( pG, 0 ); - p1 = Gia_ManFaultUnfold( p, 1 ); + p0 = Gia_ManFaultUnfold( pG, 0, pPars->fFfOnly ); + p1 = Gia_ManFaultUnfold( p, 1, pPars->fFfOnly ); } else if ( pPars->Algo == 2 ) p1 = Gia_ManStuckAtUnfold( p, vMap ); -- cgit v1.2.3