diff options
Diffstat (limited to 'src/misc')
-rw-r--r-- | src/misc/extra/extraUtilFile.c | 31 | ||||
-rw-r--r-- | src/misc/extra/extraUtilMisc.c | 95 | ||||
-rw-r--r-- | src/misc/util/abc_global.h | 32 | ||||
-rw-r--r-- | src/misc/util/utilSort.c | 35 | ||||
-rw-r--r-- | src/misc/util/utilTruth.h | 146 | ||||
-rw-r--r-- | src/misc/vec/vecPtr.h | 8 | ||||
-rw-r--r-- | src/misc/vec/vecWec.h | 5 | ||||
-rw-r--r-- | src/misc/vec/vecWrd.h | 7 |
8 files changed, 270 insertions, 89 deletions
diff --git a/src/misc/extra/extraUtilFile.c b/src/misc/extra/extraUtilFile.c index eb1b7dce..38192c71 100644 --- a/src/misc/extra/extraUtilFile.c +++ b/src/misc/extra/extraUtilFile.c @@ -496,33 +496,16 @@ unsigned Extra_ReadBinary( char * Buffer ) ***********************************************************************/ void Extra_PrintBinary( FILE * pFile, unsigned Sign[], int nBits ) { - int Remainder, nWords; - int w, i; - - Remainder = (nBits%(sizeof(unsigned)*8)); - nWords = (nBits/(sizeof(unsigned)*8)) + (Remainder>0); - - for ( w = nWords-1; w >= 0; w-- ) - for ( i = ((w == nWords-1 && Remainder)? Remainder-1: 31); i >= 0; i-- ) - fprintf( pFile, "%c", '0' + (int)((Sign[w] & (1<<i)) > 0) ); - -// fprintf( pFile, "\n" ); + int i; + for ( i = nBits-1; i >= 0; i-- ) + fprintf( pFile, "%c", '0' + Abc_InfoHasBit(Sign, i) ); +// fprintf( pFile, "\n" ); } void Extra_PrintBinary2( FILE * pFile, unsigned Sign[], int nBits ) { - int Remainder, nWords; - int w, i; - - Remainder = (nBits%(sizeof(unsigned)*8)); - nWords = (nBits/(sizeof(unsigned)*8)) + (Remainder>0); - - for ( w = 0; w < nWords; w++ ) - { - int Limit = w == nWords-1 ? Remainder : 32; - for ( i = 0; i < Limit; i++ ) - fprintf( pFile, "%c", '0' + (int)((Sign[w] & (1<<i)) > 0) ); - } - + int i; + for ( i = 0; i < nBits; i++ ) + fprintf( pFile, "%c", '0' + Abc_InfoHasBit(Sign, i) ); // fprintf( pFile, "\n" ); } diff --git a/src/misc/extra/extraUtilMisc.c b/src/misc/extra/extraUtilMisc.c index 1df6c5a3..c38369cd 100644 --- a/src/misc/extra/extraUtilMisc.c +++ b/src/misc/extra/extraUtilMisc.c @@ -2594,6 +2594,19 @@ static inline void Extra_Transpose64Simple( word A[64], word B[64] ) if ( (A[i] >> k) & 1 ) B[k] |= ((word)1 << (63-i)); } +static inline void Extra_BitMatrixTransposeSimple( Vec_Wrd_t * vSimsIn, int nWordsIn, Vec_Wrd_t * vSimsOut, int nWordsOut ) +{ + int i, k; + assert( Vec_WrdSize(vSimsIn) == nWordsIn * nWordsOut * 64 ); + assert( Vec_WrdSize(vSimsIn) == Vec_WrdSize(vSimsOut) ); + assert( Vec_WrdSize(vSimsIn) % nWordsIn == 0 ); + assert( Vec_WrdSize(vSimsOut) % nWordsOut == 0 ); + Vec_WrdFill( vSimsOut, Vec_WrdSize(vSimsOut), 0 ); + for ( i = 0; i < 64*nWordsOut; i++ ) + for ( k = 0; k < 64*nWordsIn; k++ ) + if ( Abc_InfoHasBit( (unsigned *)Vec_WrdEntryP(vSimsIn, i*nWordsIn), k ) ) + Abc_InfoSetBit( (unsigned *)Vec_WrdEntryP(vSimsOut, k*nWordsOut), i ); +} void Extra_Transpose32( unsigned a[32] ) { int j, k; @@ -2640,15 +2653,14 @@ void Extra_BitMatrixTransposeP( Vec_Wrd_t * vSimsIn, int nWordsIn, Vec_Wrd_t * v { word * pM[64]; int i, y, x; assert( Vec_WrdSize(vSimsIn) == Vec_WrdSize(vSimsOut) ); - assert( Vec_WrdSize(vSimsIn) / nWordsIn == 64 * nWordsOut ); - assert( Vec_WrdSize(vSimsOut) / nWordsOut == 64 * nWordsIn ); - for ( y = 0; y < nWordsIn; y++ ) + assert( Vec_WrdSize(vSimsIn) == 64 * nWordsIn * nWordsOut ); for ( x = 0; x < nWordsOut; x++ ) + for ( y = 0; y < nWordsIn; y++ ) { for ( i = 0; i < 64; i++ ) { - pM[i] = Vec_WrdEntryP( vSimsOut, (64*y+i)*nWordsOut + x ); - pM[i][0] = Vec_WrdEntry ( vSimsIn, (64*x+i)*nWordsIn + y ); + pM[i] = Vec_WrdEntryP( vSimsOut, (64*y+63-i)*nWordsOut + x ); + pM[i][0] = Vec_WrdEntry ( vSimsIn, (64*x+63-i)*nWordsIn + y ); } Extra_Transpose64p( pM ); } @@ -2656,63 +2668,64 @@ void Extra_BitMatrixTransposeP( Vec_Wrd_t * vSimsIn, int nWordsIn, Vec_Wrd_t * v void Extra_BitMatrixTransposePP( Vec_Ptr_t * vSimsIn, int nWordsIn, Vec_Wrd_t * vSimsOut, int nWordsOut ) { word * pM[64]; int i, y, x; - assert( Vec_WrdSize(vSimsOut) / nWordsOut == 64 * nWordsIn ); - for ( y = 0; y < nWordsIn; y++ ) + assert( Vec_PtrSize(vSimsIn) == 64 * nWordsOut ); + assert( Vec_WrdSize(vSimsOut) == 64 * nWordsOut * nWordsIn ); for ( x = 0; x < nWordsOut; x++ ) + for ( y = 0; y < nWordsIn; y++ ) { for ( i = 0; i < 64; i++ ) { - pM[i] = Vec_WrdEntryP( vSimsOut, (64*y+i)*nWordsOut + x ); - pM[i][0] = ((word *)Vec_PtrEntry( vSimsIn, 64*x+i ))[y]; + pM[i] = Vec_WrdEntryP( vSimsOut, (64*y+63-i)*nWordsOut + x ); + pM[i][0] = ((word *)Vec_PtrEntry( vSimsIn, 64*x+63-i ))[y]; } Extra_Transpose64p( pM ); } } -void Extra_BitMatrixTransposeTest() -{ - int nWordsIn = 1; - int nWordsOut = 2; - int i, k, nItems = 64 * nWordsIn * nWordsOut; - - Vec_Wrd_t * vSimsIn = Vec_WrdStart( nItems ); - Vec_Wrd_t * vSimsOut = Vec_WrdStart( nItems ); - - Abc_RandomW(1); - for ( i = 0; i < nItems; i++ ) - Vec_WrdWriteEntry( vSimsIn, i, Abc_RandomW(0) ); - - Extra_BitMatrixTransposeP( vSimsIn, nWordsIn, vSimsOut, nWordsOut ); - - nItems = Vec_WrdSize(vSimsIn) / nWordsIn; - for ( i = 0; i < nItems; i++ ) +void Extra_BitMatrixShow( Vec_Wrd_t * vSims, int nWords ) +{ + int i, k, nBits = Vec_WrdSize(vSims) / nWords; + for ( i = 0; i < nBits; i++ ) { if ( i%64 == 0 ) Abc_Print( 1, "\n" ); - for ( k = 0; k < nWordsIn; k++ ) + for ( k = 0; k < nWords; k++ ) { - Extra_PrintBinary( stdout, (unsigned *)Vec_WrdEntryP(vSimsIn, i*nWordsIn+k), 64 ); + Extra_PrintBinary2( stdout, (unsigned *)Vec_WrdEntryP(vSims, i*nWords+k), 64 ); Abc_Print( 1, " " ); } Abc_Print( 1, "\n" ); } Abc_Print( 1, "\n" ); +} +void Extra_BitMatrixTransposeTest() +{ + abctime clk = Abc_Clock(); - nItems = Vec_WrdSize(vSimsOut) / nWordsOut; - for ( i = 0; i < nItems; i++ ) - { - if ( i%64 == 0 ) - Abc_Print( 1, "\n" ); - for ( k = 0; k < nWordsOut; k++ ) - { - Extra_PrintBinary( stdout, (unsigned *)Vec_WrdEntryP(vSimsOut, i*nWordsOut+k), 64 ); - Abc_Print( 1, " " ); - } - Abc_Print( 1, "\n" ); - } - Abc_Print( 1, "\n" ); + int nWordsIn = 100; + int nWordsOut = 200; + int nItems = 64 * nWordsIn * nWordsOut; + + Vec_Wrd_t * vSimsIn = Vec_WrdStartRandom( nItems ); + Vec_Wrd_t * vSimsOut = Vec_WrdStart( nItems ); + Vec_Wrd_t * vSimsOut2 = Vec_WrdStart( nItems ); + + Extra_BitMatrixTransposeP ( vSimsIn, nWordsIn, vSimsOut, nWordsOut ); + Extra_BitMatrixTransposeSimple( vSimsIn, nWordsIn, vSimsOut2, nWordsOut ); + + if ( memcmp( Vec_WrdArray(vSimsOut), Vec_WrdArray(vSimsOut2), sizeof(word)*Vec_WrdSize(vSimsOut) ) ) + printf( "Verification failed.\n" ); + else + printf( "Verification succeeded.\n" ); + + //Extra_BitMatrixShow( vSimsIn, nWordsIn ); + //Extra_BitMatrixShow( vSimsOut, nWordsOut ); + //Extra_BitMatrixShow( vSimsOut2, nWordsOut ); Vec_WrdFree( vSimsIn ); Vec_WrdFree( vSimsOut ); + Vec_WrdFree( vSimsOut2 ); + + Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); } //////////////////////////////////////////////////////////////////////// diff --git a/src/misc/util/abc_global.h b/src/misc/util/abc_global.h index aac1515b..d7c5bea7 100644 --- a/src/misc/util/abc_global.h +++ b/src/misc/util/abc_global.h @@ -480,30 +480,6 @@ static inline int Abc_PrimeCudd( unsigned int p ) } // end of Cudd_Prime -// Creates a sequence of random numbers. -// http://www.codeproject.com/KB/recipes/SimpleRNG.aspx - -#define NUMBER1 3716960521u -#define NUMBER2 2174103536u - -static inline unsigned Abc_Random( int fReset ) -{ - static unsigned int m_z = NUMBER1; - static unsigned int m_w = NUMBER2; - if ( fReset ) - { - m_z = NUMBER1; - m_w = NUMBER2; - } - m_z = 36969 * (m_z & 65535) + (m_z >> 16); - m_w = 18000 * (m_w & 65535) + (m_w >> 16); - return (m_z << 16) + m_w; -} -static inline word Abc_RandomW( int fReset ) -{ - return ((word)Abc_Random(fReset) << 32) | ((word)Abc_Random(fReset) << 0); -} - // the returned buffer has 32 unused bytes at the end, filled with zeros static inline void * Abc_FileReadContents( char * pFileName, int * pnFileSize ) { @@ -526,6 +502,12 @@ static inline void * Abc_FileReadContents( char * pFileName, int * pnFileSize ) fclose( pFile ); return (void *)pBuffer; } +static inline void Abc_ReverseOrder( int * pA, int nA ) +{ + int i; + for ( i = 0; i < nA/2; i++ ) + ABC_SWAP( int, pA[i], pA[nA-1-i] ); +} // sorting @@ -537,6 +519,8 @@ extern void Abc_QuickSort3( word * pData, int nSize, int fDecrease ); extern void Abc_QuickSortCostData( int * pCosts, int nSize, int fDecrease, word * pData, int * pResult ); extern int * Abc_QuickSortCost( int * pCosts, int nSize, int fDecrease ); +extern unsigned Abc_Random( int fReset ); +extern word Abc_RandomW( int fReset ); ABC_NAMESPACE_HEADER_END diff --git a/src/misc/util/utilSort.c b/src/misc/util/utilSort.c index 32154a7d..31890503 100644 --- a/src/misc/util/utilSort.c +++ b/src/misc/util/utilSort.c @@ -779,6 +779,41 @@ void Abc_QuickSortTest() ABC_FREE( pData2 ); } +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ + +// Creates a sequence of random numbers. +// http://www.codeproject.com/KB/recipes/SimpleRNG.aspx + +#define NUMBER1 3716960521u +#define NUMBER2 2174103536u + +unsigned Abc_Random( int fReset ) +{ + static unsigned int m_z = NUMBER1; + static unsigned int m_w = NUMBER2; + if ( fReset ) + { + m_z = NUMBER1; + m_w = NUMBER2; + } + m_z = 36969 * (m_z & 65535) + (m_z >> 16); + m_w = 18000 * (m_w & 65535) + (m_w >> 16); + return (m_z << 16) + m_w; +} +word Abc_RandomW( int fReset ) +{ + return ((word)Abc_Random(fReset) << 32) | ((word)Abc_Random(fReset) << 0); +} //////////////////////////////////////////////////////////////////////// /// END OF FILE /// diff --git a/src/misc/util/utilTruth.h b/src/misc/util/utilTruth.h index 6fa5e0a3..e0ee1720 100644 --- a/src/misc/util/utilTruth.h +++ b/src/misc/util/utilTruth.h @@ -326,6 +326,16 @@ static inline void Abc_TtXor( word * pOut, word * pIn1, word * pIn2, int nWords, for ( w = 0; w < nWords; w++ ) pOut[w] = pIn1[w] ^ pIn2[w]; } +static inline void Abc_TtXorMask( word * pOut, word * pIn1, word * pIn2, word * pMask, int nWords, int fCompl ) +{ + int w; + if ( fCompl ) + for ( w = 0; w < nWords; w++ ) + pOut[w] = (pIn1[w] ^ pIn2[w]) & ~pMask[w]; + else + for ( w = 0; w < nWords; w++ ) + pOut[w] = (pIn1[w] ^ pIn2[w]) & pMask[w]; +} static inline void Abc_TtMux( word * pOut, word * pCtrl, word * pIn1, word * pIn0, int nWords ) { int w; @@ -443,6 +453,108 @@ static inline void Abc_TtIthVar( word * pOut, int iVar, int nVars ) /**Function************************************************************* + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline int Abc_TtIsAndCompl( word * pOut, int fCompl, word * pIn1, int fCompl1, word * pIn2, int fCompl2, word * pCare, int nWords ) +{ + int w; + if ( fCompl ) + { + if ( fCompl1 ) + { + if ( fCompl2 ) + { + for ( w = 0; w < nWords; w++ ) + if ( (~pOut[w] & pCare[w]) != (~pIn1[w] & ~pIn2[w] & pCare[w]) ) + return 0; + } + else + { + for ( w = 0; w < nWords; w++ ) + if ( (~pOut[w] & pCare[w]) != (~pIn1[w] & pIn2[w] & pCare[w]) ) + return 0; + } + } + else + { + if ( fCompl2 ) + { + for ( w = 0; w < nWords; w++ ) + if ( (~pOut[w] & pCare[w]) != (pIn1[w] & ~pIn2[w] & pCare[w]) ) + return 0; + } + else + { + for ( w = 0; w < nWords; w++ ) + if ( (~pOut[w] & pCare[w]) != (pIn1[w] & pIn2[w] & pCare[w]) ) + return 0; + } + } + } + else + { + if ( fCompl1 ) + { + if ( fCompl2 ) + { + for ( w = 0; w < nWords; w++ ) + if ( (pOut[w] & pCare[w]) != (~pIn1[w] & ~pIn2[w] & pCare[w]) ) + return 0; + } + else + { + for ( w = 0; w < nWords; w++ ) + if ( (pOut[w] & pCare[w]) != (~pIn1[w] & pIn2[w] & pCare[w]) ) + return 0; + } + } + else + { + if ( fCompl2 ) + { + for ( w = 0; w < nWords; w++ ) + if ( (pOut[w] & pCare[w]) != (pIn1[w] & ~pIn2[w] & pCare[w]) ) + return 0; + } + else + { + for ( w = 0; w < nWords; w++ ) + if ( (pOut[w] & pCare[w]) != (pIn1[w] & pIn2[w] & pCare[w]) ) + return 0; + } + } + } + return 1; +} + +static inline int Abc_TtIsXorCompl( word * pOut, int fCompl, word * pIn1, word * pIn2, word * pCare, int nWords ) +{ + int w; + if ( fCompl ) + { + for ( w = 0; w < nWords; w++ ) + if ( (~pOut[w] & pCare[w]) != ((pIn1[w] ^ pIn2[w]) & pCare[w]) ) + return 0; + } + else + { + for ( w = 0; w < nWords; w++ ) + if ( ( pOut[w] & pCare[w]) != ((pIn1[w] ^ pIn2[w]) & pCare[w]) ) + return 0; + } + return 1; +} + + +/**Function************************************************************* + Synopsis [Compares Cof0 and Cof1.] Description [] @@ -1733,6 +1845,40 @@ static inline int Abc_TtCountOnesVecMask( word * x, word * pMask, int nWords, in Count += Abc_TtCountOnes( pMask[w] & x[w] ); return Count; } +static inline int Abc_TtCountOnesVecMask2( word * x0, word * x1, int fComp0, int fComp1, word * pMask, int nWords ) +{ + int w, Count = 0; + if ( !fComp0 && !fComp1 ) + for ( w = 0; w < nWords; w++ ) + Count += Abc_TtCountOnes( pMask[w] & x0[w] & x1[w] ); + else if ( fComp0 && !fComp1 ) + for ( w = 0; w < nWords; w++ ) + Count += Abc_TtCountOnes( pMask[w] & ~x0[w] & x1[w] ); + else if ( !fComp0 && fComp1 ) + for ( w = 0; w < nWords; w++ ) + Count += Abc_TtCountOnes( pMask[w] & x0[w] & ~x1[w] ); + else + for ( w = 0; w < nWords; w++ ) + Count += Abc_TtCountOnes( pMask[w] & ~x0[w] & ~x1[w] ); + return Count; +} +static inline int Abc_TtCountOnesVecXor( word * x, word * y, int nWords ) +{ + int w, Count = 0; + for ( w = 0; w < nWords; w++ ) + Count += Abc_TtCountOnes( x[w] ^ y[w] ); + return Count; +} +static inline int Abc_TtAndXorSum( word * pOut, word * pIn1, word * pIn2, int nWords ) +{ + int w, Count = 0; + for ( w = 0; w < nWords; w++ ) + { + pOut[w] &= pIn1[w] ^ pIn2[w]; + Count += Abc_TtCountOnes( pOut[w] ); + } + return Count; +} /**Function************************************************************* diff --git a/src/misc/vec/vecPtr.h b/src/misc/vec/vecPtr.h index 4b76b69f..ed2a481e 100644 --- a/src/misc/vec/vecPtr.h +++ b/src/misc/vec/vecPtr.h @@ -736,6 +736,14 @@ static inline int Vec_PtrFind( Vec_Ptr_t * p, void * Entry ) return i; return -1; } +static inline int Vec_PtrFindStr( Vec_Ptr_t * p, char * Entry ) +{ + int i; + for ( i = 0; i < p->nSize; i++ ) + if ( p->pArray[i] && !strcmp((char *)p->pArray[i], Entry) ) + return i; + return -1; +} /**Function************************************************************* diff --git a/src/misc/vec/vecWec.h b/src/misc/vec/vecWec.h index 88ee3dd7..fdbded9c 100644 --- a/src/misc/vec/vecWec.h +++ b/src/misc/vec/vecWec.h @@ -68,6 +68,8 @@ struct Vec_Wec_t_ for ( i = LevelStart-1; (i >= LevelStop) && (((vVec) = Vec_WecEntry(vGlob, i)), 1); i-- ) #define Vec_WecForEachLevelTwo( vGlob1, vGlob2, vVec1, vVec2, i ) \ for ( i = 0; (i < Vec_WecSize(vGlob1)) && (((vVec1) = Vec_WecEntry(vGlob1, i)), 1) && (((vVec2) = Vec_WecEntry(vGlob2, i)), 1); i++ ) +#define Vec_WecForEachLevelDouble( vGlob, vVec1, vVec2, i ) \ + for ( i = 0; (i < Vec_WecSize(vGlob)) && (((vVec1) = Vec_WecEntry(vGlob, i)), 1) && (((vVec2) = Vec_WecEntry(vGlob, i+1)), 1); i += 2 ) //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// @@ -247,6 +249,9 @@ static inline int Vec_WecSizeUsedLimits( Vec_Wec_t * p, int iStart, int iStop ) ***********************************************************************/ static inline void Vec_WecShrink( Vec_Wec_t * p, int nSizeNew ) { + Vec_Int_t * vVec; int i; + Vec_WecForEachLevelStart( p, vVec, i, nSizeNew ) + Vec_IntShrink( vVec, 0 ); assert( p->nSize >= nSizeNew ); p->nSize = nSizeNew; } diff --git a/src/misc/vec/vecWrd.h b/src/misc/vec/vecWrd.h index 45df1c97..e123c054 100644 --- a/src/misc/vec/vecWrd.h +++ b/src/misc/vec/vecWrd.h @@ -160,6 +160,13 @@ static inline Vec_Wrd_t * Vec_WrdStartNatural( int nSize ) p->pArray[i] = i; return p; } +static inline Vec_Wrd_t * Vec_WrdStartRandom( int nSize ) +{ + Vec_Wrd_t * vSims = Vec_WrdStart( nSize ); int i; + for ( i = 0; i < nSize; i++ ) + vSims->pArray[i] = Abc_RandomW(0); + return vSims; +} /**Function************************************************************* |