summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/base/abci/abcRec3.c43
-rw-r--r--src/map/if/if.h2
-rw-r--r--src/map/if/ifTruth.c266
-rw-r--r--src/misc/util/utilTruth.h323
4 files changed, 331 insertions, 303 deletions
diff --git a/src/base/abci/abcRec3.c b/src/base/abci/abcRec3.c
index 5f9b6b4f..ed6148ab 100644
--- a/src/base/abci/abcRec3.c
+++ b/src/base/abci/abcRec3.c
@@ -24,6 +24,7 @@
#include "aig/gia/giaAig.h"
#include "misc/vec/vecMem.h"
#include "bool/lucky/lucky.h"
+#include "misc/util/utilTruth.h"
ABC_NAMESPACE_IMPL_START
@@ -407,48 +408,6 @@ void Lms_GiaProfilesPrint( Gia_Man_t * p )
/**Function*************************************************************
- Synopsis [Stretch truthtable to have more input variables.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static void Abc_TtStretch5( unsigned * pInOut, int nVarS, int nVarB )
-{
- int w, i, step, nWords;
- if ( nVarS == nVarB )
- return;
- assert( nVarS < nVarB );
- step = Abc_TruthWordNum(nVarS);
- nWords = Abc_TruthWordNum(nVarB);
- if ( step == nWords )
- return;
- assert( step < nWords );
- for ( w = 0; w < nWords; w += step )
- for ( i = 0; i < step; i++ )
- pInOut[w + i] = pInOut[i];
-}
-static void Abc_TtStretch6( word * pInOut, int nVarS, int nVarB )
-{
- int w, i, step, nWords;
- if ( nVarS == nVarB )
- return;
- assert( nVarS < nVarB );
- step = Abc_Truth6WordNum(nVarS);
- nWords = Abc_Truth6WordNum(nVarB);
- if ( step == nWords )
- return;
- assert( step < nWords );
- for ( w = 0; w < nWords; w += step )
- for ( i = 0; i < step; i++ )
- pInOut[w + i] = pInOut[i];
-}
-
-/**Function*************************************************************
-
Synopsis [Compute support sizes for each CO.]
Description []
diff --git a/src/map/if/if.h b/src/map/if/if.h
index 0d80d495..9e649e0c 100644
--- a/src/map/if/if.h
+++ b/src/map/if/if.h
@@ -535,7 +535,7 @@ extern void If_ObjPrint( If_Obj_t * pObj );
/*=== abcRec3.c ============================================================*/
extern int If_CutDelayRecCost(If_Man_t* p, If_Cut_t* pCut, If_Obj_t * pObj);
extern int If_CutDelayRecCost2(If_Man_t* p, If_Cut_t* pCut, If_Obj_t * pObj);
-extern int If_CutDelayRecCost2(If_Man_t* p, If_Cut_t* pCut, If_Obj_t * pObj);
+extern int If_CutDelayRecCost3(If_Man_t* p, If_Cut_t* pCut, If_Obj_t * pObj);
extern ABC_DLL int Abc_NtkRecIsRunning();
extern ABC_DLL int Abc_NtkRecIsRunning2();
extern ABC_DLL int Abc_NtkRecIsRunning3();
diff --git a/src/map/if/ifTruth.c b/src/map/if/ifTruth.c
index 87473767..4b0db8b4 100644
--- a/src/map/if/ifTruth.c
+++ b/src/map/if/ifTruth.c
@@ -19,6 +19,7 @@
***********************************************************************/
#include "if.h"
+#include "misc/util/utilTruth.h"
ABC_NAMESPACE_IMPL_START
@@ -450,261 +451,6 @@ int If_CutTruthMinimize( If_Man_t * p, If_Cut_t * pCut )
-
-/**Function*************************************************************
-
- Synopsis []
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline int Abc_TtWordNum( int nVars ) { return nVars <= 6 ? 1 : 1 << (nVars-6); }
-
-/**Function*************************************************************
-
- Synopsis []
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline void Abc_TtCopy( word * pOut, word * pIn, int nWords, int fCompl )
-{
- int w;
- if ( fCompl )
- for ( w = 0; w < nWords; w++ )
- pOut[w] = ~pIn[w];
- else
- for ( w = 0; w < nWords; w++ )
- pOut[w] = pIn[w];
-}
-static inline void Abc_TtAnd( word * pOut, word * pIn1, word * pIn2, int nWords, int fCompl )
-{
- int w;
- if ( fCompl )
- for ( w = 0; w < nWords; w++ )
- pOut[w] = ~(pIn1[w] & pIn2[w]);
- else
- for ( w = 0; w < nWords; w++ )
- pOut[w] = pIn1[w] & pIn2[w];
-}
-
-
-/**Function*************************************************************
-
- Synopsis []
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline int Abc_TtSuppIsMinBase( int Supp )
-{
- return (Supp & (Supp+1)) == 0;
-}
-static inline int Abc_Tt6HasVar( word t, int iVar )
-{
- static word Truth6[6] = {
- 0xAAAAAAAAAAAAAAAA,
- 0xCCCCCCCCCCCCCCCC,
- 0xF0F0F0F0F0F0F0F0,
- 0xFF00FF00FF00FF00,
- 0xFFFF0000FFFF0000,
- 0xFFFFFFFF00000000
- };
- return (t & ~Truth6[iVar]) != ((t & Truth6[iVar]) >> (1<<iVar));
-}
-static inline int Abc_TtHasVar( word * t, int nVars, int iVar )
-{
- static word Truth6[6] = {
- 0xAAAAAAAAAAAAAAAA,
- 0xCCCCCCCCCCCCCCCC,
- 0xF0F0F0F0F0F0F0F0,
- 0xFF00FF00FF00FF00,
- 0xFFFF0000FFFF0000,
- 0xFFFFFFFF00000000
- };
- int nWords = Abc_TtWordNum( nVars );
- assert( iVar < nVars );
- if ( iVar < 6 )
- {
- int i, Shift = (1 << iVar);
- for ( i = 0; i < nWords; i++ )
- if ( (t[i] & ~Truth6[iVar]) != ((t[i] & Truth6[iVar]) >> Shift) )
- return 1;
- return 0;
- }
- else
- {
- int i, k, Step = (1 << (iVar - 6));
- for ( k = 0; k < nWords; k += 2*Step )
- {
- for ( i = 0; i < Step; i++ )
- if ( t[i] != t[Step+i] )
- return 1;
- t += 2*Step;
- }
- return 0;
- }
-}
-static inline int Abc_TtSupport( word * t, int nVars )
-{
- int v, Supp = 0;
- for ( v = 0; v < nVars; v++ )
- if ( Abc_TtHasVar( t, nVars, v ) )
- Supp |= (1 << v);
- return Supp;
-}
-static inline int Abc_TtSupportSize( word * t, int nVars )
-{
- int v, SuppSize = 0;
- for ( v = 0; v < nVars; v++ )
- if ( Abc_TtHasVar( t, nVars, v ) )
- SuppSize++;
- return SuppSize;
-}
-static inline int Abc_TtSupportAndSize( word * t, int nVars, int * pSuppSize )
-{
- int v, Supp = 0;
- *pSuppSize = 0;
- for ( v = 0; v < nVars; v++ )
- if ( Abc_TtHasVar( t, nVars, v ) )
- Supp |= (1 << v), (*pSuppSize)++;
- return Supp;
-}
-static inline int Abc_Tt6SupportAndSize( word t, int nVars, int * pSuppSize )
-{
- int v, Supp = 0;
- *pSuppSize = 0;
- assert( nVars <= 6 );
- for ( v = 0; v < nVars; v++ )
- if ( Abc_Tt6HasVar( t, v ) )
- Supp |= (1 << v), (*pSuppSize)++;
- return Supp;
-}
-
-
-/**Function*************************************************************
-
- Synopsis []
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline word Abc_Tt6SwapVars( word Truth, int iVar, int jVar )
-{
- static word PPMasks[6][6] = {
- { 0x2222222222222222, 0x0A0A0A0A0A0A0A0A, 0x00AA00AA00AA00AA, 0x0000AAAA0000AAAA, 0x00000000AAAAAAAA, 0xAAAAAAAAAAAAAAAA },
- { 0x0000000000000000, 0x0C0C0C0C0C0C0C0C, 0x00CC00CC00CC00CC, 0x0000CCCC0000CCCC, 0x00000000CCCCCCCC, 0xCCCCCCCCCCCCCCCC },
- { 0x0000000000000000, 0x0000000000000000, 0x00F000F000F000F0, 0x0000F0F00000F0F0, 0x00000000F0F0F0F0, 0xF0F0F0F0F0F0F0F0 },
- { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000FF000000FF00, 0x00000000FF00FF00, 0xFF00FF00FF00FF00 },
- { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000FFFF0000, 0xFFFF0000FFFF0000 },
- { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000 }
- };
- int shift;
- word low2High, high2Low;
- assert( iVar <= 5 && jVar <= 5 && iVar < jVar );
- shift = (1 << jVar) - (1 << iVar);
- low2High = (Truth & PPMasks[iVar][jVar - 1] ) << shift;
- Truth &= ~PPMasks[iVar][jVar - 1];
- high2Low = (Truth & (PPMasks[iVar][jVar - 1] << shift )) >> shift;
- Truth &= ~(PPMasks[iVar][jVar - 1] << shift);
- return Truth | low2High | high2Low;
-}
-
-static inline void Abc_TtSwapVars( word * pTruth, int nVars, int * V2P, int * P2V, int iVar, int jVar )
-{
- word low2High, high2Low, temp;
- int nWords = Abc_TtWordNum(nVars);
- int shift, step, iStep, jStep;
- int w = 0, i = 0, j = 0;
- static word PPMasks[6][6] = {
- { 0x2222222222222222, 0x0A0A0A0A0A0A0A0A, 0x00AA00AA00AA00AA, 0x0000AAAA0000AAAA, 0x00000000AAAAAAAA, 0xAAAAAAAAAAAAAAAA },
- { 0x0000000000000000, 0x0C0C0C0C0C0C0C0C, 0x00CC00CC00CC00CC, 0x0000CCCC0000CCCC, 0x00000000CCCCCCCC, 0xCCCCCCCCCCCCCCCC },
- { 0x0000000000000000, 0x0000000000000000, 0x00F000F000F000F0, 0x0000F0F00000F0F0, 0x00000000F0F0F0F0, 0xF0F0F0F0F0F0F0F0 },
- { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000FF000000FF00, 0x00000000FF00FF00, 0xFF00FF00FF00FF00 },
- { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000FFFF0000, 0xFFFF0000FFFF0000 },
- { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000 }
- };
- if ( iVar == jVar )
- return;
- if ( jVar < iVar )
- {
- int varTemp = jVar;
- jVar = iVar;
- iVar = varTemp;
- }
- if ( iVar <= 5 && jVar <= 5 )
- {
- shift = (1 << jVar) - (1 << iVar);
- for ( w = 0; w < nWords; w++ )
- {
- low2High = (pTruth[w] & PPMasks[iVar][jVar - 1] ) << shift;
- pTruth[w] &= ~PPMasks[iVar][jVar - 1];
- high2Low = (pTruth[w] & (PPMasks[iVar][jVar - 1] << shift )) >> shift;
- pTruth[w] &= ~(PPMasks[iVar][jVar - 1] << shift);
- pTruth[w] = pTruth[w] | low2High | high2Low;
- }
- }
- else if ( iVar <= 5 && jVar > 5 )
- {
- step = Abc_TtWordNum(jVar + 1)/2;
- shift = 1 << iVar;
- for ( w = 0; w < nWords; w += 2*step )
- {
- for (j = 0; j < step; j++)
- {
- low2High = (pTruth[w + j] & PPMasks[iVar][5]) >> shift;
- pTruth[w + j] &= ~PPMasks[iVar][5];
- high2Low = (pTruth[w + step + j] & (PPMasks[iVar][5] >> shift)) << shift;
- pTruth[w + step + j] &= ~(PPMasks[iVar][5] >> shift);
- pTruth[w + j] |= high2Low;
- pTruth[w + step + j] |= low2High;
- }
- }
- }
- else
- {
- iStep = Abc_TtWordNum(iVar + 1)/2;
- jStep = Abc_TtWordNum(jVar + 1)/2;
- for (w = 0; w < nWords; w += 2*jStep)
- {
- for (i = 0; i < jStep; i += 2*iStep)
- {
- for (j = 0; j < iStep; j++)
- {
- temp = pTruth[w + iStep + i + j];
- pTruth[w + iStep + i + j] = pTruth[w + jStep + i + j];
- pTruth[w + jStep + i + j] = temp;
- }
- }
- }
- }
- if ( V2P && P2V )
- {
- V2P[P2V[iVar]] = jVar;
- V2P[P2V[jVar]] = iVar;
- P2V[iVar] ^= P2V[jVar];
- P2V[jVar] ^= P2V[iVar];
- P2V[iVar] ^= P2V[jVar];
- }
-}
-
-
/**Function*************************************************************
Synopsis [Performs truth table computation.]
@@ -741,7 +487,7 @@ static inline int If_CutTruthMinimize6( If_Man_t * p, If_Cut_t * pCut )
if ( k < i )
{
pCut->pLeaves[k] = pCut->pLeaves[i];
- *If_CutTruthW(pCut) = Abc_Tt6SwapVars( *If_CutTruthW(pCut), k, i );
+ Abc_TtSwapVars( If_CutTruthW(pCut), pCut->nLimit, k, i );
}
k++;
}
@@ -760,7 +506,7 @@ static inline word If_TruthStretch6( word Truth, If_Cut_t * pCut, If_Cut_t * pCu
continue;
assert( pCut0->pLeaves[k] == pCut->pLeaves[i] );
if ( k < i )
- Truth = Abc_Tt6SwapVars( Truth, k, i );
+ Abc_TtSwapVars( &Truth, pCut->nLimit, k, i );
k--;
}
return Truth;
@@ -804,7 +550,7 @@ static inline int If_CutTruthMinimize21( If_Man_t * p, If_Cut_t * pCut )
if ( k < i )
{
pCut->pLeaves[k] = pCut->pLeaves[i];
- Abc_TtSwapVars( pTruth, nVars, NULL, NULL, k, i );
+ Abc_TtSwapVars( pTruth, nVars, k, i );
}
k++;
}
@@ -848,7 +594,7 @@ static inline int If_CutTruthMinimize2( If_Man_t * p, If_Cut_t * pCut )
if ( k < i )
{
pCut->pLeaves[k] = pCut->pLeaves[i];
- Abc_TtSwapVars( If_CutTruthW(pCut), pCut->nLimit, NULL, NULL, k, i );
+ Abc_TtSwapVars( If_CutTruthW(pCut), pCut->nLimit, k, i );
}
k++;
}
@@ -867,7 +613,7 @@ static inline void If_TruthStretch2( word * pTruth, If_Cut_t * pCut, If_Cut_t *
continue;
assert( pCut0->pLeaves[k] == pCut->pLeaves[i] );
if ( k < i )
- Abc_TtSwapVars( pTruth, pCut->nLimit, NULL, NULL, k, i );
+ Abc_TtSwapVars( pTruth, pCut->nLimit, k, i );
k--;
}
}
diff --git a/src/misc/util/utilTruth.h b/src/misc/util/utilTruth.h
new file mode 100644
index 00000000..8ec4a513
--- /dev/null
+++ b/src/misc/util/utilTruth.h
@@ -0,0 +1,323 @@
+/**CFile****************************************************************
+
+ FileName [utilTruth.h]
+
+ SystemName [ABC: Logic synthesis and verification system.]
+
+ PackageName [Truth table manipulation.]
+
+ Synopsis [Truth table manipulation.]
+
+ Author [Alan Mishchenko]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - October 28, 2012.]
+
+ Revision [$Id: utilTruth.h,v 1.00 2012/10/28 00:00:00 alanmi Exp $]
+
+***********************************************************************/
+
+#ifndef ABC__misc__util__utilTruth_h
+#define ABC__misc__util__utilTruth_h
+
+////////////////////////////////////////////////////////////////////////
+/// INCLUDES ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// PARAMETERS ///
+////////////////////////////////////////////////////////////////////////
+
+ABC_NAMESPACE_HEADER_START
+
+////////////////////////////////////////////////////////////////////////
+/// BASIC TYPES ///
+////////////////////////////////////////////////////////////////////////
+
+static word s_Truths6[6] = {
+ 0xAAAAAAAAAAAAAAAA,
+ 0xCCCCCCCCCCCCCCCC,
+ 0xF0F0F0F0F0F0F0F0,
+ 0xFF00FF00FF00FF00,
+ 0xFFFF0000FFFF0000,
+ 0xFFFFFFFF00000000
+};
+
+////////////////////////////////////////////////////////////////////////
+/// MACRO DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+static inline int Abc_TtWordNum( int nVars ) { return nVars <= 6 ? 1 : 1 << (nVars-6); }
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+static inline void Abc_TtCopy( word * pOut, word * pIn, int nWords, int fCompl )
+{
+ int w;
+ if ( fCompl )
+ for ( w = 0; w < nWords; w++ )
+ pOut[w] = ~pIn[w];
+ else
+ for ( w = 0; w < nWords; w++ )
+ pOut[w] = pIn[w];
+}
+static inline void Abc_TtAnd( word * pOut, word * pIn1, word * pIn2, int nWords, int fCompl )
+{
+ int w;
+ if ( fCompl )
+ for ( w = 0; w < nWords; w++ )
+ pOut[w] = ~(pIn1[w] & pIn2[w]);
+ else
+ for ( w = 0; w < nWords; w++ )
+ pOut[w] = pIn1[w] & pIn2[w];
+}
+
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+static inline int Abc_TtSuppIsMinBase( int Supp )
+{
+ return (Supp & (Supp+1)) == 0;
+}
+static inline int Abc_Tt6HasVar( word t, int iVar )
+{
+ return (t & ~s_Truths6[iVar]) != ((t & s_Truths6[iVar]) >> (1<<iVar));
+}
+static inline int Abc_TtHasVar( word * t, int nVars, int iVar )
+{
+ int nWords = Abc_TtWordNum( nVars );
+ assert( iVar < nVars );
+ if ( iVar < 6 )
+ {
+ int i, Shift = (1 << iVar);
+ for ( i = 0; i < nWords; i++ )
+ if ( (t[i] & ~s_Truths6[iVar]) != ((t[i] & s_Truths6[iVar]) >> Shift) )
+ return 1;
+ return 0;
+ }
+ else
+ {
+ int i, k, Step = (1 << (iVar - 6));
+ for ( k = 0; k < nWords; k += 2*Step, t += 2*Step )
+ for ( i = 0; i < Step; i++ )
+ if ( t[i] != t[Step+i] )
+ return 1;
+ return 0;
+ }
+}
+static inline int Abc_TtSupport( word * t, int nVars )
+{
+ int v, Supp = 0;
+ for ( v = 0; v < nVars; v++ )
+ if ( Abc_TtHasVar( t, nVars, v ) )
+ Supp |= (1 << v);
+ return Supp;
+}
+static inline int Abc_TtSupportSize( word * t, int nVars )
+{
+ int v, SuppSize = 0;
+ for ( v = 0; v < nVars; v++ )
+ if ( Abc_TtHasVar( t, nVars, v ) )
+ SuppSize++;
+ return SuppSize;
+}
+static inline int Abc_TtSupportAndSize( word * t, int nVars, int * pSuppSize )
+{
+ int v, Supp = 0;
+ *pSuppSize = 0;
+ for ( v = 0; v < nVars; v++ )
+ if ( Abc_TtHasVar( t, nVars, v ) )
+ Supp |= (1 << v), (*pSuppSize)++;
+ return Supp;
+}
+static inline int Abc_Tt6SupportAndSize( word t, int nVars, int * pSuppSize )
+{
+ int v, Supp = 0;
+ *pSuppSize = 0;
+ assert( nVars <= 6 );
+ for ( v = 0; v < nVars; v++ )
+ if ( Abc_Tt6HasVar( t, v ) )
+ Supp |= (1 << v), (*pSuppSize)++;
+ return Supp;
+}
+
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+static inline void Abc_TtSwapVars( word * pTruth, int nVars, int iVar, int jVar )
+{
+ static word PPMasks[6][6] = {
+ { 0x2222222222222222, 0x0A0A0A0A0A0A0A0A, 0x00AA00AA00AA00AA, 0x0000AAAA0000AAAA, 0x00000000AAAAAAAA, 0xAAAAAAAAAAAAAAAA },
+ { 0x0000000000000000, 0x0C0C0C0C0C0C0C0C, 0x00CC00CC00CC00CC, 0x0000CCCC0000CCCC, 0x00000000CCCCCCCC, 0xCCCCCCCCCCCCCCCC },
+ { 0x0000000000000000, 0x0000000000000000, 0x00F000F000F000F0, 0x0000F0F00000F0F0, 0x00000000F0F0F0F0, 0xF0F0F0F0F0F0F0F0 },
+ { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000FF000000FF00, 0x00000000FF00FF00, 0xFF00FF00FF00FF00 },
+ { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00000000FFFF0000, 0xFFFF0000FFFF0000 },
+ { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0xFFFFFFFF00000000 }
+ };
+ if ( nVars <= 6 )
+ {
+ int shift;
+ word low2High, high2Low;
+ assert( iVar <= 5 && jVar <= 5 && iVar < jVar );
+ shift = (1 << jVar) - (1 << iVar);
+ low2High = (pTruth[0] & PPMasks[iVar][jVar - 1] ) << shift;
+ pTruth[0] &= ~PPMasks[iVar][jVar - 1];
+ high2Low = (pTruth[0] & (PPMasks[iVar][jVar - 1] << shift )) >> shift;
+ pTruth[0] &= ~(PPMasks[iVar][jVar - 1] << shift);
+ pTruth[0] |= low2High | high2Low;
+ }
+ else
+ {
+ word low2High, high2Low, temp;
+ int nWords = Abc_TtWordNum(nVars);
+ int shift, step, iStep, jStep;
+ int w = 0, i = 0, j = 0;
+ if ( iVar == jVar )
+ return;
+ if ( jVar < iVar )
+ ABC_SWAP( int, iVar, jVar );
+ if ( iVar <= 5 && jVar <= 5 )
+ {
+ shift = (1 << jVar) - (1 << iVar);
+ for ( w = 0; w < nWords; w++ )
+ {
+ low2High = (pTruth[w] & PPMasks[iVar][jVar - 1] ) << shift;
+ pTruth[w] &= ~PPMasks[iVar][jVar - 1];
+ high2Low = (pTruth[w] & (PPMasks[iVar][jVar - 1] << shift )) >> shift;
+ pTruth[w] &= ~(PPMasks[iVar][jVar - 1] << shift);
+ pTruth[w] |= low2High | high2Low;
+ }
+ }
+ else if ( iVar <= 5 && jVar > 5 )
+ {
+ step = Abc_TtWordNum(jVar + 1)/2;
+ shift = 1 << iVar;
+ for ( w = 0; w < nWords; w += 2*step )
+ {
+ for (j = 0; j < step; j++)
+ {
+ low2High = (pTruth[w + j] & PPMasks[iVar][5]) >> shift;
+ pTruth[w + j] &= ~PPMasks[iVar][5];
+ high2Low = (pTruth[w + step + j] & (PPMasks[iVar][5] >> shift)) << shift;
+ pTruth[w + step + j] &= ~(PPMasks[iVar][5] >> shift);
+ pTruth[w + j] |= high2Low;
+ pTruth[w + step + j] |= low2High;
+ }
+ }
+ }
+ else
+ {
+ iStep = Abc_TtWordNum(iVar + 1)/2;
+ jStep = Abc_TtWordNum(jVar + 1)/2;
+ for (w = 0; w < nWords; w += 2*jStep)
+ {
+ for (i = 0; i < jStep; i += 2*iStep)
+ {
+ for (j = 0; j < iStep; j++)
+ {
+ temp = pTruth[w + iStep + i + j];
+ pTruth[w + iStep + i + j] = pTruth[w + jStep + i + j];
+ pTruth[w + jStep + i + j] = temp;
+ }
+ }
+ }
+ }
+ }
+}
+
+
+/**Function*************************************************************
+
+ Synopsis [Stretch truthtable to have more input variables.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+static void Abc_TtStretch5( unsigned * pInOut, int nVarS, int nVarB )
+{
+ int w, i, step, nWords;
+ if ( nVarS == nVarB )
+ return;
+ assert( nVarS < nVarB );
+ step = Abc_TruthWordNum(nVarS);
+ nWords = Abc_TruthWordNum(nVarB);
+ if ( step == nWords )
+ return;
+ assert( step < nWords );
+ for ( w = 0; w < nWords; w += step )
+ for ( i = 0; i < step; i++ )
+ pInOut[w + i] = pInOut[i];
+}
+static void Abc_TtStretch6( word * pInOut, int nVarS, int nVarB )
+{
+ int w, i, step, nWords;
+ if ( nVarS == nVarB )
+ return;
+ assert( nVarS < nVarB );
+ step = Abc_Truth6WordNum(nVarS);
+ nWords = Abc_Truth6WordNum(nVarB);
+ if ( step == nWords )
+ return;
+ assert( step < nWords );
+ for ( w = 0; w < nWords; w += step )
+ for ( i = 0; i < step; i++ )
+ pInOut[w + i] = pInOut[i];
+}
+
+/*=== utilTruth.c ===========================================================*/
+
+
+ABC_NAMESPACE_HEADER_END
+
+#endif
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////