| /**CFile**************************************************************** |
| |
| FileName [resSim.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Resynthesis package.] |
| |
| Synopsis [Simulation engine.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - January 15, 2007.] |
| |
| Revision [$Id: resSim.c,v 1.00 2007/01/15 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "base/abc/abc.h" |
| #include "resInt.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Allocate simulation engine.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Res_Sim_t * Res_SimAlloc( int nWords ) |
| { |
| Res_Sim_t * p; |
| p = ABC_ALLOC( Res_Sim_t, 1 ); |
| memset( p, 0, sizeof(Res_Sim_t) ); |
| // simulation parameters |
| p->nWords = nWords; |
| p->nPats = p->nWords * 8 * sizeof(unsigned); |
| p->nWordsIn = p->nPats; |
| p->nBytesIn = p->nPats * sizeof(unsigned); |
| p->nPatsIn = p->nPats * 8 * sizeof(unsigned); |
| p->nWordsOut = p->nPats * p->nWords; |
| p->nPatsOut = p->nPats * p->nPats; |
| // simulation info |
| p->vPats = Vec_PtrAllocSimInfo( 1024, p->nWordsIn ); |
| p->vPats0 = Vec_PtrAllocSimInfo( 128, p->nWords ); |
| p->vPats1 = Vec_PtrAllocSimInfo( 128, p->nWords ); |
| p->vOuts = Vec_PtrAllocSimInfo( 128, p->nWordsOut ); |
| // resub candidates |
| p->vCands = Vec_VecStart( 16 ); |
| return p; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Allocate simulation engine.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimAdjust( Res_Sim_t * p, Abc_Ntk_t * pAig, int nTruePis ) |
| { |
| srand( 0xABC ); |
| |
| assert( Abc_NtkIsStrash(pAig) ); |
| p->pAig = pAig; |
| p->nTruePis = nTruePis; |
| if ( Vec_PtrSize(p->vPats) < Abc_NtkObjNumMax(pAig)+1 ) |
| { |
| Vec_PtrFree( p->vPats ); |
| p->vPats = Vec_PtrAllocSimInfo( Abc_NtkObjNumMax(pAig)+1, p->nWordsIn ); |
| } |
| if ( Vec_PtrSize(p->vPats0) < nTruePis ) |
| { |
| Vec_PtrFree( p->vPats0 ); |
| p->vPats0 = Vec_PtrAllocSimInfo( nTruePis, p->nWords ); |
| } |
| if ( Vec_PtrSize(p->vPats1) < nTruePis ) |
| { |
| Vec_PtrFree( p->vPats1 ); |
| p->vPats1 = Vec_PtrAllocSimInfo( nTruePis, p->nWords ); |
| } |
| if ( Vec_PtrSize(p->vOuts) < Abc_NtkPoNum(pAig) ) |
| { |
| Vec_PtrFree( p->vOuts ); |
| p->vOuts = Vec_PtrAllocSimInfo( Abc_NtkPoNum(pAig), p->nWordsOut ); |
| } |
| // clean storage info for patterns |
| Abc_InfoClear( (unsigned *)Vec_PtrEntry(p->vPats0,0), p->nWords * nTruePis ); |
| Abc_InfoClear( (unsigned *)Vec_PtrEntry(p->vPats1,0), p->nWords * nTruePis ); |
| p->nPats0 = 0; |
| p->nPats1 = 0; |
| p->fConst0 = 0; |
| p->fConst1 = 0; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Free simulation engine.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimFree( Res_Sim_t * p ) |
| { |
| Vec_PtrFree( p->vPats ); |
| Vec_PtrFree( p->vPats0 ); |
| Vec_PtrFree( p->vPats1 ); |
| Vec_PtrFree( p->vOuts ); |
| Vec_VecFree( p->vCands ); |
| ABC_FREE( p ); |
| } |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [Sets random PI simulation info.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Abc_InfoRandomBytes( unsigned * p, int nWords ) |
| { |
| int i, Num; |
| for ( i = nWords - 1; i >= 0; i-- ) |
| { |
| Num = rand(); |
| p[i] = (Num & 1)? 0xff : 0; |
| p[i] = (p[i] << 8) | ((Num & 2)? 0xff : 0); |
| p[i] = (p[i] << 8) | ((Num & 4)? 0xff : 0); |
| p[i] = (p[i] << 8) | ((Num & 8)? 0xff : 0); |
| } |
| // Extra_PrintBinary( stdout, p, 32 ); printf( "\n" ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Sets random PI simulation info.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimSetRandomBytes( Res_Sim_t * p ) |
| { |
| Abc_Obj_t * pObj; |
| unsigned * pInfo; |
| int i; |
| Abc_NtkForEachPi( p->pAig, pObj, i ) |
| { |
| pInfo = (unsigned *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| if ( i < p->nTruePis ) |
| Abc_InfoRandomBytes( pInfo, p->nWordsIn ); |
| else |
| Abc_InfoRandom( pInfo, p->nWordsIn ); |
| } |
| /* |
| // double-check that all are byte-patterns |
| Abc_NtkForEachPi( p->pAig, pObj, i ) |
| { |
| if ( i == p->nTruePis ) |
| break; |
| pInfoC = (unsigned char *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| for ( k = 0; k < p->nBytesIn; k++ ) |
| assert( pInfoC[k] == 0 || pInfoC[k] == 0xff ); |
| } |
| */ |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Sets random PI simulation info.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimSetDerivedBytes( Res_Sim_t * p, int fUseWalk ) |
| { |
| Vec_Ptr_t * vPatsSource[2]; |
| int nPatsSource[2]; |
| Abc_Obj_t * pObj; |
| unsigned char * pInfo; |
| int i, k, z, s, nPats; |
| |
| // set several random patterns |
| assert( p->nBytesIn % 32 == 0 ); |
| nPats = p->nBytesIn/8; |
| Abc_NtkForEachPi( p->pAig, pObj, i ) |
| { |
| if ( i == p->nTruePis ) |
| break; |
| Abc_InfoRandomBytes( (unsigned *)Vec_PtrEntry(p->vPats, pObj->Id), nPats/4 ); |
| } |
| |
| // set special patterns |
| if ( fUseWalk ) |
| { |
| for ( z = 0; z < 2; z++ ) |
| { |
| // set the zero pattern |
| Abc_NtkForEachPi( p->pAig, pObj, i ) |
| { |
| if ( i == p->nTruePis ) |
| break; |
| pInfo = (unsigned char *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| pInfo[nPats] = z ? 0xff : 0; |
| } |
| if ( ++nPats == p->nBytesIn ) |
| return; |
| // set the walking zero pattern |
| for ( k = 0; k < p->nTruePis; k++ ) |
| { |
| Abc_NtkForEachPi( p->pAig, pObj, i ) |
| { |
| if ( i == p->nTruePis ) |
| break; |
| pInfo = (unsigned char *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| pInfo[nPats] = ((i == k) ^ z) ? 0xff : 0; |
| } |
| if ( ++nPats == p->nBytesIn ) |
| return; |
| } |
| } |
| } |
| |
| // decide what patterns to set first |
| if ( p->nPats0 < p->nPats1 ) |
| { |
| nPatsSource[0] = p->nPats0; |
| vPatsSource[0] = p->vPats0; |
| nPatsSource[1] = p->nPats1; |
| vPatsSource[1] = p->vPats1; |
| } |
| else |
| { |
| nPatsSource[0] = p->nPats1; |
| vPatsSource[0] = p->vPats1; |
| nPatsSource[1] = p->nPats0; |
| vPatsSource[1] = p->vPats0; |
| } |
| for ( z = 0; z < 2; z++ ) |
| { |
| for ( s = nPatsSource[z] - 1; s >= 0; s-- ) |
| { |
| // if ( s == 0 ) |
| // printf( "Patterns:\n" ); |
| // set the given source pattern |
| for ( k = 0; k < p->nTruePis; k++ ) |
| { |
| Abc_NtkForEachPi( p->pAig, pObj, i ) |
| { |
| if ( i == p->nTruePis ) |
| break; |
| pInfo = (unsigned char *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| if ( (i == k) ^ Abc_InfoHasBit( (unsigned *)Vec_PtrEntry(vPatsSource[z], i), s ) ) |
| { |
| pInfo[nPats] = 0xff; |
| // if ( s == 0 ) |
| // printf( "1" ); |
| } |
| else |
| { |
| pInfo[nPats] = 0; |
| // if ( s == 0 ) |
| // printf( "0" ); |
| } |
| } |
| // if ( s == 0 ) |
| // printf( "\n" ); |
| if ( ++nPats == p->nBytesIn ) |
| return; |
| } |
| } |
| } |
| // clean the rest |
| for ( z = nPats; z < p->nBytesIn; z++ ) |
| { |
| Abc_NtkForEachPi( p->pAig, pObj, i ) |
| { |
| if ( i == p->nTruePis ) |
| break; |
| pInfo = (unsigned char *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| memset( pInfo + nPats, 0, p->nBytesIn - nPats ); |
| } |
| } |
| /* |
| // double-check that all are byte-patterns |
| Abc_NtkForEachPi( p->pAig, pObj, i ) |
| { |
| if ( i == p->nTruePis ) |
| break; |
| pInfo = (unsigned char *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| for ( k = 0; k < p->nBytesIn; k++ ) |
| assert( pInfo[k] == 0 || pInfo[k] == 0xff ); |
| } |
| */ |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Sets given PI simulation info.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimSetGiven( Res_Sim_t * p, Vec_Ptr_t * vInfo ) |
| { |
| Abc_Obj_t * pObj; |
| unsigned * pInfo, * pInfo2; |
| int i, w; |
| Abc_NtkForEachPi( p->pAig, pObj, i ) |
| { |
| if ( i == p->nTruePis ) |
| break; |
| pInfo = (unsigned *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| pInfo2 = (unsigned *)Vec_PtrEntry( vInfo, i ); |
| for ( w = 0; w < p->nWords; w++ ) |
| pInfo[w] = pInfo2[w]; |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Simulates one node.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimPerformOne( Abc_Obj_t * pNode, Vec_Ptr_t * vSimInfo, int nSimWords ) |
| { |
| unsigned * pInfo, * pInfo1, * pInfo2; |
| int k, fComp1, fComp2; |
| // simulate the internal nodes |
| assert( Abc_ObjIsNode(pNode) ); |
| pInfo = (unsigned *)Vec_PtrEntry(vSimInfo, pNode->Id); |
| pInfo1 = (unsigned *)Vec_PtrEntry(vSimInfo, Abc_ObjFaninId0(pNode)); |
| pInfo2 = (unsigned *)Vec_PtrEntry(vSimInfo, Abc_ObjFaninId1(pNode)); |
| fComp1 = Abc_ObjFaninC0(pNode); |
| fComp2 = Abc_ObjFaninC1(pNode); |
| if ( fComp1 && fComp2 ) |
| for ( k = 0; k < nSimWords; k++ ) |
| pInfo[k] = ~pInfo1[k] & ~pInfo2[k]; |
| else if ( fComp1 && !fComp2 ) |
| for ( k = 0; k < nSimWords; k++ ) |
| pInfo[k] = ~pInfo1[k] & pInfo2[k]; |
| else if ( !fComp1 && fComp2 ) |
| for ( k = 0; k < nSimWords; k++ ) |
| pInfo[k] = pInfo1[k] & ~pInfo2[k]; |
| else // if ( fComp1 && fComp2 ) |
| for ( k = 0; k < nSimWords; k++ ) |
| pInfo[k] = pInfo1[k] & pInfo2[k]; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Simulates one CO node.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimTransferOne( Abc_Obj_t * pNode, Vec_Ptr_t * vSimInfo, int nSimWords ) |
| { |
| unsigned * pInfo, * pInfo1; |
| int k, fComp1; |
| // simulate the internal nodes |
| assert( Abc_ObjIsCo(pNode) ); |
| pInfo = (unsigned *)Vec_PtrEntry(vSimInfo, pNode->Id); |
| pInfo1 = (unsigned *)Vec_PtrEntry(vSimInfo, Abc_ObjFaninId0(pNode)); |
| fComp1 = Abc_ObjFaninC0(pNode); |
| if ( fComp1 ) |
| for ( k = 0; k < nSimWords; k++ ) |
| pInfo[k] = ~pInfo1[k]; |
| else |
| for ( k = 0; k < nSimWords; k++ ) |
| pInfo[k] = pInfo1[k]; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Performs one round of simulation.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimPerformRound( Res_Sim_t * p, int nWords ) |
| { |
| Abc_Obj_t * pObj; |
| int i; |
| Abc_InfoFill( (unsigned *)Vec_PtrEntry(p->vPats,0), nWords ); |
| Abc_AigForEachAnd( p->pAig, pObj, i ) |
| Res_SimPerformOne( pObj, p->vPats, nWords ); |
| Abc_NtkForEachPo( p->pAig, pObj, i ) |
| Res_SimTransferOne( pObj, p->vPats, nWords ); |
| } |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [Pads the extra space with duplicated simulation info.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimPadSimInfo( Vec_Ptr_t * vPats, int nPats, int nWords ) |
| { |
| unsigned * pInfo; |
| int i, w, iWords; |
| assert( nPats > 0 && nPats < nWords * 8 * (int) sizeof(unsigned) ); |
| // pad the first word |
| if ( nPats < 8 * sizeof(unsigned) ) |
| { |
| Vec_PtrForEachEntry( unsigned *, vPats, pInfo, i ) |
| if ( pInfo[0] & 1 ) |
| pInfo[0] |= ((~0) << nPats); |
| nPats = 8 * sizeof(unsigned); |
| } |
| // pad the empty words |
| iWords = nPats / (8 * sizeof(unsigned)); |
| Vec_PtrForEachEntry( unsigned *, vPats, pInfo, i ) |
| { |
| for ( w = iWords; w < nWords; w++ ) |
| pInfo[w] = pInfo[0]; |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Duplicates the simulation info to fill the space.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimDeriveInfoReplicate( Res_Sim_t * p ) |
| { |
| unsigned * pInfo, * pInfo2; |
| Abc_Obj_t * pObj; |
| int i, j, w; |
| Abc_NtkForEachPo( p->pAig, pObj, i ) |
| { |
| pInfo = (unsigned *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| pInfo2 = (unsigned *)Vec_PtrEntry( p->vOuts, i ); |
| for ( j = 0; j < p->nPats; j++ ) |
| for ( w = 0; w < p->nWords; w++ ) |
| *pInfo2++ = pInfo[w]; |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Complement the simulation info if necessary.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimDeriveInfoComplement( Res_Sim_t * p ) |
| { |
| unsigned * pInfo, * pInfo2; |
| Abc_Obj_t * pObj; |
| int i, j, w; |
| Abc_NtkForEachPo( p->pAig, pObj, i ) |
| { |
| pInfo = (unsigned *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| pInfo2 = (unsigned *)Vec_PtrEntry( p->vOuts, i ); |
| for ( j = 0; j < p->nPats; j++, pInfo2 += p->nWords ) |
| if ( Abc_InfoHasBit( pInfo, j ) ) |
| for ( w = 0; w < p->nWords; w++ ) |
| pInfo2[w] = ~pInfo2[w]; |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Prints output patterns.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimPrintOutPatterns( Res_Sim_t * p, Abc_Ntk_t * pAig ) |
| { |
| Abc_Obj_t * pObj; |
| unsigned * pInfo2; |
| int i; |
| Abc_NtkForEachPo( pAig, pObj, i ) |
| { |
| pInfo2 = (unsigned *)Vec_PtrEntry( p->vOuts, i ); |
| Extra_PrintBinary( stdout, pInfo2, p->nPatsOut ); |
| printf( "\n" ); |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Prints output patterns.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimPrintNodePatterns( Res_Sim_t * p, Abc_Ntk_t * pAig ) |
| { |
| unsigned * pInfo; |
| pInfo = (unsigned *)Vec_PtrEntry( p->vPats, Abc_NtkPo(p->pAig, 1)->Id ); |
| Extra_PrintBinary( stdout, pInfo, p->nPats ); |
| printf( "\n" ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Counts the number of patters of different type.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimCountResults( Res_Sim_t * p, int * pnDcs, int * pnOnes, int * pnZeros, int fVerbose ) |
| { |
| unsigned char * pInfoCare, * pInfoNode; |
| int i, nTotal = 0; |
| pInfoCare = (unsigned char *)Vec_PtrEntry( p->vPats, Abc_NtkPo(p->pAig, 0)->Id ); |
| pInfoNode = (unsigned char *)Vec_PtrEntry( p->vPats, Abc_NtkPo(p->pAig, 1)->Id ); |
| for ( i = 0; i < p->nBytesIn; i++ ) |
| { |
| if ( !pInfoCare[i] ) |
| (*pnDcs)++; |
| else if ( !pInfoNode[i] ) |
| (*pnZeros)++; |
| else |
| (*pnOnes)++; |
| } |
| nTotal += *pnDcs; |
| nTotal += *pnZeros; |
| nTotal += *pnOnes; |
| if ( fVerbose ) |
| { |
| printf( "Dc = %7.2f %% ", 100.0*(*pnDcs) /nTotal ); |
| printf( "On = %7.2f %% ", 100.0*(*pnOnes) /nTotal ); |
| printf( "Off = %7.2f %% ", 100.0*(*pnZeros)/nTotal ); |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Counts the number of patters of different type.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Res_SimCollectPatterns( Res_Sim_t * p, int fVerbose ) |
| { |
| Abc_Obj_t * pObj; |
| unsigned char * pInfoCare, * pInfoNode, * pInfo; |
| int i, j; |
| pInfoCare = (unsigned char *)Vec_PtrEntry( p->vPats, Abc_NtkPo(p->pAig, 0)->Id ); |
| pInfoNode = (unsigned char *)Vec_PtrEntry( p->vPats, Abc_NtkPo(p->pAig, 1)->Id ); |
| for ( i = 0; i < p->nBytesIn; i++ ) |
| { |
| // skip don't-care patterns |
| if ( !pInfoCare[i] ) |
| continue; |
| // separate offset and onset patterns |
| assert( pInfoNode[i] == 0 || pInfoNode[i] == 0xff ); |
| if ( !pInfoNode[i] ) |
| { |
| if ( p->nPats0 >= p->nPats ) |
| continue; |
| Abc_NtkForEachPi( p->pAig, pObj, j ) |
| { |
| if ( j == p->nTruePis ) |
| break; |
| pInfo = (unsigned char *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| assert( pInfo[i] == 0 || pInfo[i] == 0xff ); |
| if ( pInfo[i] ) |
| Abc_InfoSetBit( (unsigned *)Vec_PtrEntry(p->vPats0, j), p->nPats0 ); |
| } |
| p->nPats0++; |
| } |
| else |
| { |
| if ( p->nPats1 >= p->nPats ) |
| continue; |
| Abc_NtkForEachPi( p->pAig, pObj, j ) |
| { |
| if ( j == p->nTruePis ) |
| break; |
| pInfo = (unsigned char *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| assert( pInfo[i] == 0 || pInfo[i] == 0xff ); |
| if ( pInfo[i] ) |
| Abc_InfoSetBit( (unsigned *)Vec_PtrEntry(p->vPats1, j), p->nPats1 ); |
| } |
| p->nPats1++; |
| } |
| if ( p->nPats0 >= p->nPats && p->nPats1 >= p->nPats ) |
| break; |
| } |
| if ( fVerbose ) |
| { |
| printf( "| " ); |
| printf( "On = %3d ", p->nPats1 ); |
| printf( "Off = %3d ", p->nPats0 ); |
| printf( "\n" ); |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Verifies the last pattern.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Res_SimVerifyValue( Res_Sim_t * p, int fOnSet ) |
| { |
| Abc_Obj_t * pObj; |
| unsigned * pInfo, * pInfo2; |
| int i, value; |
| Abc_NtkForEachPi( p->pAig, pObj, i ) |
| { |
| if ( i == p->nTruePis ) |
| break; |
| if ( fOnSet ) |
| { |
| pInfo2 = (unsigned *)Vec_PtrEntry( p->vPats1, i ); |
| value = Abc_InfoHasBit( pInfo2, p->nPats1 - 1 ); |
| } |
| else |
| { |
| pInfo2 = (unsigned *)Vec_PtrEntry( p->vPats0, i ); |
| value = Abc_InfoHasBit( pInfo2, p->nPats0 - 1 ); |
| } |
| pInfo = (unsigned *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| pInfo[0] = value ? ~0 : 0; |
| } |
| Res_SimPerformRound( p, 1 ); |
| pObj = Abc_NtkPo( p->pAig, 1 ); |
| pInfo = (unsigned *)Vec_PtrEntry( p->vPats, pObj->Id ); |
| assert( pInfo[0] == 0 || pInfo[0] == ~0 ); |
| return pInfo[0] > 0; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Prepares simulation info for candidate filtering.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Res_SimPrepare( Res_Sim_t * p, Abc_Ntk_t * pAig, int nTruePis, int fVerbose ) |
| { |
| int i, nOnes = 0, nZeros = 0, nDcs = 0; |
| if ( fVerbose ) |
| printf( "\n" ); |
| // prepare the manager |
| Res_SimAdjust( p, pAig, nTruePis ); |
| // estimate the number of patterns |
| Res_SimSetRandomBytes( p ); |
| Res_SimPerformRound( p, p->nWordsIn ); |
| Res_SimCountResults( p, &nDcs, &nOnes, &nZeros, fVerbose ); |
| // collect the patterns |
| Res_SimCollectPatterns( p, fVerbose ); |
| // add more patterns using constraint simulation |
| if ( p->nPats0 < 8 ) |
| { |
| if ( !Res_SatSimulate( p, 16, 0 ) ) |
| return p->fConst0 || p->fConst1; |
| // return 0; |
| // printf( "Value0 = %d\n", Res_SimVerifyValue( p, 0 ) ); |
| } |
| if ( p->nPats1 < 8 ) |
| { |
| if ( !Res_SatSimulate( p, 16, 1 ) ) |
| return p->fConst0 || p->fConst1; |
| // return 0; |
| // printf( "Value1 = %d\n", Res_SimVerifyValue( p, 1 ) ); |
| } |
| // generate additional patterns |
| for ( i = 0; i < 2; i++ ) |
| { |
| if ( p->nPats0 > p->nPats*7/8 && p->nPats1 > p->nPats*7/8 ) |
| break; |
| Res_SimSetDerivedBytes( p, i==0 ); |
| Res_SimPerformRound( p, p->nWordsIn ); |
| Res_SimCountResults( p, &nDcs, &nOnes, &nZeros, fVerbose ); |
| Res_SimCollectPatterns( p, fVerbose ); |
| } |
| // create bit-matrix info |
| if ( p->nPats0 < p->nPats ) |
| Res_SimPadSimInfo( p->vPats0, p->nPats0, p->nWords ); |
| if ( p->nPats1 < p->nPats ) |
| Res_SimPadSimInfo( p->vPats1, p->nPats1, p->nWords ); |
| // resimulate 0-patterns |
| Res_SimSetGiven( p, p->vPats0 ); |
| Res_SimPerformRound( p, p->nWords ); |
| //Res_SimPrintNodePatterns( p, pAig ); |
| Res_SimDeriveInfoReplicate( p ); |
| // resimulate 1-patterns |
| Res_SimSetGiven( p, p->vPats1 ); |
| Res_SimPerformRound( p, p->nWords ); |
| //Res_SimPrintNodePatterns( p, pAig ); |
| Res_SimDeriveInfoComplement( p ); |
| // print output patterns |
| // Res_SimPrintOutPatterns( p, pAig ); |
| return 1; |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |