summaryrefslogtreecommitdiffstats
path: root/src/misc/util
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2012-11-01 14:23:05 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2012-11-01 14:23:05 -0700
commitd56570f23547fe6d14a6185ebf19e827ec8d8f61 (patch)
tree823548fb9134fdcfd187759565c554e09114d376 /src/misc/util
parentce3f8cb1d11b7b39fa48f809baa1419e9984fe8c (diff)
downloadabc-d56570f23547fe6d14a6185ebf19e827ec8d8f61.tar.gz
abc-d56570f23547fe6d14a6185ebf19e827ec8d8f61.tar.bz2
abc-d56570f23547fe6d14a6185ebf19e827ec8d8f61.zip
Improvements to the truth table computations.
Diffstat (limited to 'src/misc/util')
-rw-r--r--src/misc/util/utilTruth.h531
1 files changed, 69 insertions, 462 deletions
diff --git a/src/misc/util/utilTruth.h b/src/misc/util/utilTruth.h
index 236c0d62..c742aac9 100644
--- a/src/misc/util/utilTruth.h
+++ b/src/misc/util/utilTruth.h
@@ -61,6 +61,14 @@ static word s_CMasks6[5] = {
0x000000000000FFFF
};
+static word s_PMasks[5][3] = {
+ { 0x9999999999999999, 0x2222222222222222, 0x4444444444444444 },
+ { 0xC3C3C3C3C3C3C3C3, 0x0C0C0C0C0C0C0C0C, 0x3030303030303030 },
+ { 0xF00FF00FF00FF00F, 0x00F000F000F000F0, 0x0F000F000F000F00 },
+ { 0xFF0000FFFF0000FF, 0x0000FF000000FF00, 0x00FF000000FF0000 },
+ { 0xFFFF00000000FFFF, 0x00000000FFFF0000, 0x0000FFFF00000000 }
+};
+
////////////////////////////////////////////////////////////////////////
/// MACRO DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
@@ -161,10 +169,9 @@ static inline int Abc_TtIsConst1( word * pIn1, int nWords )
return 1;
}
-
/**Function*************************************************************
- Synopsis [Compares Cof0 and Cof1.]
+ Synopsis []
Description []
@@ -173,217 +180,42 @@ static inline int Abc_TtIsConst1( word * pIn1, int nWords )
SeeAlso []
***********************************************************************/
-static inline int Abc_TtCompare1VarCofs( word * pTruth, int nWords, int iVar )
+static inline void Abc_TtCofactor0( word * pTruth, int nWords, int iVar )
{
if ( nWords == 1 )
+ pTruth[0] = ((pTruth[0] & s_Truths6Neg[iVar]) << (1 << iVar)) | (pTruth[0] & s_Truths6Neg[iVar]);
+ else if ( iVar <= 5 )
{
- word Cof0 = pTruth[0] & s_Truths6Neg[iVar];
- word Cof1 = (pTruth[0] >> (1 << iVar)) & s_Truths6Neg[iVar];
- if ( Cof0 != Cof1 )
- return Cof0 < Cof1 ? -1 : 1;
- return 0;
- }
- if ( iVar <= 5 )
- {
- word Cof0, Cof1;
int w, shift = (1 << iVar);
for ( w = 0; w < nWords; w++ )
- {
- Cof0 = pTruth[w] & s_Truths6Neg[iVar];
- Cof1 = (pTruth[w] >> shift) & s_Truths6Neg[iVar];
- if ( Cof0 != Cof1 )
- return Cof0 < Cof1 ? -1 : 1;
- }
- return 0;
+ pTruth[w] = ((pTruth[w] & s_Truths6Neg[iVar]) << shift) | (pTruth[w] & s_Truths6Neg[iVar]);
}
- // if ( iVar > 5 )
+ else // if ( iVar > 5 )
{
word * pLimit = pTruth + nWords;
int i, iStep = Abc_TtWordNum(iVar);
- assert( nWords >= 2 );
for ( ; pTruth < pLimit; pTruth += 2*iStep )
for ( i = 0; i < iStep; i++ )
- if ( pTruth[i] != pTruth[i + iStep] )
- return pTruth[i] < pTruth[i + iStep] ? -1 : 1;
- return 0;
- }
-}
-static inline int Abc_TtCompare1VarCofsRev( word * pTruth, int nWords, int iVar )
-{
- if ( nWords == 1 )
- {
- word Cof0 = pTruth[0] & s_Truths6Neg[iVar];
- word Cof1 = (pTruth[0] >> (1 << iVar)) & s_Truths6Neg[iVar];
- if ( Cof0 != Cof1 )
- return Cof0 < Cof1 ? -1 : 1;
- return 0;
- }
- if ( iVar <= 5 )
- {
- word Cof0, Cof1;
- int w, shift = (1 << iVar);
- for ( w = nWords - 1; w >= 0; w-- )
- {
- Cof0 = pTruth[w] & s_Truths6Neg[iVar];
- Cof1 = (pTruth[w] >> shift) & s_Truths6Neg[iVar];
- if ( Cof0 != Cof1 )
- return Cof0 < Cof1 ? -1 : 1;
- }
- return 0;
- }
- // if ( iVar > 5 )
- {
- word * pLimit = pTruth + nWords;
- int i, iStep = Abc_TtWordNum(iVar);
- assert( nWords >= 2 );
- for ( pLimit -= 2*iStep; pLimit >= pTruth; pLimit -= 2*iStep )
- for ( i = iStep - 1; i >= 0; i-- )
- if ( pLimit[i] != pLimit[i + iStep] )
- return pLimit[i] < pLimit[i + iStep] ? -1 : 1;
- return 0;
- }
-}
-
-/**Function*************************************************************
-
- Synopsis [Checks pairs of cofactors w.r.t. adjacent variables.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline int Abc_TtCheckEqual2VarCofs( word * pTruth, int nWords, int iVar, int Num1, int Num2 )
-{
- assert( Num1 < Num2 && Num2 < 4 );
- if ( nWords == 1 )
- return ((pTruth[0] >> (Num2 * (1 << iVar))) & s_CMasks6[iVar]) == ((pTruth[0] >> (Num1 * (1 << iVar))) & s_CMasks6[iVar]);
- if ( iVar <= 4 )
- {
- int w, shift = (1 << iVar);
- for ( w = 0; w < nWords; w++ )
- if ( ((pTruth[w] >> Num2 * shift) & s_CMasks6[iVar]) != ((pTruth[w] >> Num1 * shift) & s_CMasks6[iVar]) )
- return 0;
- return 1;
- }
- if ( iVar == 5 )
- {
- unsigned * pTruthU = (unsigned *)pTruth;
- unsigned * pLimitU = (unsigned *)(pTruth + nWords);
- assert( nWords >= 2 );
- for ( ; pTruthU < pLimitU; pTruthU += 4 )
- if ( pTruthU[Num2] != pTruthU[Num1] )
- return 0;
- return 1;
- }
- // if ( iVar > 5 )
- {
- word * pLimit = pTruth + nWords;
- int i, iStep = Abc_TtWordNum(iVar);
- assert( nWords >= 4 );
- for ( ; pTruth < pLimit; pTruth += 4*iStep )
- for ( i = 0; i < iStep; i++ )
- if ( pTruth[i+Num2*iStep] != pTruth[i+Num1*iStep] )
- return 0;
- return 1;
+ pTruth[i + iStep] = pTruth[i];
}
}
-static inline int Abc_TtCompare2VarCofs( word * pTruth, int nWords, int iVar, int Num1, int Num2 )
+static inline void Abc_TtCofactor1( word * pTruth, int nWords, int iVar )
{
- assert( Num1 < Num2 && Num2 < 4 );
if ( nWords == 1 )
+ pTruth[0] = (pTruth[0] & s_Truths6[iVar]) | ((pTruth[0] & s_Truths6[iVar]) >> (1 << iVar));
+ else if ( iVar <= 5 )
{
- word Cof1 = (pTruth[0] >> (Num1 * (1 << iVar))) & s_CMasks6[iVar];
- word Cof2 = (pTruth[0] >> (Num2 * (1 << iVar))) & s_CMasks6[iVar];
- if ( Cof1 != Cof2 )
- return Cof1 < Cof2 ? -1 : 1;
- return 0;
- }
- if ( iVar <= 4 )
- {
- word Cof1, Cof2;
int w, shift = (1 << iVar);
for ( w = 0; w < nWords; w++ )
- {
- Cof1 = (pTruth[w] >> Num1 * shift) & s_CMasks6[iVar];
- Cof2 = (pTruth[w] >> Num2 * shift) & s_CMasks6[iVar];
- if ( Cof1 != Cof2 )
- return Cof1 < Cof2 ? -1 : 1;
- }
- return 0;
- }
- if ( iVar == 5 )
- {
- unsigned * pTruthU = (unsigned *)pTruth;
- unsigned * pLimitU = (unsigned *)(pTruth + nWords);
- assert( nWords >= 2 );
- for ( ; pTruthU < pLimitU; pTruthU += 4 )
- if ( pTruthU[Num1] != pTruthU[Num2] )
- return pTruthU[Num1] < pTruthU[Num2] ? -1 : 1;
- return 0;
+ pTruth[w] = (pTruth[w] & s_Truths6[iVar]) | ((pTruth[w] & s_Truths6[iVar]) >> shift);
}
- // if ( iVar > 5 )
+ else // if ( iVar > 5 )
{
word * pLimit = pTruth + nWords;
int i, iStep = Abc_TtWordNum(iVar);
- int Offset1 = Num1*iStep;
- int Offset2 = Num2*iStep;
- assert( nWords >= 4 );
- for ( ; pTruth < pLimit; pTruth += 4*iStep )
+ for ( ; pTruth < pLimit; pTruth += 2*iStep )
for ( i = 0; i < iStep; i++ )
- if ( pTruth[i + Offset1] != pTruth[i + Offset2] )
- return pTruth[i + Offset1] < pTruth[i + Offset2] ? -1 : 1;
- return 0;
- }
-}
-static inline int Abc_TtCompare2VarCofsRev( word * pTruth, int nWords, int iVar, int Num1, int Num2 )
-{
- assert( Num1 < Num2 && Num2 < 4 );
- if ( nWords == 1 )
- {
- word Cof1 = (pTruth[0] >> (Num1 * (1 << iVar))) & s_CMasks6[iVar];
- word Cof2 = (pTruth[0] >> (Num2 * (1 << iVar))) & s_CMasks6[iVar];
- if ( Cof1 != Cof2 )
- return Cof1 < Cof2 ? -1 : 1;
- return 0;
- }
- if ( iVar <= 4 )
- {
- word Cof1, Cof2;
- int w, shift = (1 << iVar);
- for ( w = nWords - 1; w >= 0; w-- )
- {
- Cof1 = (pTruth[w] >> Num1 * shift) & s_CMasks6[iVar];
- Cof2 = (pTruth[w] >> Num2 * shift) & s_CMasks6[iVar];
- if ( Cof1 != Cof2 )
- return Cof1 < Cof2 ? -1 : 1;
- }
- return 0;
- }
- if ( iVar == 5 )
- {
- unsigned * pTruthU = (unsigned *)pTruth;
- unsigned * pLimitU = (unsigned *)(pTruth + nWords);
- assert( nWords >= 2 );
- for ( pLimitU -= 4; pLimitU >= pTruthU; pLimitU -= 4 )
- if ( pLimitU[Num1] != pLimitU[Num2] )
- return pLimitU[Num1] < pLimitU[Num2] ? -1 : 1;
- return 0;
- }
- // if ( iVar > 5 )
- {
- word * pLimit = pTruth + nWords;
- int i, iStep = Abc_TtWordNum(iVar);
- int Offset1 = Num1*iStep;
- int Offset2 = Num2*iStep;
- assert( nWords >= 4 );
- for ( pLimit -= 4*iStep; pLimit >= pTruth; pLimit -= 4*iStep )
- for ( i = iStep - 1; i >= 0; i-- )
- if ( pLimit[i + Offset1] != pLimit[i + Offset2] )
- return pLimit[i + Offset1] < pLimit[i + Offset2] ? -1 : 1;
- return 0;
+ pTruth[i] = pTruth[i + iStep];
}
}
@@ -449,56 +281,6 @@ static inline int Abc_TtCheckEqualCofs( word * pTruth, int nWords, int iVar, int
}
}
-/**Function*************************************************************
-
- Synopsis []
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline void Abc_TtCofactor0( word * pTruth, int nWords, int iVar )
-{
- if ( nWords == 1 )
- pTruth[0] = ((pTruth[0] & s_Truths6Neg[iVar]) << (1 << iVar)) | (pTruth[0] & s_Truths6Neg[iVar]);
- else if ( iVar <= 5 )
- {
- int w, shift = (1 << iVar);
- for ( w = 0; w < nWords; w++ )
- pTruth[w] = ((pTruth[w] & s_Truths6Neg[iVar]) << shift) | (pTruth[w] & s_Truths6Neg[iVar]);
- }
- else // if ( iVar > 5 )
- {
- word * pLimit = pTruth + nWords;
- int i, iStep = Abc_TtWordNum(iVar);
- for ( ; pTruth < pLimit; pTruth += 2*iStep )
- for ( i = 0; i < iStep; i++ )
- pTruth[i + iStep] = pTruth[i];
- }
-}
-static inline void Abc_TtCofactor1( word * pTruth, int nWords, int iVar )
-{
- if ( nWords == 1 )
- pTruth[0] = (pTruth[0] & s_Truths6[iVar]) | ((pTruth[0] & s_Truths6[iVar]) >> (1 << iVar));
- else if ( iVar <= 5 )
- {
- int w, shift = (1 << iVar);
- for ( w = 0; w < nWords; w++ )
- pTruth[w] = (pTruth[w] & s_Truths6[iVar]) | ((pTruth[w] & s_Truths6[iVar]) >> shift);
- }
- else // if ( iVar > 5 )
- {
- word * pLimit = pTruth + nWords;
- int i, iStep = Abc_TtWordNum(iVar);
- for ( ; pTruth < pLimit; pTruth += 2*iStep )
- for ( i = 0; i < iStep; i++ )
- pTruth[i] = pTruth[i + iStep];
- }
-}
-
/**Function*************************************************************
@@ -826,6 +608,10 @@ static inline int Abc_Tt6SupportAndSize( word t, int nVars, int * pSuppSize )
SeeAlso []
***********************************************************************/
+static inline word Abc_Tt6Flip( word Truth, int iVar )
+{
+ return Truth = ((Truth << (1 << iVar)) & s_Truths6[iVar]) | ((Truth & s_Truths6[iVar]) >> (1 << iVar));
+}
static inline void Abc_TtFlip( word * pTruth, int nWords, int iVar )
{
if ( nWords == 1 )
@@ -857,9 +643,13 @@ static inline void Abc_TtFlip( word * pTruth, int nWords, int iVar )
SeeAlso []
***********************************************************************/
+static inline word Abc_Tt6SwapAdjacent( word Truth, int iVar )
+{
+ return (Truth & s_PMasks[iVar][0]) | ((Truth & s_PMasks[iVar][1]) << (1 << iVar)) | ((Truth & s_PMasks[iVar][2]) >> (1 << iVar));
+}
static inline void Abc_TtSwapAdjacent( word * pTruth, int nWords, int iVar )
{
- static word PMasks[5][3] = {
+ static word s_PMasks[5][3] = {
{ 0x9999999999999999, 0x2222222222222222, 0x4444444444444444 },
{ 0xC3C3C3C3C3C3C3C3, 0x0C0C0C0C0C0C0C0C, 0x3030303030303030 },
{ 0xF00FF00FF00FF00F, 0x00F000F000F000F0, 0x0F000F000F000F00 },
@@ -870,7 +660,7 @@ static inline void Abc_TtSwapAdjacent( word * pTruth, int nWords, int iVar )
{
int i, Shift = (1 << iVar);
for ( i = 0; i < nWords; i++ )
- pTruth[i] = (pTruth[i] & PMasks[iVar][0]) | ((pTruth[i] & PMasks[iVar][1]) << Shift) | ((pTruth[i] & PMasks[iVar][2]) >> Shift);
+ pTruth[i] = (pTruth[i] & s_PMasks[iVar][0]) | ((pTruth[i] & s_PMasks[iVar][1]) << Shift) | ((pTruth[i] & s_PMasks[iVar][2]) >> Shift);
}
else if ( iVar == 5 )
{
@@ -888,10 +678,9 @@ static inline void Abc_TtSwapAdjacent( word * pTruth, int nWords, int iVar )
ABC_SWAP( word, pTruth[i + iStep], pTruth[i + 2*iStep] );
}
}
-
static inline void Abc_TtSwapVars( word * pTruth, int nVars, int iVar, int jVar )
{
- static word PPMasks[5][6][3] = {
+ static word Ps_PMasks[5][6][3] = {
{
{ 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }, // 0 0
{ 0x9999999999999999, 0x2222222222222222, 0x4444444444444444 }, // 0 1
@@ -940,18 +729,18 @@ static inline void Abc_TtSwapVars( word * pTruth, int nVars, int iVar, int jVar
assert( iVar < jVar && jVar < nVars );
if ( nVars <= 6 )
{
- word * pMasks = PPMasks[iVar][jVar];
+ word * s_PMasks = Ps_PMasks[iVar][jVar];
int shift = (1 << jVar) - (1 << iVar);
- pTruth[0] = (pTruth[0] & pMasks[0]) | ((pTruth[0] & pMasks[1]) << shift) | ((pTruth[0] & pMasks[2]) >> shift);
+ pTruth[0] = (pTruth[0] & s_PMasks[0]) | ((pTruth[0] & s_PMasks[1]) << shift) | ((pTruth[0] & s_PMasks[2]) >> shift);
return;
}
if ( jVar <= 5 )
{
- word * pMasks = PPMasks[iVar][jVar];
+ word * s_PMasks = Ps_PMasks[iVar][jVar];
int nWords = Abc_TtWordNum(nVars);
int w, shift = (1 << jVar) - (1 << iVar);
for ( w = 0; w < nWords; w++ )
- pTruth[w] = (pTruth[w] & pMasks[0]) | ((pTruth[w] & pMasks[1]) << shift) | ((pTruth[w] & pMasks[2]) >> shift);
+ pTruth[w] = (pTruth[w] & s_PMasks[0]) | ((pTruth[w] & s_PMasks[1]) << shift) | ((pTruth[w] & s_PMasks[2]) >> shift);
return;
}
if ( iVar <= 5 && jVar > 5 )
@@ -984,6 +773,38 @@ static inline void Abc_TtSwapVars( word * pTruth, int nVars, int iVar, int jVar
/**Function*************************************************************
+ Synopsis [Implemeting given NPN config.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+static inline void Abc_TtImplementNpnConfig( word * pTruth, int nVars, char * pCanonPerm, unsigned uCanonPhase )
+{
+ int i, k, nWords = Abc_TtWordNum( nVars );
+ if ( (uCanonPhase >> nVars) & 1 )
+ Abc_TtNot( pTruth, nWords );
+ for ( i = 0; i < nVars; i++ )
+ if ( (uCanonPhase >> i) & 1 )
+ Abc_TtFlip( pTruth, nWords, i );
+ for ( i = 0; i < nVars; i++ )
+ {
+ for ( k = i; k < nVars; k++ )
+ if ( pCanonPerm[k] == i )
+ break;
+ assert( k < nVars );
+ if ( i == k )
+ continue;
+ Abc_TtSwapVars( pTruth, nVars, i, k );
+ ABC_SWAP( int, pCanonPerm[i], pCanonPerm[k] );
+ }
+}
+
+/**Function*************************************************************
+
Synopsis []
Description []
@@ -1024,220 +845,6 @@ static inline int Abc_TtCountOnes( word x )
SeeAlso []
***********************************************************************/
-static inline int Abc_TtCountOnesInTruth( word * pTruth, int nVars )
-{
- int nWords = Abc_TtWordNum( nVars );
- int k, Counter = 0;
- for ( k = 0; k < nWords; k++ )
- if ( pTruth[k] )
- Counter += Abc_TtCountOnes( pTruth[k] );
- return Counter;
-}
-static inline void Abc_TtCountOnesInCofs( word * pTruth, int nVars, int * pStore )
-{
- word Temp;
- int i, k, Counter, nWords;
- if ( nVars <= 6 )
- {
- for ( i = 0; i < nVars; i++ )
- if ( pTruth[0] & s_Truths6Neg[i] )
- pStore[i] = Abc_TtCountOnes( pTruth[0] & s_Truths6Neg[i] );
- else
- pStore[i] = 0;
- return;
- }
- assert( nVars > 6 );
- nWords = Abc_TtWordNum( nVars );
- memset( pStore, 0, sizeof(int) * nVars );
- for ( k = 0; k < nWords; k++ )
- {
- // count 1's for the first six variables
- for ( i = 0; i < 6; i++ )
- if ( (Temp = (pTruth[k] & s_Truths6Neg[i]) | ((pTruth[k+1] & s_Truths6Neg[i]) << (1 << i))) )
- pStore[i] += Abc_TtCountOnes( Temp );
- // count 1's for all other variables
- if ( pTruth[k] )
- {
- Counter = Abc_TtCountOnes( pTruth[k] );
- for ( i = 6; i < nVars; i++ )
- if ( (k & (1 << (i-6))) == 0 )
- pStore[i] += Counter;
- }
- k++;
- // count 1's for all other variables
- if ( pTruth[k] )
- {
- Counter = Abc_TtCountOnes( pTruth[k] );
- for ( i = 6; i < nVars; i++ )
- if ( (k & (1 << (i-6))) == 0 )
- pStore[i] += Counter;
- }
- }
-}
-static inline void Abc_TtCountOnesInCofsSlow( word * pTruth, int nVars, int * pStore )
-{
- static int bit_count[256] = {
- 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
- 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
- 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
- 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
- 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
- 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
- 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
- 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8
- };
- int i, k, nBytes;
- unsigned char * pTruthC = (unsigned char *)pTruth;
- nBytes = 8 * Abc_TtWordNum( nVars );
- memset( pStore, 0, sizeof(int) * nVars );
- for ( k = 0; k < nBytes; k++ )
- {
- pStore[0] += bit_count[ pTruthC[k] & 0x55 ];
- pStore[1] += bit_count[ pTruthC[k] & 0x33 ];
- pStore[2] += bit_count[ pTruthC[k] & 0x0F ];
- for ( i = 3; i < nVars; i++ )
- if ( (k & (1 << (i-3))) == 0 )
- pStore[i] += bit_count[pTruthC[k]];
- }
-}
-
-/**Function*************************************************************
-
- Synopsis []
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline unsigned Abc_TtSemiCanonicize( word * pTruth, int nVars, char * pCanonPerm, int * pStoreOut )
-{
- extern int Abc_TtCountOnesInCofsFast( word * pTruth, int nVars, int * pStore );
-
- int fOldSwap = 0;
- int pStoreIn[17];
- int * pStore = pStoreOut ? pStoreOut : pStoreIn;
-// int pStore2[17];
- int nWords = Abc_TtWordNum( nVars );
- int i, Temp, nOnes;//, fChange;//, nSwaps = 0;//;
- int k, BestK;
- unsigned uCanonPhase = 0;
- assert( nVars <= 16 );
- for ( i = 0; i < nVars; i++ )
- pCanonPerm[i] = i;
- // normalize polarity
- nOnes = Abc_TtCountOnesInTruth( pTruth, nVars );
- if ( nOnes > nWords * 32 )
- {
- Abc_TtNot( pTruth, nWords );
- nOnes = nWords*64 - nOnes;
- uCanonPhase |= (1 << nVars);
- }
- // normalize phase
- Abc_TtCountOnesInCofs( pTruth, nVars, pStore );
- pStore[nVars] = nOnes;
-// Abc_TtCountOnesInCofsFast( pTruth, nVars, pStore );
-
-// Abc_TtCountOnesInCofsFast( pTruth, nVars, pStore2 );
-// for ( i = 0; i < nVars; i++ )
-// assert( pStore[i] == pStore2[i] );
-
- for ( i = 0; i < nVars; i++ )
- {
- if ( pStore[i] >= nOnes - pStore[i] )
- continue;
- Abc_TtFlip( pTruth, nWords, i );
- uCanonPhase |= (1 << i);
- pStore[i] = nOnes - pStore[i];
- }
-
- if ( fOldSwap )
- {
- int fChange;
- do {
- fChange = 0;
- for ( i = 0; i < nVars-1; i++ )
- {
- // if ( pStore[i] <= pStore[i+1] )
- if ( pStore[i] >= pStore[i+1] )
- continue;
-
- Temp = pCanonPerm[i];
- pCanonPerm[i] = pCanonPerm[i+1];
- pCanonPerm[i+1] = Temp;
-
- Temp = pStore[i];
- pStore[i] = pStore[i+1];
- pStore[i+1] = Temp;
-
- if ( ((uCanonPhase >> i) & 1) != ((uCanonPhase >> (i+1)) & 1) )
- {
- uCanonPhase ^= (1 << i);
- uCanonPhase ^= (1 << (i+1));
- }
- Abc_TtSwapAdjacent( pTruth, nWords, i );
- fChange = 1;
- // nSwaps++;
- }
- } while ( fChange );
- }
- else
- {
- for ( i = 0; i < nVars - 1; i++ )
- {
- BestK = i + 1;
- for ( k = i + 2; k < nVars; k++ )
- // if ( pStore[BestK] > pStore[k] )
- if ( pStore[BestK] < pStore[k] )
- BestK = k;
- // if ( pStore[i] <= pStore[BestK] )
- if ( pStore[i] >= pStore[BestK] )
- continue;
-
- Temp = pCanonPerm[i];
- pCanonPerm[i] = pCanonPerm[BestK];
- pCanonPerm[BestK] = Temp;
-
- Temp = pStore[i];
- pStore[i] = pStore[BestK];
- pStore[BestK] = Temp;
-
- if ( ((uCanonPhase >> i) & 1) != ((uCanonPhase >> BestK) & 1) )
- {
- uCanonPhase ^= (1 << i);
- uCanonPhase ^= (1 << BestK);
- }
- Abc_TtSwapVars( pTruth, nVars, i, BestK );
- // nSwaps++;
- }
- }
-
-
-// printf( "%d ", nSwaps );
-/*
- printf( "Minterms: " );
- for ( i = 0; i < nVars; i++ )
- printf( "%d ", pStore[i] );
- printf( "\n" );
-*/
- return uCanonPhase;
-}
-
-
-
-/**Function*************************************************************
-
- Synopsis []
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
static inline void Abc_TtReverseVars( word * pTruth, int nVars )
{
int k;