diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2012-10-28 19:42:20 -0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2012-10-28 19:42:20 -0700 |
commit | 68d360c2d0b696b27250973613e187fea0b7c9c1 (patch) | |
tree | e129782663b81b539396e59083897b59d56fc1ee | |
parent | f5a8cf99c0f0b89297833018256f4efa4dac6cb0 (diff) | |
download | abc-68d360c2d0b696b27250973613e187fea0b7c9c1.tar.gz abc-68d360c2d0b696b27250973613e187fea0b7c9c1.tar.bz2 abc-68d360c2d0b696b27250973613e187fea0b7c9c1.zip |
Move truth table code into a separte file.
-rw-r--r-- | abclib.dsp | 4 | ||||
-rw-r--r-- | src/base/abci/abcRec3.c | 43 | ||||
-rw-r--r-- | src/map/if/if.h | 2 | ||||
-rw-r--r-- | src/map/if/ifTruth.c | 266 | ||||
-rw-r--r-- | src/misc/util/utilTruth.h | 323 |
5 files changed, 335 insertions, 303 deletions
@@ -2709,6 +2709,10 @@ SOURCE=.\src\misc\util\utilSignal.h SOURCE=.\src\misc\util\utilSort.c # End Source File +# Begin Source File + +SOURCE=.\src\misc\util\utilTruth.h +# End Source File # End Group # Begin Group "nm" 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 /// +//////////////////////////////////////////////////////////////////////// |