summaryrefslogtreecommitdiffstats
path: root/src/aig/cec/cecSeq.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/aig/cec/cecSeq.c')
-rw-r--r--src/aig/cec/cecSeq.c448
1 files changed, 0 insertions, 448 deletions
diff --git a/src/aig/cec/cecSeq.c b/src/aig/cec/cecSeq.c
deleted file mode 100644
index dd561971..00000000
--- a/src/aig/cec/cecSeq.c
+++ /dev/null
@@ -1,448 +0,0 @@
-/**CFile****************************************************************
-
- FileName [cecSeq.c]
-
- SystemName [ABC: Logic synthesis and verification system.]
-
- PackageName [Combinational equivalence checking.]
-
- Synopsis [Refinement of sequential equivalence classes.]
-
- Author [Alan Mishchenko]
-
- Affiliation [UC Berkeley]
-
- Date [Ver. 1.0. Started - June 20, 2005.]
-
- Revision [$Id: cecSeq.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
-
-***********************************************************************/
-
-#include "cecInt.h"
-
-ABC_NAMESPACE_IMPL_START
-
-
-////////////////////////////////////////////////////////////////////////
-/// DECLARATIONS ///
-////////////////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////////////////
-/// FUNCTION DEFINITIONS ///
-////////////////////////////////////////////////////////////////////////
-
-/**Function*************************************************************
-
- Synopsis [Sets register values from the counter-example.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Cec_ManSeqDeriveInfoFromCex( Vec_Ptr_t * vInfo, Gia_Man_t * pAig, Abc_Cex_t * pCex )
-{
- unsigned * pInfo;
- int k, i, w, nWords;
- assert( pCex->nBits == pCex->nRegs + pCex->nPis * (pCex->iFrame + 1) );
- assert( pCex->nBits - pCex->nRegs + Gia_ManRegNum(pAig) <= Vec_PtrSize(vInfo) );
- nWords = Vec_PtrReadWordsSimInfo( vInfo );
-/*
- // user register values
- assert( pCex->nRegs == Gia_ManRegNum(pAig) );
- for ( k = 0; k < pCex->nRegs; k++ )
- {
- pInfo = (unsigned *)Vec_PtrEntry( vInfo, k );
- for ( w = 0; w < nWords; w++ )
- pInfo[w] = Gia_InfoHasBit( pCex->pData, k )? ~0 : 0;
- }
-*/
- // print warning about register values
- for ( k = 0; k < pCex->nRegs; k++ )
- if ( Gia_InfoHasBit( pCex->pData, k ) )
- break;
- if ( k < pCex->nRegs )
- Abc_Print( 0, "The CEX has flop values different from 0, but they are currently not used by \"resim\".\n" );
-
- // assign zero register values
- for ( k = 0; k < Gia_ManRegNum(pAig); k++ )
- {
- pInfo = (unsigned *)Vec_PtrEntry( vInfo, k );
- for ( w = 0; w < nWords; w++ )
- pInfo[w] = 0;
- }
- for ( i = pCex->nRegs; i < pCex->nBits; i++ )
- {
- pInfo = (unsigned *)Vec_PtrEntry( vInfo, k++ );
- for ( w = 0; w < nWords; w++ )
- pInfo[w] = Gia_ManRandom(0);
- // set simulation pattern and make sure it is second (first will be erased during simulation)
- pInfo[0] = (pInfo[0] << 1) | Gia_InfoHasBit( pCex->pData, i );
- pInfo[0] <<= 1;
- }
- for ( ; k < Vec_PtrSize(vInfo); k++ )
- {
- pInfo = (unsigned *)Vec_PtrEntry( vInfo, k );
- for ( w = 0; w < nWords; w++ )
- pInfo[w] = Gia_ManRandom(0);
- }
-}
-
-/**Function*************************************************************
-
- Synopsis [Sets register values from the counter-example.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Cec_ManSeqDeriveInfoInitRandom( Vec_Ptr_t * vInfo, Gia_Man_t * pAig, Abc_Cex_t * pCex )
-{
- unsigned * pInfo;
- int k, w, nWords;
- nWords = Vec_PtrReadWordsSimInfo( vInfo );
- assert( pCex == NULL || Gia_ManRegNum(pAig) == pCex->nRegs );
- assert( Gia_ManRegNum(pAig) <= Vec_PtrSize(vInfo) );
- for ( k = 0; k < Gia_ManRegNum(pAig); k++ )
- {
- pInfo = (unsigned *)Vec_PtrEntry( vInfo, k );
- for ( w = 0; w < nWords; w++ )
- pInfo[w] = (pCex && Gia_InfoHasBit(pCex->pData, k))? ~0 : 0;
- }
-
- for ( ; k < Vec_PtrSize(vInfo); k++ )
- {
- pInfo = (unsigned *)Vec_PtrEntry( vInfo, k );
- for ( w = 0; w < nWords; w++ )
- pInfo[w] = Gia_ManRandom( 0 );
- }
-}
-
-/**Function*************************************************************
-
- Synopsis [Resimulates the classes using sequential simulation info.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-int Cec_ManSeqResimulate( Cec_ManSim_t * p, Vec_Ptr_t * vInfo )
-{
- unsigned * pInfo0, * pInfo1;
- int f, i, k, w;
-// assert( Gia_ManRegNum(p->pAig) > 0 );
- assert( Vec_PtrSize(vInfo) == Gia_ManRegNum(p->pAig) + Gia_ManPiNum(p->pAig) * p->pPars->nFrames );
- for ( k = 0; k < Gia_ManRegNum(p->pAig); k++ )
- {
- pInfo0 = (unsigned *)Vec_PtrEntry( vInfo, k );
- pInfo1 = (unsigned *)Vec_PtrEntry( p->vCoSimInfo, Gia_ManPoNum(p->pAig) + k );
- for ( w = 0; w < p->nWords; w++ )
- pInfo1[w] = pInfo0[w];
- }
- for ( f = 0; f < p->pPars->nFrames; f++ )
- {
- for ( i = 0; i < Gia_ManPiNum(p->pAig); i++ )
- {
- pInfo0 = (unsigned *)Vec_PtrEntry( vInfo, k++ );
- pInfo1 = (unsigned *)Vec_PtrEntry( p->vCiSimInfo, i );
- for ( w = 0; w < p->nWords; w++ )
- pInfo1[w] = pInfo0[w];
- }
- for ( i = 0; i < Gia_ManRegNum(p->pAig); i++ )
- {
- pInfo0 = (unsigned *)Vec_PtrEntry( p->vCoSimInfo, Gia_ManPoNum(p->pAig) + i );
- pInfo1 = (unsigned *)Vec_PtrEntry( p->vCiSimInfo, Gia_ManPiNum(p->pAig) + i );
- for ( w = 0; w < p->nWords; w++ )
- pInfo1[w] = pInfo0[w];
- }
- if ( Cec_ManSimSimulateRound( p, p->vCiSimInfo, p->vCoSimInfo ) )
- return 1;
- }
- assert( k == Vec_PtrSize(vInfo) );
- return 0;
-}
-
-/**Function*************************************************************
-
- Synopsis [Resimulates information to refine equivalence classes.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-int Cec_ManSeqResimulateInfo( Gia_Man_t * pAig, Vec_Ptr_t * vSimInfo, Abc_Cex_t * pBestState, int fCheckMiter )
-{
- Cec_ParSim_t ParsSim, * pParsSim = &ParsSim;
- Cec_ManSim_t * pSim;
- int RetValue, clkTotal = clock();
- assert( (Vec_PtrSize(vSimInfo) - Gia_ManRegNum(pAig)) % Gia_ManPiNum(pAig) == 0 );
- Cec_ManSimSetDefaultParams( pParsSim );
- pParsSim->nFrames = (Vec_PtrSize(vSimInfo) - Gia_ManRegNum(pAig)) / Gia_ManPiNum(pAig);
- pParsSim->nWords = Vec_PtrReadWordsSimInfo( vSimInfo );
- pParsSim->fCheckMiter = fCheckMiter;
- Gia_ManSetRefs( pAig );
- pSim = Cec_ManSimStart( pAig, pParsSim );
- if ( pBestState )
- pSim->pBestState = pBestState;
- RetValue = Cec_ManSeqResimulate( pSim, vSimInfo );
- pSim->pBestState = NULL;
- Cec_ManSimStop( pSim );
- return RetValue;
-}
-
-/**Function*************************************************************
-
- Synopsis [Resimuates one counter-example to refine equivalence classes.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-int Cec_ManSeqResimulateCounter( Gia_Man_t * pAig, Cec_ParSim_t * pPars, Abc_Cex_t * pCex )
-{
- Vec_Ptr_t * vSimInfo;
- int RetValue, clkTotal = clock();
- if ( pCex == NULL )
- {
- Abc_Print( 1, "Cec_ManSeqResimulateCounter(): Counter-example is not available.\n" );
- return -1;
- }
- if ( pAig->pReprs == NULL )
- {
- Abc_Print( 1, "Cec_ManSeqResimulateCounter(): Equivalence classes are not available.\n" );
- return -1;
- }
- if ( Gia_ManRegNum(pAig) == 0 )
- {
- Abc_Print( 1, "Cec_ManSeqResimulateCounter(): Not a sequential AIG.\n" );
- return -1;
- }
-// if ( Gia_ManRegNum(pAig) != pCex->nRegs || Gia_ManPiNum(pAig) != pCex->nPis )
- if ( Gia_ManPiNum(pAig) != pCex->nPis )
- {
- Abc_Print( 1, "Cec_ManSeqResimulateCounter(): The number of PIs in the AIG and the counter-example differ.\n" );
- return -1;
- }
- if ( pPars->fVerbose )
- Abc_Print( 1, "Resimulating %d timeframes.\n", pPars->nFrames + pCex->iFrame + 1 );
- Gia_ManRandom( 1 );
- vSimInfo = Vec_PtrAllocSimInfo( Gia_ManRegNum(pAig) +
- Gia_ManPiNum(pAig) * (pPars->nFrames + pCex->iFrame + 1), 1 );
- Cec_ManSeqDeriveInfoFromCex( vSimInfo, pAig, pCex );
- if ( pPars->fVerbose )
- Gia_ManEquivPrintClasses( pAig, 0, 0 );
- RetValue = Cec_ManSeqResimulateInfo( pAig, vSimInfo, NULL, pPars->fCheckMiter );
- if ( pPars->fVerbose )
- Gia_ManEquivPrintClasses( pAig, 0, 0 );
- Vec_PtrFree( vSimInfo );
- if ( pPars->fVerbose )
- ABC_PRT( "Time", clock() - clkTotal );
-// if ( RetValue && pPars->fCheckMiter )
-// Abc_Print( 1, "Cec_ManSeqResimulateCounter(): An output of the miter is asserted!\n" );
- return RetValue;
-}
-
-
-/**Function*************************************************************
-
- Synopsis [Returns the number of POs that are not const0 cands.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-int Cec_ManCountNonConstOutputs( Gia_Man_t * pAig )
-{
- Gia_Obj_t * pObj;
- int i, Counter = 0;
- if ( pAig->pReprs == NULL )
- return -1;
- Gia_ManForEachPo( pAig, pObj, i )
- if ( !Gia_ObjIsConst( pAig, Gia_ObjFaninId0p(pAig, pObj) ) )
- Counter++;
- return Counter;
-}
-
-/**Function*************************************************************
-
- Synopsis [Returns the number of POs that are not const0 cands.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-int Cec_ManCheckNonTrivialCands( Gia_Man_t * pAig )
-{
- Gia_Obj_t * pObj;
- int i, RetValue = 0;
- if ( pAig->pReprs == NULL )
- return 0;
- // label internal nodes driving POs
- Gia_ManForEachPo( pAig, pObj, i )
- Gia_ObjFanin0(pObj)->fMark0 = 1;
- // check if there are non-labled equivs
- Gia_ManForEachObj( pAig, pObj, i )
- if ( Gia_ObjIsCand(pObj) && !pObj->fMark0 && Gia_ObjRepr(pAig, i) != GIA_VOID )
- {
- RetValue = 1;
- break;
- }
- // clean internal nodes driving POs
- Gia_ManForEachPo( pAig, pObj, i )
- Gia_ObjFanin0(pObj)->fMark0 = 0;
- return RetValue;
-}
-
-/**Function*************************************************************
-
- Synopsis [Performs semiformal refinement of equivalence classes.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-int Cec_ManSeqSemiformal( Gia_Man_t * pAig, Cec_ParSmf_t * pPars )
-{
- int nAddFrames = 16; // additional timeframes to simulate
- int nCountNoRef = 0;
- int nFramesReal;
- Cec_ParSat_t ParsSat, * pParsSat = &ParsSat;
- Vec_Ptr_t * vSimInfo;
- Vec_Str_t * vStatus;
- Abc_Cex_t * pState;
- Gia_Man_t * pSrm, * pReduce, * pAux;
- int r, nPats, RetValue = 0;
- if ( pAig->pReprs == NULL )
- {
- Abc_Print( 1, "Cec_ManSeqSemiformal(): Equivalence classes are not available.\n" );
- return -1;
- }
- if ( Gia_ManRegNum(pAig) == 0 )
- {
- Abc_Print( 1, "Cec_ManSeqSemiformal(): Not a sequential AIG.\n" );
- return -1;
- }
- Gia_ManRandom( 1 );
- // prepare starting pattern
- pState = Abc_CexAlloc( Gia_ManRegNum(pAig), 0, 0 );
- pState->iFrame = -1;
- pState->iPo = -1;
- // prepare SAT solving
- Cec_ManSatSetDefaultParams( pParsSat );
- pParsSat->nBTLimit = pPars->nBTLimit;
- pParsSat->fVerbose = pPars->fVerbose;
- if ( pParsSat->fVerbose )
- {
- Abc_Print( 1, "Starting: " );
- Gia_ManEquivPrintClasses( pAig, 0, 0 );
- }
- // perform the given number of BMC rounds
- Gia_ManCleanMark0( pAig );
- for ( r = 0; r < pPars->nRounds; r++ )
- {
- if ( !Cec_ManCheckNonTrivialCands(pAig) )
- {
- Abc_Print( 1, "Cec_ManSeqSemiformal: There are only trivial equiv candidates left (PO drivers). Quitting.\n" );
- break;
- }
-// Abc_CexPrint( pState );
- // derive speculatively reduced model
-// pSrm = Gia_ManSpecReduceInit( pAig, pState, pPars->nFrames, pPars->fDualOut );
- pSrm = Gia_ManSpecReduceInitFrames( pAig, pState, pPars->nFrames, &nFramesReal, pPars->fDualOut, pPars->nMinOutputs );
- if ( pSrm == NULL )
- {
- Abc_Print( 1, "Quitting refinement because miter could not be unrolled.\n" );
- break;
- }
- assert( Gia_ManRegNum(pSrm) == 0 && Gia_ManPiNum(pSrm) == (Gia_ManPiNum(pAig) * nFramesReal) );
- if ( pPars->fVerbose )
- Abc_Print( 1, "Unrolled for %d frames.\n", nFramesReal );
- // allocate room for simulation info
- vSimInfo = Vec_PtrAllocSimInfo( Gia_ManRegNum(pAig) +
- Gia_ManPiNum(pAig) * (nFramesReal + nAddFrames), pPars->nWords );
- Cec_ManSeqDeriveInfoInitRandom( vSimInfo, pAig, pState );
- // fill in simulation info with counter-examples
- vStatus = Cec_ManSatSolveSeq( vSimInfo, pSrm, pParsSat, Gia_ManRegNum(pAig), &nPats );
- Vec_StrFree( vStatus );
- Gia_ManStop( pSrm );
- // resimulate and refine the classes
- RetValue = Cec_ManSeqResimulateInfo( pAig, vSimInfo, pState, pPars->fCheckMiter );
- Vec_PtrFree( vSimInfo );
- assert( pState->iPo >= 0 ); // hit counter
- pState->iPo = -1;
- if ( pPars->fVerbose )
- {
- Abc_Print( 1, "BMC = %3d ", nPats );
- Gia_ManEquivPrintClasses( pAig, 0, 0 );
- }
-
- // write equivalence classes
- Gia_WriteAiger( pAig, "gore.aig", 0, 0 );
- // reduce the model
- pReduce = Gia_ManSpecReduce( pAig, 0, 0, 1, 0, 0 );
- if ( pReduce )
- {
- pReduce = Gia_ManSeqStructSweep( pAux = pReduce, 1, 1, 0 );
- Gia_ManStop( pAux );
- Gia_WriteAiger( pReduce, "gsrm.aig", 0, 0 );
-// Abc_Print( 1, "Speculatively reduced model was written into file \"%s\".\n", "gsrm.aig" );
-// Gia_ManPrintStatsShort( pReduce );
- Gia_ManStop( pReduce );
- }
-
- if ( RetValue )
- {
- Abc_Print( 1, "Cec_ManSeqSemiformal(): An output of the miter is asserted. Refinement stopped.\n" );
- break;
- }
- // decide when to stop
- if ( nPats > 0 )
- nCountNoRef = 0;
- else if ( ++nCountNoRef == pPars->nNonRefines )
- break;
- }
- ABC_FREE( pState );
- if ( pPars->fCheckMiter )
- {
- int nNonConsts = Cec_ManCountNonConstOutputs( pAig );
- if ( nNonConsts )
- Abc_Print( 1, "The number of POs that are not const-0 candidates = %d.\n", nNonConsts );
- }
- return RetValue;
-}
-
-//&r s13207.aig; &ps; &equiv; &ps; &semi -R 2 -vm
-//&r bug/50/temp.aig; &ps; &equiv -smv; &semi -v
-//r mentor/1_05c.blif; st; &get; &ps; &equiv -smv; &semi -mv
-//&r bug/50/hdl1.aig; &ps; &equiv -smv; &semi -mv; &srm; &r gsrm.aig; &ps
-
-////////////////////////////////////////////////////////////////////////
-/// END OF FILE ///
-////////////////////////////////////////////////////////////////////////
-
-
-ABC_NAMESPACE_IMPL_END
-