summaryrefslogtreecommitdiffstats
path: root/src/misc
diff options
context:
space:
mode:
Diffstat (limited to 'src/misc')
-rw-r--r--src/misc/extra/extraUtilFile.c31
-rw-r--r--src/misc/extra/extraUtilMisc.c95
-rw-r--r--src/misc/util/abc_global.h32
-rw-r--r--src/misc/util/utilSort.c35
-rw-r--r--src/misc/util/utilTruth.h146
-rw-r--r--src/misc/vec/vecPtr.h8
-rw-r--r--src/misc/vec/vecWec.h5
-rw-r--r--src/misc/vec/vecWrd.h7
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*************************************************************