diff options
Diffstat (limited to 'abc70930/src/opt/sim/simSupp.c')
-rw-r--r-- | abc70930/src/opt/sim/simSupp.c | 597 |
1 files changed, 0 insertions, 597 deletions
diff --git a/abc70930/src/opt/sim/simSupp.c b/abc70930/src/opt/sim/simSupp.c deleted file mode 100644 index f7048f4a..00000000 --- a/abc70930/src/opt/sim/simSupp.c +++ /dev/null @@ -1,597 +0,0 @@ -/**CFile**************************************************************** - - FileName [simSupp.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Network and node package.] - - Synopsis [Simulation to determine functional support.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: simSupp.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "abc.h" -#include "fraig.h" -#include "sim.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static int Sim_ComputeSuppRound( Sim_Man_t * p, bool fUseTargets ); -static int Sim_ComputeSuppRoundNode( Sim_Man_t * p, int iNumCi, bool fUseTargets ); -static void Sim_ComputeSuppSetTargets( Sim_Man_t * p ); - -static void Sim_UtilAssignRandom( Sim_Man_t * p ); -static void Sim_UtilAssignFromFifo( Sim_Man_t * p ); -static void Sim_SolveTargetsUsingSat( Sim_Man_t * p, int nCounters ); -static int Sim_SolveSuppModelVerify( Abc_Ntk_t * pNtk, int * pModel, int Input, int Output ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Computes structural supports.] - - Description [Supports are returned as an array of bit strings, one - for each CO.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Sim_ComputeStrSupp( Abc_Ntk_t * pNtk ) -{ - Vec_Ptr_t * vSuppStr; - Abc_Obj_t * pNode; - unsigned * pSimmNode, * pSimmNode1, * pSimmNode2; - int nSuppWords, i, k; - // allocate room for structural supports - nSuppWords = SIM_NUM_WORDS( Abc_NtkCiNum(pNtk) ); - vSuppStr = Sim_UtilInfoAlloc( Abc_NtkObjNumMax(pNtk), nSuppWords, 1 ); - // assign the structural support to the PIs - Abc_NtkForEachCi( pNtk, pNode, i ) - Sim_SuppStrSetVar( vSuppStr, pNode, i ); - // derive the structural supports of the internal nodes - Abc_NtkForEachNode( pNtk, pNode, i ) - { -// if ( Abc_NodeIsConst(pNode) ) -// continue; - pSimmNode = vSuppStr->pArray[ pNode->Id ]; - pSimmNode1 = vSuppStr->pArray[ Abc_ObjFaninId0(pNode) ]; - pSimmNode2 = vSuppStr->pArray[ Abc_ObjFaninId1(pNode) ]; - for ( k = 0; k < nSuppWords; k++ ) - pSimmNode[k] = pSimmNode1[k] | pSimmNode2[k]; - } - // set the structural supports of the PO nodes - Abc_NtkForEachCo( pNtk, pNode, i ) - { - pSimmNode = vSuppStr->pArray[ pNode->Id ]; - pSimmNode1 = vSuppStr->pArray[ Abc_ObjFaninId0(pNode) ]; - for ( k = 0; k < nSuppWords; k++ ) - pSimmNode[k] = pSimmNode1[k]; - } - return vSuppStr; -} - -/**Function************************************************************* - - Synopsis [Compute functional supports.] - - Description [Supports are returned as an array of bit strings, one - for each CO.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Vec_Ptr_t * Sim_ComputeFunSupp( Abc_Ntk_t * pNtk, int fVerbose ) -{ - Sim_Man_t * p; - Vec_Ptr_t * vResult; - int nSolved, i, clk = clock(); - - srand( 0xABC ); - - // start the simulation manager - p = Sim_ManStart( pNtk, 0 ); - - // compute functional support using one round of random simulation - Sim_UtilAssignRandom( p ); - Sim_ComputeSuppRound( p, 0 ); - - // set the support targets - Sim_ComputeSuppSetTargets( p ); -if ( fVerbose ) - printf( "Number of support targets after simulation = %5d.\n", Vec_VecSizeSize(p->vSuppTargs) ); - if ( Vec_VecSizeSize(p->vSuppTargs) == 0 ) - goto exit; - - for ( i = 0; i < 1; i++ ) - { - // compute patterns using one round of random simulation - Sim_UtilAssignRandom( p ); - nSolved = Sim_ComputeSuppRound( p, 1 ); - if ( Vec_VecSizeSize(p->vSuppTargs) == 0 ) - goto exit; - -if ( fVerbose ) - printf( "Targets = %5d. Solved = %5d. Fifo = %5d.\n", - Vec_VecSizeSize(p->vSuppTargs), nSolved, Vec_PtrSize(p->vFifo) ); - } - - // try to solve the support targets - while ( Vec_VecSizeSize(p->vSuppTargs) > 0 ) - { - // solve targets until the first disproved one (which gives counter-example) - Sim_SolveTargetsUsingSat( p, p->nSimWords/p->nSuppWords ); - // compute additional functional support - Sim_UtilAssignFromFifo( p ); - nSolved = Sim_ComputeSuppRound( p, 1 ); - -if ( fVerbose ) - printf( "Targets = %5d. Solved = %5d. Fifo = %5d. SAT runs = %3d.\n", - Vec_VecSizeSize(p->vSuppTargs), nSolved, Vec_PtrSize(p->vFifo), p->nSatRuns ); - } - -exit: -p->timeTotal = clock() - clk; - vResult = p->vSuppFun; - // p->vSuppFun = NULL; - Sim_ManStop( p ); - return vResult; -} - -/**Function************************************************************* - - Synopsis [Computes functional support using one round of simulation.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Sim_ComputeSuppRound( Sim_Man_t * p, bool fUseTargets ) -{ - Vec_Int_t * vTargets; - int i, Counter = 0; - int clk; - // perform one round of random simulation -clk = clock(); - Sim_UtilSimulate( p, 0 ); -p->timeSim += clock() - clk; - // iterate through the CIs and detect COs that depend on them - for ( i = p->iInput; i < p->nInputs; i++ ) - { - vTargets = p->vSuppTargs->pArray[i]; - if ( fUseTargets && vTargets->nSize == 0 ) - continue; - Counter += Sim_ComputeSuppRoundNode( p, i, fUseTargets ); - } - return Counter; -} - -/**Function************************************************************* - - Synopsis [Computes functional support for one node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Sim_ComputeSuppRoundNode( Sim_Man_t * p, int iNumCi, bool fUseTargets ) -{ - int fVerbose = 0; - Sim_Pat_t * pPat; - Vec_Int_t * vTargets; - Vec_Vec_t * vNodesByLevel; - Abc_Obj_t * pNodeCi, * pNode; - int i, k, v, Output, LuckyPat, fType0, fType1; - int Counter = 0; - int fFirst = 1; - int clk; - // collect nodes by level in the TFO of the CI - // this proceduredoes not collect the CIs and COs - // but it increments TravId of the collected nodes and CIs/COs -clk = clock(); - pNodeCi = Abc_NtkCi( p->pNtk, iNumCi ); - vNodesByLevel = Abc_DfsLevelized( pNodeCi, 0 ); -p->timeTrav += clock() - clk; - // complement the simulation info of the selected CI - Sim_UtilInfoFlip( p, pNodeCi ); - // simulate the levelized structure of nodes - Vec_VecForEachEntry( vNodesByLevel, pNode, i, k ) - { - fType0 = Abc_NodeIsTravIdCurrent( Abc_ObjFanin0(pNode) ); - fType1 = Abc_NodeIsTravIdCurrent( Abc_ObjFanin1(pNode) ); -clk = clock(); - Sim_UtilSimulateNode( p, pNode, 1, fType0, fType1 ); -p->timeSim += clock() - clk; - } - // set the simulation info of the affected COs - if ( fUseTargets ) - { - vTargets = p->vSuppTargs->pArray[iNumCi]; - for ( i = vTargets->nSize - 1; i >= 0; i-- ) - { - // get the target output - Output = vTargets->pArray[i]; - // get the target node - pNode = Abc_ObjFanin0( Abc_NtkCo(p->pNtk, Output) ); - // the output should be in the cone - assert( Abc_NodeIsTravIdCurrent(pNode) ); - - // skip if the simulation info is equal - if ( Sim_UtilInfoCompare( p, pNode ) ) - continue; - - // otherwise, we solved a new target - Vec_IntRemove( vTargets, Output ); -if ( fVerbose ) - printf( "(%d,%d) ", iNumCi, Output ); - Counter++; - // make sure this variable is not yet detected - assert( !Sim_SuppFunHasVar(p->vSuppFun, Output, iNumCi) ); - // set this variable - Sim_SuppFunSetVar( p->vSuppFun, Output, iNumCi ); - - // detect the differences in the simulation info - Sim_UtilInfoDetectDiffs( p->vSim0->pArray[pNode->Id], p->vSim1->pArray[pNode->Id], p->nSimWords, p->vDiffs ); - // create new patterns - if ( !fFirst && p->vFifo->nSize > 1000 ) - continue; - - Vec_IntForEachEntry( p->vDiffs, LuckyPat, k ) - { - // set the new pattern - pPat = Sim_ManPatAlloc( p ); - pPat->Input = iNumCi; - pPat->Output = Output; - Abc_NtkForEachCi( p->pNtk, pNodeCi, v ) - if ( Sim_SimInfoHasVar( p->vSim0, pNodeCi, LuckyPat ) ) - Sim_SetBit( pPat->pData, v ); - Vec_PtrPush( p->vFifo, pPat ); - - fFirst = 0; - break; - } - } -if ( fVerbose && Counter ) -printf( "\n" ); - } - else - { - Abc_NtkForEachCo( p->pNtk, pNode, Output ) - { - if ( !Abc_NodeIsTravIdCurrent( pNode ) ) - continue; - if ( !Sim_UtilInfoCompare( p, Abc_ObjFanin0(pNode) ) ) - { - if ( !Sim_SuppFunHasVar(p->vSuppFun, Output, iNumCi) ) - { - Counter++; - Sim_SuppFunSetVar( p->vSuppFun, Output, iNumCi ); - } - } - } - } - Vec_VecFree( vNodesByLevel ); - return Counter; -} - -/**Function************************************************************* - - Synopsis [Sets the simulation targets.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Sim_ComputeSuppSetTargets( Sim_Man_t * p ) -{ - Abc_Obj_t * pNode; - unsigned * pSuppStr, * pSuppFun; - int i, k, Num; - Abc_NtkForEachCo( p->pNtk, pNode, i ) - { - pSuppStr = p->vSuppStr->pArray[pNode->Id]; - pSuppFun = p->vSuppFun->pArray[i]; - // find vars in the structural support that are not in the functional support - Sim_UtilInfoDetectNews( pSuppFun, pSuppStr, p->nSuppWords, p->vDiffs ); - Vec_IntForEachEntry( p->vDiffs, Num, k ) - Vec_VecPush( p->vSuppTargs, Num, (void *)i ); - } -} - -/**Function************************************************************* - - Synopsis [Assigns random simulation info to the PIs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Sim_UtilAssignRandom( Sim_Man_t * p ) -{ - Abc_Obj_t * pNode; - unsigned * pSimInfo; - int i, k; - // assign the random/systematic simulation info to the PIs - Abc_NtkForEachCi( p->pNtk, pNode, i ) - { - pSimInfo = p->vSim0->pArray[pNode->Id]; - for ( k = 0; k < p->nSimWords; k++ ) - pSimInfo[k] = SIM_RANDOM_UNSIGNED; - } -} - -/**Function************************************************************* - - Synopsis [Sets the new patterns from fifo.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Sim_UtilAssignFromFifo( Sim_Man_t * p ) -{ - int fUseOneWord = 0; - Abc_Obj_t * pNode; - Sim_Pat_t * pPat; - unsigned * pSimInfo; - int nWordsNew, iWord, iWordLim, i, w; - int iBeg, iEnd; - int Counter = 0; - // go through the patterns and fill in the dist-1 minterms for each - for ( iWord = 0; p->vFifo->nSize > 0; iWord = iWordLim ) - { - ++Counter; - // get the pattern - pPat = Vec_PtrPop( p->vFifo ); - if ( fUseOneWord ) - { - // get the first word of the next series - iWordLim = iWord + 1; - // set the pattern for all PIs from iBit to iWord + p->nInputs - iBeg = p->iInput; - iEnd = ABC_MIN( iBeg + 32, p->nInputs ); -// for ( i = iBeg; i < iEnd; i++ ) - Abc_NtkForEachCi( p->pNtk, pNode, i ) - { - pNode = Abc_NtkCi(p->pNtk,i); - pSimInfo = p->vSim0->pArray[pNode->Id]; - if ( Sim_HasBit(pPat->pData, i) ) - pSimInfo[iWord] = SIM_MASK_FULL; - else - pSimInfo[iWord] = 0; - // flip one bit - if ( i >= iBeg && i < iEnd ) - Sim_XorBit( pSimInfo + iWord, i-iBeg ); - } - } - else - { - // get the number of words for the remaining inputs - nWordsNew = p->nSuppWords; -// nWordsNew = SIM_NUM_WORDS( p->nInputs - p->iInput ); - // get the first word of the next series - iWordLim = (iWord + nWordsNew < p->nSimWords)? iWord + nWordsNew : p->nSimWords; - // set the pattern for all CIs from iWord to iWord + nWordsNew - Abc_NtkForEachCi( p->pNtk, pNode, i ) - { - pSimInfo = p->vSim0->pArray[pNode->Id]; - if ( Sim_HasBit(pPat->pData, i) ) - { - for ( w = iWord; w < iWordLim; w++ ) - pSimInfo[w] = SIM_MASK_FULL; - } - else - { - for ( w = iWord; w < iWordLim; w++ ) - pSimInfo[w] = 0; - } - Sim_XorBit( pSimInfo + iWord, i ); - // flip one bit -// if ( i >= p->iInput ) -// Sim_XorBit( pSimInfo + iWord, i-p->iInput ); - } - } - Sim_ManPatFree( p, pPat ); - // stop if we ran out of room for patterns - if ( iWordLim == p->nSimWords ) - break; -// if ( Counter == 1 ) -// break; - } -} - -/**Function************************************************************* - - Synopsis [Get the given number of counter-examples using SAT.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Sim_SolveTargetsUsingSat( Sim_Man_t * p, int Limit ) -{ - Fraig_Params_t Params; - Fraig_Man_t * pMan; - Abc_Obj_t * pNodeCi; - Abc_Ntk_t * pMiter; - Sim_Pat_t * pPat; - void * pEntry; - int * pModel; - int RetValue, Output, Input, k, v; - int Counter = 0; - int clk; - - p->nSatRuns = 0; - // put targets into one array - Vec_VecForEachEntryReverse( p->vSuppTargs, pEntry, Input, k ) - { - p->nSatRuns++; - Output = (int)pEntry; - - // set up the miter for the two cofactors of this output w.r.t. this input - pMiter = Abc_NtkMiterForCofactors( p->pNtk, Output, Input, -1 ); - - // transform the miter into a fraig - Fraig_ParamsSetDefault( &Params ); - Params.nSeconds = ABC_INFINITY; - Params.fInternal = 1; -clk = clock(); - pMan = Abc_NtkToFraig( pMiter, &Params, 0, 0 ); -p->timeFraig += clock() - clk; -clk = clock(); - Fraig_ManProveMiter( pMan ); -p->timeSat += clock() - clk; - - // analyze the result - RetValue = Fraig_ManCheckMiter( pMan ); - assert( RetValue >= 0 ); - if ( RetValue == 1 ) // unsat - { - p->nSatRunsUnsat++; - pModel = NULL; - Vec_PtrRemove( p->vSuppTargs->pArray[Input], pEntry ); - } - else // sat - { - p->nSatRunsSat++; - pModel = Fraig_ManReadModel( pMan ); - assert( pModel != NULL ); - assert( Sim_SolveSuppModelVerify( p->pNtk, pModel, Input, Output ) ); - -//printf( "Solved by SAT (%d,%d).\n", Input, Output ); - // set the new pattern - pPat = Sim_ManPatAlloc( p ); - pPat->Input = Input; - pPat->Output = Output; - Abc_NtkForEachCi( p->pNtk, pNodeCi, v ) - if ( pModel[v] ) - Sim_SetBit( pPat->pData, v ); - Vec_PtrPush( p->vFifo, pPat ); -/* - // set the new pattern - pPat = Sim_ManPatAlloc( p ); - pPat->Input = Input; - pPat->Output = Output; - Abc_NtkForEachCi( p->pNtk, pNodeCi, v ) - if ( pModel[v] ) - Sim_SetBit( pPat->pData, v ); - Sim_XorBit( pPat->pData, Input ); // add this bit in the opposite polarity - Vec_PtrPush( p->vFifo, pPat ); -*/ - Counter++; - } - // delete the fraig manager - Fraig_ManFree( pMan ); - // delete the miter - Abc_NtkDelete( pMiter ); - - // makr the input, which we are processing - p->iInput = Input; - - // stop when we found enough patterns -// if ( Counter == Limit ) - if ( Counter == 1 ) - return; - } -} - - -/**Function************************************************************* - - Synopsis [Saves the counter example.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Sim_NtkSimTwoPats_rec( Abc_Obj_t * pNode ) -{ - int Value0, Value1; - if ( Abc_NodeIsTravIdCurrent( pNode ) ) - return (int)pNode->pCopy; - Abc_NodeSetTravIdCurrent( pNode ); - Value0 = Sim_NtkSimTwoPats_rec( Abc_ObjFanin0(pNode) ); - Value1 = Sim_NtkSimTwoPats_rec( Abc_ObjFanin1(pNode) ); - if ( Abc_ObjFaninC0(pNode) ) - Value0 = ~Value0; - if ( Abc_ObjFaninC1(pNode) ) - Value1 = ~Value1; - pNode->pCopy = (Abc_Obj_t *)(Value0 & Value1); - return Value0 & Value1; -} - -/**Function************************************************************* - - Synopsis [Verifies that pModel proves the presence of Input in the support of Output.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Sim_SolveSuppModelVerify( Abc_Ntk_t * pNtk, int * pModel, int Input, int Output ) -{ - Abc_Obj_t * pNode; - int RetValue, i; - // set the PI values - Abc_NtkIncrementTravId( pNtk ); - Abc_NtkForEachCi( pNtk, pNode, i ) - { - Abc_NodeSetTravIdCurrent( pNode ); - if ( pNode == Abc_NtkCi(pNtk,Input) ) - pNode->pCopy = (Abc_Obj_t *)1; - else if ( pModel[i] == 1 ) - pNode->pCopy = (Abc_Obj_t *)3; - else - pNode->pCopy = NULL; - } - // perform the traversal - RetValue = 3 & Sim_NtkSimTwoPats_rec( Abc_ObjFanin0( Abc_NtkCo(pNtk,Output) ) ); -// assert( RetValue == 1 || RetValue == 2 ); - return RetValue == 1 || RetValue == 2; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - |