| /**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 | |