diff options
Diffstat (limited to 'src/opt')
-rw-r--r-- | src/opt/dau/dau.h | 11 | ||||
-rw-r--r-- | src/opt/dau/dauCanon.c | 1590 | ||||
-rw-r--r-- | src/opt/dau/dauCount.c | 436 | ||||
-rw-r--r-- | src/opt/dau/dauGia.c | 4 | ||||
-rw-r--r-- | src/opt/dau/dauNpn.c | 816 | ||||
-rw-r--r-- | src/opt/dau/dauNpn2.c | 507 | ||||
-rw-r--r-- | src/opt/dau/module.make | 3 | ||||
-rw-r--r-- | src/opt/lpk/lpkAbcUtil.c | 4 | ||||
-rw-r--r-- | src/opt/lpk/lpkCore.c | 1 | ||||
-rw-r--r-- | src/opt/lpk/lpkInt.h | 8 | ||||
-rw-r--r-- | src/opt/sim/simMan.c | 2 |
11 files changed, 2632 insertions, 750 deletions
diff --git a/src/opt/dau/dau.h b/src/opt/dau/dau.h index f392a98f..82e9b83b 100644 --- a/src/opt/dau/dau.h +++ b/src/opt/dau/dau.h @@ -60,6 +60,7 @@ typedef enum { typedef struct Dss_Man_t_ Dss_Man_t; typedef struct Abc_TtHieMan_t_ Abc_TtHieMan_t; +typedef unsigned(*TtCanonicizeFunc)(Abc_TtHieMan_t * p, word * pTruth, int nVars, char * pCanonPerm, int flag); //////////////////////////////////////////////////////////////////////// /// MACRO DEFINITIONS /// @@ -77,7 +78,17 @@ static inline int Dau_DsdReadVar( char * p ) { if ( *p == '!' ) p++; return *p /*=== dauCanon.c ==========================================================*/ extern unsigned Abc_TtCanonicize( word * pTruth, int nVars, char * pCanonPerm ); +extern unsigned Abc_TtCanonicizePerm( word * pTruth, int nVars, char * pCanonPerm ); extern unsigned Abc_TtCanonicizePhase( word * pTruth, int nVars ); +extern int Abc_TtCountOnesInCofsSimple( word * pTruth, int nVars, int * pStore ); +extern unsigned Abc_TtCanonicizeHie(Abc_TtHieMan_t * p, word * pTruth, int nVars, char * pCanonPerm, int fExact ); +extern Abc_TtHieMan_t * Abc_TtHieManStart( int nVars, int nLevels ); +extern void Abc_TtHieManStop(Abc_TtHieMan_t * p ); +extern unsigned Abc_TtCanonicizeWrap(TtCanonicizeFunc func, Abc_TtHieMan_t * p, word * pTruth, int nVars, char * pCanonPerm, int flag); +extern unsigned Abc_TtCanonicizeAda(Abc_TtHieMan_t * p, word * pTruth, int nVars, char * pCanonPerm, int iThres); +extern unsigned Abc_TtCanonicizeHie(Abc_TtHieMan_t * p, word * pTruthInit, int nVars, char * pCanonPerm, int fExact); +/*=== dauCount.c ==========================================================*/ +extern int Abc_TtCountOnesInCofsQuick( word * pTruth, int nVars, int * pStore ); /*=== dauDsd.c ==========================================================*/ extern int * Dau_DsdComputeMatches( char * p ); extern int Dau_DsdDecompose( word * pTruth, int nVarsInit, int fSplitPrime, int fWriteTruth, char * pRes ); diff --git a/src/opt/dau/dauCanon.c b/src/opt/dau/dauCanon.c index d54a5c31..357da500 100644 --- a/src/opt/dau/dauCanon.c +++ b/src/opt/dau/dauCanon.c @@ -64,11 +64,11 @@ static inline int Abc_TtCompare1VarCofs( word * pTruth, int nWords, int iVar ) return Cof0 < Cof1 ? -1 : 1; return 0; } - if ( iVar <= 5 ) - { + if ( iVar <= 5 ) + { word Cof0, Cof1; - int w, shift = (1 << iVar); - for ( w = 0; w < nWords; w++ ) + int w, shift = (1 << iVar); + for ( w = 0; w < nWords; w++ ) { Cof0 = pTruth[w] & s_Truths6Neg[iVar]; Cof1 = (pTruth[w] >> shift) & s_Truths6Neg[iVar]; @@ -76,18 +76,18 @@ static inline int Abc_TtCompare1VarCofs( word * pTruth, int nWords, int iVar ) return Cof0 < Cof1 ? -1 : 1; } return 0; - } - // if ( iVar > 5 ) - { + } + // if ( iVar > 5 ) + { word * pLimit = pTruth + nWords; - int i, iStep = Abc_TtWordNum(iVar); + int i, iStep = Abc_TtWordNum(iVar); assert( nWords >= 2 ); - for ( ; pTruth < pLimit; pTruth += 2*iStep ) - for ( i = 0; i < iStep; i++ ) + 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 ) { @@ -99,11 +99,11 @@ static inline int Abc_TtCompare1VarCofsRev( word * pTruth, int nWords, int iVar return Cof0 < Cof1 ? -1 : 1; return 0; } - if ( iVar <= 5 ) - { + if ( iVar <= 5 ) + { word Cof0, Cof1; - int w, shift = (1 << iVar); - for ( w = nWords - 1; w >= 0; w-- ) + 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]; @@ -111,18 +111,18 @@ static inline int Abc_TtCompare1VarCofsRev( word * pTruth, int nWords, int iVar return Cof0 < Cof1 ? -1 : 1; } return 0; - } - // if ( iVar > 5 ) - { + } + // if ( iVar > 5 ) + { word * pLimit = pTruth + nWords; - int i, iStep = Abc_TtWordNum(iVar); + 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-- ) + 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; - } + } } */ @@ -142,35 +142,35 @@ static inline int Abc_TtCheckEqual2VarCofs( word * pTruth, int nWords, int iVar, 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 ( 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 ) - { + } + if ( iVar == 5 ) + { unsigned * pTruthU = (unsigned *)pTruth; unsigned * pLimitU = (unsigned *)(pTruth + nWords); assert( nWords >= 2 ); - for ( ; pTruthU < pLimitU; pTruthU += 4 ) + for ( ; pTruthU < pLimitU; pTruthU += 4 ) if ( pTruthU[Num2] != pTruthU[Num1] ) return 0; return 1; - } - // if ( iVar > 5 ) - { + } + // if ( iVar > 5 ) + { word * pLimit = pTruth + nWords; - int i, iStep = Abc_TtWordNum(iVar); + int i, iStep = Abc_TtWordNum(iVar); assert( nWords >= 4 ); - for ( ; pTruth < pLimit; pTruth += 4*iStep ) - for ( i = 0; i < iStep; i++ ) + 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; - } + } } /**Function************************************************************* @@ -195,11 +195,11 @@ static inline int Abc_TtCompare2VarCofs( word * pTruth, int nWords, int iVar, in return Cof1 < Cof2 ? -1 : 1; return 0; } - if ( iVar <= 4 ) - { + if ( iVar <= 4 ) + { word Cof1, Cof2; - int w, shift = (1 << iVar); - for ( w = 0; w < nWords; w++ ) + 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]; @@ -207,30 +207,30 @@ static inline int Abc_TtCompare2VarCofs( word * pTruth, int nWords, int iVar, in return Cof1 < Cof2 ? -1 : 1; } return 0; - } - if ( iVar == 5 ) - { + } + if ( iVar == 5 ) + { unsigned * pTruthU = (unsigned *)pTruth; unsigned * pLimitU = (unsigned *)(pTruth + nWords); assert( nWords >= 2 ); - for ( ; pTruthU < pLimitU; pTruthU += 4 ) + for ( ; pTruthU < pLimitU; pTruthU += 4 ) if ( pTruthU[Num1] != pTruthU[Num2] ) return pTruthU[Num1] < pTruthU[Num2] ? -1 : 1; return 0; - } - // if ( iVar > 5 ) - { + } + // if ( iVar > 5 ) + { word * pLimit = pTruth + nWords; - int i, iStep = Abc_TtWordNum(iVar); + int i, iStep = Abc_TtWordNum(iVar); int Offset1 = Num1*iStep; int Offset2 = Num2*iStep; assert( nWords >= 4 ); - for ( ; pTruth < pLimit; pTruth += 4*iStep ) - for ( i = 0; i < iStep; i++ ) + for ( ; pTruth < pLimit; pTruth += 4*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 ) { @@ -243,11 +243,11 @@ static inline int Abc_TtCompare2VarCofsRev( word * pTruth, int nWords, int iVar, return Cof1 < Cof2 ? -1 : 1; return 0; } - if ( iVar <= 4 ) - { + if ( iVar <= 4 ) + { word Cof1, Cof2; - int w, shift = (1 << iVar); - for ( w = nWords - 1; w >= 0; w-- ) + 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]; @@ -255,30 +255,30 @@ static inline int Abc_TtCompare2VarCofsRev( word * pTruth, int nWords, int iVar, return Cof1 < Cof2 ? -1 : 1; } return 0; - } - if ( iVar == 5 ) - { + } + if ( iVar == 5 ) + { unsigned * pTruthU = (unsigned *)pTruth; unsigned * pLimitU = (unsigned *)(pTruth + nWords); assert( nWords >= 2 ); - for ( pLimitU -= 4; pLimitU >= pTruthU; pLimitU -= 4 ) + for ( pLimitU -= 4; pLimitU >= pTruthU; pLimitU -= 4 ) if ( pLimitU[Num1] != pLimitU[Num2] ) return pLimitU[Num1] < pLimitU[Num2] ? -1 : 1; return 0; - } - // if ( iVar > 5 ) - { + } + // if ( iVar > 5 ) + { word * pLimit = pTruth + nWords; - int i, iStep = Abc_TtWordNum(iVar); + 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-- ) + 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; - } + } } /**Function************************************************************* @@ -292,13 +292,24 @@ static inline int Abc_TtCompare2VarCofsRev( word * pTruth, int nWords, int iVar, SeeAlso [] ***********************************************************************/ -#define DO_SMALL_TRUTHTABLE 0 +void Abc_TtNormalizeSmallTruth(word * pTruth, int nVars) +{ + if (nVars < 6) { + int shift, bits = (1 << nVars); + word base = *pTruth = *pTruth & ((((word)1) << bits) - 1); + for (shift = bits; shift < 64; shift += bits) + *pTruth |= base << shift; + } +} -static inline void Abc_TtNormalizeSmallTruth(word * pTruth, int nVars) +inline void Abc_TtVerifySmallTruth(word * pTruth, int nVars) { -#if DO_SMALL_TRUTHTABLE - if (nVars < 6) - *pTruth &= (1ULL << (1 << nVars)) - 1; +#ifndef NDEBUG + if (nVars < 6) { + word nTruth = *pTruth; + Abc_TtNormalizeSmallTruth(&nTruth, nVars); + assert(*pTruth == nTruth); + } #endif } @@ -306,7 +317,7 @@ static inline int Abc_TtCountOnesInTruth( word * pTruth, int nVars ) { int nWords = Abc_TtWordNum( nVars ); int k, Counter = 0; - Abc_TtNormalizeSmallTruth(pTruth, nVars); + Abc_TtVerifySmallTruth(pTruth, nVars); for ( k = 0; k < nWords; k++ ) if ( pTruth[k] ) Counter += Abc_TtCountOnes( pTruth[k] ); @@ -318,7 +329,7 @@ static inline void Abc_TtCountOnesInCofs( word * pTruth, int nVars, int * pStore int i, k, Counter, nWords; if ( nVars <= 6 ) { - Abc_TtNormalizeSmallTruth(pTruth, nVars); + Abc_TtVerifySmallTruth(pTruth, nVars); for ( i = 0; i < nVars; i++ ) pStore[i] = Abc_TtCountOnes( pTruth[0] & s_Truths6Neg[i] ); return; @@ -351,6 +362,11 @@ static inline void Abc_TtCountOnesInCofs( word * pTruth, int nVars, int * pStore } } } +int Abc_TtCountOnesInCofsSimple( word * pTruth, int nVars, int * pStore ) +{ + Abc_TtCountOnesInCofs( pTruth, nVars, pStore ); + return Abc_TtCountOnesInTruth( pTruth, nVars ); +} /**Function************************************************************* @@ -489,8 +505,9 @@ int Abc_TtCountOnesInCofsFast( word * pTruth, int nVars, int * pStore ) SeeAlso [] ***********************************************************************/ -static inline unsigned Abc_TtSemiCanonicize( word * pTruth, int nVars, char * pCanonPerm, int * pStoreOut ) +static inline unsigned Abc_TtSemiCanonicize( word * pTruth, int nVars, char * pCanonPerm, int * pStoreOut, int fOnlySwap ) { + int fUseOld = 1; int fOldSwap = 0; int pStoreIn[17]; int * pStore = pStoreOut ? pStoreOut : pStoreIn; @@ -499,25 +516,53 @@ static inline unsigned Abc_TtSemiCanonicize( word * pTruth, int nVars, char * pC assert( nVars <= 16 ); for ( i = 0; i < nVars; i++ ) pCanonPerm[i] = i; - // normalize polarity - nOnes = Abc_TtCountOnesInTruth( pTruth, nVars ); - if ( nOnes > nWords * 32 ) + + if ( fUseOld ) { - Abc_TtNot( pTruth, nWords ); - nOnes = nWords*64 - nOnes; - uCanonPhase |= (1 << nVars); + // normalize polarity + nOnes = Abc_TtCountOnesInTruth( pTruth, nVars ); + if ( nOnes > nWords * 32 && !fOnlySwap ) + { + Abc_TtNot( pTruth, nWords ); + nOnes = nWords*64 - nOnes; + uCanonPhase |= (1 << nVars); + } + // normalize phase + Abc_TtCountOnesInCofs( pTruth, nVars, pStore ); + pStore[nVars] = nOnes; + for ( i = 0; i < nVars; i++ ) + { + if ( pStore[i] >= nOnes - pStore[i] || fOnlySwap ) + continue; + Abc_TtFlip( pTruth, nWords, i ); + uCanonPhase |= (1 << i); + pStore[i] = nOnes - pStore[i]; + } } - // normalize phase - Abc_TtCountOnesInCofs( pTruth, nVars, pStore ); - pStore[nVars] = nOnes; - for ( i = 0; i < nVars; i++ ) + else { - if ( pStore[i] >= nOnes - pStore[i] ) - continue; - Abc_TtFlip( pTruth, nWords, i ); - uCanonPhase |= (1 << i); - pStore[i] = nOnes - pStore[i]; + nOnes = Abc_TtCountOnesInCofsQuick( pTruth, nVars, pStore ); + // normalize polarity + if ( nOnes > nWords * 32 && !fOnlySwap ) + { + for ( i = 0; i < nVars; i++ ) + pStore[i] = nWords * 32 - pStore[i]; + Abc_TtNot( pTruth, nWords ); + nOnes = nWords*64 - nOnes; + uCanonPhase |= (1 << nVars); + } + // normalize phase + pStore[nVars] = nOnes; + for ( i = 0; i < nVars; i++ ) + { + if ( pStore[i] >= nOnes - pStore[i] || fOnlySwap ) + continue; + Abc_TtFlip( pTruth, nWords, i ); + uCanonPhase |= (1 << i); + pStore[i] = nOnes - pStore[i]; + } } + // normalize permutation if ( fOldSwap ) { @@ -923,7 +968,7 @@ unsigned Abc_TtCanonicize( word * pTruth, int nVars, char * pCanonPerm ) Abc_TtCopy( pCopy1, pTruth, nWords, 0 ); #endif - uCanonPhase = Abc_TtSemiCanonicize( pTruth, nVars, pCanonPerm, pStoreIn ); + uCanonPhase = Abc_TtSemiCanonicize( pTruth, nVars, pCanonPerm, pStoreIn, 0 ); for ( k = 0; k < 5; k++ ) { int fChanges = 0; @@ -958,6 +1003,53 @@ unsigned Abc_TtCanonicize( word * pTruth, int nVars, char * pCanonPerm ) return uCanonPhase; } +unsigned Abc_TtCanonicizePerm( word * pTruth, int nVars, char * pCanonPerm ) +{ + int pStoreIn[17]; + unsigned uCanonPhase; + int i, k, nWords = Abc_TtWordNum( nVars ); + int fNaive = 1; + +#ifdef CANON_VERIFY + char pCanonPermCopy[16]; + static word pCopy1[1024]; + static word pCopy2[1024]; + Abc_TtCopy( pCopy1, pTruth, nWords, 0 ); +#endif + + assert( nVars <= 16 ); + for ( i = 0; i < nVars; i++ ) + pCanonPerm[i] = i; + + uCanonPhase = Abc_TtSemiCanonicize( pTruth, nVars, pCanonPerm, pStoreIn, 1 ); + for ( k = 0; k < 5; k++ ) + { + int fChanges = 0; + for ( i = nVars - 2; i >= 0; i-- ) + if ( pStoreIn[i] == pStoreIn[i+1] ) + fChanges |= Abc_TtCofactorPerm( pTruth, i, nWords, 1, pCanonPerm, &uCanonPhase, fNaive ); + if ( !fChanges ) + break; + fChanges = 0; + for ( i = 1; i < nVars - 1; i++ ) + if ( pStoreIn[i] == pStoreIn[i+1] ) + fChanges |= Abc_TtCofactorPerm( pTruth, i, nWords, 1, pCanonPerm, &uCanonPhase, fNaive ); + if ( !fChanges ) + break; + } + +#ifdef CANON_VERIFY + Abc_TtCopy( pCopy2, pTruth, nWords, 0 ); + memcpy( pCanonPermCopy, pCanonPerm, sizeof(char) * nVars ); + Abc_TtImplementNpnConfig( pCopy2, nVars, pCanonPermCopy, uCanonPhase ); + if ( !Abc_TtEqual( pCopy1, pCopy2, nWords ) ) + printf( "Canonical form verification failed!\n" ); +#endif + + assert( uCanonPhase == 0 ); + return uCanonPhase; +} + /**Function************************************************************* Synopsis [Semi-canonical form computation.] @@ -1073,83 +1165,92 @@ unsigned Abc_TtCanonicizePhase( word * pTruth, int nVars ) struct Abc_TtHieMan_t_ { - int nLastLevel, nWords; - Vec_Mem_t * vTtMem[TT_MAX_LEVELS]; // truth table memory and hash tables - Vec_Int_t * vRepres[TT_MAX_LEVELS]; // pointers to the representatives from the last hierarchical level - int vTruthId[TT_MAX_LEVELS]; + int nLastLevel, nWords; + Vec_Mem_t * vTtMem[TT_MAX_LEVELS]; // truth table memory and hash tables + Vec_Int_t * vRepres[TT_MAX_LEVELS]; // pointers to the representatives from the last hierarchical level + int vTruthId[TT_MAX_LEVELS]; }; Abc_TtHieMan_t * Abc_TtHieManStart(int nVars, int nLevels) { - Abc_TtHieMan_t * p = NULL; - int i; - if (nLevels > TT_MAX_LEVELS) return p; - p = ABC_CALLOC(Abc_TtHieMan_t, 1); - p->nLastLevel = nLevels - 1; - p->nWords = Abc_TtWordNum(nVars); - for (i = 0; i < nLevels; i++) - { - p->vTtMem[i] = Vec_MemAlloc(p->nWords, 12); - Vec_MemHashAlloc(p->vTtMem[i], 10000); - p->vRepres[i] = Vec_IntAlloc(1); - } - return p; + Abc_TtHieMan_t * p = NULL; + int i; + if (nLevels > TT_MAX_LEVELS) return p; + p = ABC_CALLOC(Abc_TtHieMan_t, 1); + p->nLastLevel = nLevels - 1; + p->nWords = Abc_TtWordNum(nVars); + for (i = 0; i < nLevels; i++) + { + p->vTtMem[i] = Vec_MemAlloc(p->nWords, 12); + Vec_MemHashAlloc(p->vTtMem[i], 10000); + p->vRepres[i] = Vec_IntAlloc(1); + } + return p; } void Abc_TtHieManStop(Abc_TtHieMan_t * p) { - int i; - for (i = 0; i <= p->nLastLevel; i++) - { - Vec_MemHashFree(p->vTtMem[i]); - Vec_MemFreeP(&p->vTtMem[i]); - Vec_IntFree(p->vRepres[i]); - } - ABC_FREE(p); + int i; + for (i = 0; i <= p->nLastLevel; i++) + { + Vec_MemHashFree(p->vTtMem[i]); + Vec_MemFreeP(&p->vTtMem[i]); + Vec_IntFree(p->vRepres[i]); + } + ABC_FREE(p); } int Abc_TtHieRetrieveOrInsert(Abc_TtHieMan_t * p, int level, word * pTruth, word * pResult) { - int i, iSpot, truthId; - word * pRepTruth; - if (level < 0) level += p->nLastLevel + 1; - if (level < 0 || level > p->nLastLevel) return -1; - iSpot = *Vec_MemHashLookup(p->vTtMem[level], pTruth); - if (iSpot == -1) { - p->vTruthId[level] = Vec_MemHashInsert(p->vTtMem[level], pTruth); - if (level < p->nLastLevel) return 0; - iSpot = p->vTruthId[level]; - } - // return the class representative - if (level < p->nLastLevel) - truthId = Vec_IntEntry(p->vRepres[level], iSpot); - else - truthId = iSpot; - for (i = 0; i < level; i++) - Vec_IntSetEntry(p->vRepres[i], p->vTruthId[i], truthId); - - pRepTruth = Vec_MemReadEntry(p->vTtMem[p->nLastLevel], truthId); - if (level < p->nLastLevel) { - Abc_TtCopy(pResult, pRepTruth, p->nWords, 0); - return 1; - } - assert(Abc_TtEqual(pTruth, pRepTruth, p->nWords)); - if (pTruth != pResult) - Abc_TtCopy(pResult, pRepTruth, p->nWords, 0); - return 0; + int i, iSpot, truthId; + word * pRepTruth; + if (!p) return -1; + if (level < 0) level += p->nLastLevel + 1; + if (level < 0 || level > p->nLastLevel) return -1; + iSpot = *Vec_MemHashLookup(p->vTtMem[level], pTruth); + if (iSpot == -1) { + p->vTruthId[level] = Vec_MemHashInsert(p->vTtMem[level], pTruth); + if (level < p->nLastLevel) return 0; + iSpot = p->vTruthId[level]; + } + // return the class representative + if (level < p->nLastLevel) + truthId = Vec_IntEntry(p->vRepres[level], iSpot); + else + truthId = iSpot; + for (i = 0; i < level; i++) + Vec_IntSetEntry(p->vRepres[i], p->vTruthId[i], truthId); + + pRepTruth = Vec_MemReadEntry(p->vTtMem[p->nLastLevel], truthId); + if (level < p->nLastLevel) { + Abc_TtCopy(pResult, pRepTruth, p->nWords, 0); + return 1; + } + assert(Abc_TtEqual(pTruth, pRepTruth, p->nWords)); + if (pTruth != pResult) + Abc_TtCopy(pResult, pRepTruth, p->nWords, 0); + return 0; } unsigned Abc_TtCanonicizeHie( Abc_TtHieMan_t * p, word * pTruthInit, int nVars, char * pCanonPerm, int fExact ) { int fNaive = 1; int pStore[17]; - static word pTruth[1024]; + //static word pTruth[1024]; + word * pTruth = pTruthInit; unsigned uCanonPhase = 0; int nOnes, nWords = Abc_TtWordNum( nVars ); int i, k; assert( nVars <= 16 ); - Abc_TtCopy( pTruth, pTruthInit, nWords, 0 ); + // handle constant + if ( nVars == 0 ) + { + Abc_TtClear( pTruthInit, nWords ); + return 0; + } + + //Abc_TtCopy( pTruth, pTruthInit, nWords, 0 ); for ( i = 0; i < nVars; i++ ) pCanonPerm[i] = i; @@ -1177,7 +1278,7 @@ unsigned Abc_TtCanonicizeHie( Abc_TtHieMan_t * p, word * pTruthInit, int nVars, pStore[i] = nOnes - pStore[i]; } // check cache - if (Abc_TtHieRetrieveOrInsert(p, 1, pTruth, pTruthInit) > 0) return 0; + if (Abc_TtHieRetrieveOrInsert(p, 1, pTruth, pTruthInit) > 0) return 0; // normalize permutation { @@ -1201,7 +1302,7 @@ unsigned Abc_TtCanonicizeHie( Abc_TtHieMan_t * p, word * pTruthInit, int nVars, } } // check cache - if (Abc_TtHieRetrieveOrInsert(p, 2, pTruth, pTruthInit) > 0) return 0; + if (Abc_TtHieRetrieveOrInsert(p, 2, pTruth, pTruthInit) > 0) return 0; // iterate TT permutations for tied variables for ( k = 0; k < 5; k++ ) @@ -1220,7 +1321,7 @@ unsigned Abc_TtCanonicizeHie( Abc_TtHieMan_t * p, word * pTruthInit, int nVars, break; } // check cache - if (Abc_TtHieRetrieveOrInsert(p, 3, pTruth, pTruthInit) > 0) return 0; + if (Abc_TtHieRetrieveOrInsert(p, 3, pTruth, pTruthInit) > 0) return 0; // perform exact NPN using groups if ( fExact ) { @@ -1262,7 +1363,7 @@ unsigned Abc_TtCanonicizeHie( Abc_TtHieMan_t * p, word * pTruthInit, int nVars, } } // update cache - Abc_TtHieRetrieveOrInsert(p, 4, pTruth, pTruthInit); + Abc_TtHieRetrieveOrInsert(p, 4, pTruth, pTruthInit); return 0; } @@ -1281,26 +1382,26 @@ SeeAlso [] typedef struct TiedGroup_ { - char iStart; // index of Abc_TgMan_t::pPerm - char nGVars; // the number of variables in the group - char fPhased; // if the phases of the variables are determined + char iStart; // index of Abc_TgMan_t::pPerm + char nGVars; // the number of variables in the group + char fPhased; // if the phases of the variables are determined } TiedGroup; typedef struct Abc_TgMan_t_ { - word *pTruth; - int nVars; // the number of variables - int nGVars; // the number of variables in groups ( symmetric variables purged ) - int nGroups; // the number of tied groups - unsigned uPhase; // phase of each variable and the function - char pPerm[16]; // permutation of variables, symmetric variables purged, for grouping - char pPermT[16]; // permutation of variables, symmetric variables expanded, actual transformation for pTruth - char pPermTRev[16]; // reverse permutation of pPermT - signed char pPermDir[16]; // for generating the next permutation - TiedGroup pGroup[16]; // tied groups - // symemtric group attributes - char symPhase[16]; // phase type of symemtric groups - signed char symLink[17]; // singly linked list, indicate the variables in symemtric groups + word *pTruth; + int nVars; // the number of variables + int nGVars; // the number of variables in groups ( symmetric variables purged ) + int nGroups; // the number of tied groups + unsigned uPhase; // phase of each variable and the function + char pPerm[16]; // permutation of variables, symmetric variables purged, for grouping + char pPermT[16]; // permutation of variables, symmetric variables expanded, actual transformation for pTruth + char pPermTRev[16]; // reverse permutation of pPermT + signed char pPermDir[16]; // for generating the next permutation + TiedGroup pGroup[16]; // tied groups + // symemtric group attributes + char symPhase[16]; // phase type of symemtric groups + signed char symLink[17]; // singly linked list, indicate the variables in symemtric groups } Abc_TgMan_t; #if !defined(NDEBUG) && !defined(CANON_VERIFY) @@ -1321,59 +1422,58 @@ SeeAlso [] // Johnson¨CTrotter algorithm static int Abc_NextPermSwapC(char * pData, signed char * pDir, int size) { - int i, j, k = -1; - for (i = 0; i < size; i++) - { - j = i + pDir[i]; - if (j >= 0 && j < size && pData[i] > pData[j] && (k < 0 || pData[i] > pData[k])) - k = i; - } - if (k < 0) k = 0; - - for (i = 0; i < size; i++) - if (pData[i] > pData[k]) - pDir[i] = -pDir[i]; - - j = k + pDir[k]; - return j < k ? j : k; + int i, j, k = -1; + for (i = 0; i < size; i++) + { + j = i + pDir[i]; + if (j >= 0 && j < size && pData[i] > pData[j] && (k < 0 || pData[i] > pData[k])) + k = i; + } + if (k < 0) k = 0; + + for (i = 0; i < size; i++) + if (pData[i] > pData[k]) + pDir[i] = -pDir[i]; + + j = k + pDir[k]; + return j < k ? j : k; } -typedef unsigned(*TtCanonicizeFunc)(Abc_TtHieMan_t * p, word * pTruth, int nVars, char * pCanonPerm, int flag); unsigned Abc_TtCanonicizeWrap(TtCanonicizeFunc func, Abc_TtHieMan_t * p, word * pTruth, int nVars, char * pCanonPerm, int flag) { - int nWords = Abc_TtWordNum(nVars); - unsigned uCanonPhase1, uCanonPhase2; - char pCanonPerm2[16]; - static word pTruth2[1024]; - - if (Abc_TtCountOnesInTruth(pTruth, nVars) != (1 << (nVars - 1))) - return func(p, pTruth, nVars, pCanonPerm, flag); - Abc_TtCopy(pTruth2, pTruth, nWords, 1); - Abc_TtNormalizeSmallTruth(pTruth2, nVars); - uCanonPhase1 = func(p, pTruth, nVars, pCanonPerm, flag); - uCanonPhase2 = func(p, pTruth2, nVars, pCanonPerm2, flag); - if (Abc_TtCompareRev(pTruth, pTruth2, nWords) <= 0) - return uCanonPhase1; - Abc_TtCopy(pTruth, pTruth2, nWords, 0); - memcpy(pCanonPerm, pCanonPerm2, nVars); - return uCanonPhase2; + int nWords = Abc_TtWordNum(nVars); + unsigned uCanonPhase1, uCanonPhase2; + char pCanonPerm2[16]; + static word pTruth2[1024]; + + Abc_TtNormalizeSmallTruth(pTruth, nVars); + if (Abc_TtCountOnesInTruth(pTruth, nVars) != nWords * 32) + return func(p, pTruth, nVars, pCanonPerm, flag); + Abc_TtCopy(pTruth2, pTruth, nWords, 1); + uCanonPhase1 = func(p, pTruth, nVars, pCanonPerm, flag); + uCanonPhase2 = func(p, pTruth2, nVars, pCanonPerm2, flag); + if (Abc_TtCompareRev(pTruth, pTruth2, nWords) <= 0) + return uCanonPhase1; + Abc_TtCopy(pTruth, pTruth2, nWords, 0); + memcpy(pCanonPerm, pCanonPerm2, nVars); + return uCanonPhase2; } word gpVerCopy[1024]; static int Abc_TtCannonVerify(word* pTruth, int nVars, char * pCanonPerm, unsigned uCanonPhase) { #ifdef CANON_VERIFY - int nWords = Abc_TtWordNum(nVars); - char pCanonPermCopy[16]; - static word pCopy2[1024]; - Abc_TtCopy(pCopy2, pTruth, nWords, 0); - memcpy(pCanonPermCopy, pCanonPerm, sizeof(char) * nVars); - Abc_TtImplementNpnConfig(pCopy2, nVars, pCanonPermCopy, uCanonPhase); - Abc_TtNormalizeSmallTruth(pCopy2, nVars); - return Abc_TtEqual(gpVerCopy, pCopy2, nWords); + int nWords = Abc_TtWordNum(nVars); + char pCanonPermCopy[16]; + static word pCopy2[1024]; + Abc_TtVerifySmallTruth(pTruth, nVars); + Abc_TtCopy(pCopy2, pTruth, nWords, 0); + memcpy(pCanonPermCopy, pCanonPerm, sizeof(char) * nVars); + Abc_TtImplementNpnConfig(pCopy2, nVars, pCanonPermCopy, uCanonPhase); + return Abc_TtEqual(gpVerCopy, pCopy2, nWords); #else - return 1; + return 1; #endif } @@ -1391,44 +1491,44 @@ SeeAlso [] static void Abc_TginitMan(Abc_TgMan_t * pMan, word * pTruth, int nVars) { - int i; - pMan->pTruth = pTruth; - pMan->nVars = pMan->nGVars = nVars; - pMan->uPhase = 0; - for (i = 0; i < nVars; i++) - { - pMan->pPerm[i] = i; - pMan->pPermT[i] = i; - pMan->pPermTRev[i] = i; - pMan->symPhase[i] = 1; - } + int i; + pMan->pTruth = pTruth; + pMan->nVars = pMan->nGVars = nVars; + pMan->uPhase = 0; + for (i = 0; i < nVars; i++) + { + pMan->pPerm[i] = i; + pMan->pPermT[i] = i; + pMan->pPermTRev[i] = i; + pMan->symPhase[i] = 1; + } } static inline void Abc_TgManCopy(Abc_TgMan_t* pDst, word* pDstTruth, Abc_TgMan_t* pSrc) { - *pDst = *pSrc; - Abc_TtCopy(pDstTruth, pSrc->pTruth, Abc_TtWordNum(pSrc->nVars), 0); - pDst->pTruth = pDstTruth; + *pDst = *pSrc; + Abc_TtCopy(pDstTruth, pSrc->pTruth, Abc_TtWordNum(pSrc->nVars), 0); + pDst->pTruth = pDstTruth; } static inline int Abc_TgCannonVerify(Abc_TgMan_t* pMan) { - return Abc_TtCannonVerify(pMan->pTruth, pMan->nVars, pMan->pPermT, pMan->uPhase); + return Abc_TtCannonVerify(pMan->pTruth, pMan->nVars, pMan->pPermT, pMan->uPhase); } void Abc_TgExpendSymmetry(Abc_TgMan_t * pMan, char * pPerm, char * pDest); static void CheckConfig(Abc_TgMan_t * pMan) { #ifndef NDEBUG - int i; - char pPermE[16]; - Abc_TgExpendSymmetry(pMan, pMan->pPerm, pPermE); - for (i = 0; i < pMan->nVars; i++) - { - assert(pPermE[i] == pMan->pPermT[i]); - assert(pMan->pPermTRev[pMan->pPermT[i]] == i); - } - assert(Abc_TgCannonVerify(pMan)); + int i; + char pPermE[16]; + Abc_TgExpendSymmetry(pMan, pMan->pPerm, pPermE); + for (i = 0; i < pMan->nVars; i++) + { + assert(pPermE[i] == pMan->pPermT[i]); + assert(pMan->pPermTRev[(int)pMan->pPermT[i]] == i); + } + assert(Abc_TgCannonVerify(pMan)); #endif } @@ -1446,84 +1546,84 @@ SeeAlso [] static inline void Abc_TgFlipVar(Abc_TgMan_t* pMan, int iVar) { - int nWords = Abc_TtWordNum(pMan->nVars); - int ivp = pMan->pPermTRev[iVar]; - Abc_TtFlip(pMan->pTruth, nWords, ivp); - pMan->uPhase ^= 1 << ivp; + int nWords = Abc_TtWordNum(pMan->nVars); + int ivp = pMan->pPermTRev[iVar]; + Abc_TtFlip(pMan->pTruth, nWords, ivp); + pMan->uPhase ^= 1 << ivp; } static inline void Abc_TgFlipSymGroupByVar(Abc_TgMan_t* pMan, int iVar) { - for (; iVar >= 0; iVar = pMan->symLink[iVar]) - if (pMan->symPhase[iVar]) - Abc_TgFlipVar(pMan, iVar); + for (; iVar >= 0; iVar = pMan->symLink[iVar]) + if (pMan->symPhase[iVar]) + Abc_TgFlipVar(pMan, iVar); } static inline void Abc_TgFlipSymGroup(Abc_TgMan_t* pMan, int idx) { - Abc_TgFlipSymGroupByVar(pMan, pMan->pPerm[idx]); + Abc_TgFlipSymGroupByVar(pMan, pMan->pPerm[idx]); } static inline void Abc_TgClearSymGroupPhase(Abc_TgMan_t* pMan, int iVar) { - for (; iVar >= 0; iVar = pMan->symLink[iVar]) - pMan->symPhase[iVar] = 0; + for (; iVar >= 0; iVar = pMan->symLink[iVar]) + pMan->symPhase[iVar] = 0; } static void Abc_TgImplementPerm(Abc_TgMan_t* pMan, const char *pPermDest) { - int i, nVars = pMan->nVars; - char *pPerm = pMan->pPermT; - char *pRev = pMan->pPermTRev; - unsigned uPhase = pMan->uPhase & (1 << nVars); - - for (i = 0; i < nVars; i++) - pRev[pPerm[i]] = i; - for (i = 0; i < nVars; i++) - pPerm[i] = pRev[pPermDest[i]]; - for (i = 0; i < nVars; i++) - pRev[pPerm[i]] = i; - - Abc_TtImplementNpnConfig(pMan->pTruth, nVars, pRev, 0); - Abc_TtNormalizeSmallTruth(pMan->pTruth, nVars); - - for (i = 0; i < nVars; i++) - { - if (pMan->uPhase & (1 << pPerm[i])) - uPhase |= (1 << i); - pPerm[i] = pPermDest[i]; - pRev[pPerm[i]] = i; - } - pMan->uPhase = uPhase; + int i, nVars = pMan->nVars; + char *pPerm = pMan->pPermT; + char *pRev = pMan->pPermTRev; + unsigned uPhase = pMan->uPhase & (1 << nVars); + + for (i = 0; i < nVars; i++) + pRev[(int)pPerm[i]] = i; + for (i = 0; i < nVars; i++) + pPerm[i] = pRev[(int)pPermDest[i]]; + for (i = 0; i < nVars; i++) + pRev[(int)pPerm[i]] = i; + + Abc_TtImplementNpnConfig(pMan->pTruth, nVars, pRev, 0); +// Abc_TtVerifySmallTruth(pMan->pTruth, nVars); + + for (i = 0; i < nVars; i++) + { + if (pMan->uPhase & (1 << pPerm[i])) + uPhase |= (1 << i); + pPerm[i] = pPermDest[i]; + pRev[(int)pPerm[i]] = i; + } + pMan->uPhase = uPhase; } static void Abc_TgSwapAdjacentSymGroups(Abc_TgMan_t* pMan, int idx) { - int iVar, jVar, ix; - char pPermNew[16]; - assert(idx < pMan->nGVars - 1); - iVar = pMan->pPerm[idx]; - jVar = pMan->pPerm[idx + 1]; - pMan->pPerm[idx] = jVar; - pMan->pPerm[idx + 1] = iVar; - ABC_SWAP(char, pMan->pPermDir[idx], pMan->pPermDir[idx + 1]); - if (pMan->symLink[iVar] >= 0 || pMan->symLink[jVar] >= 0) - { - Abc_TgExpendSymmetry(pMan, pMan->pPerm, pPermNew); - Abc_TgImplementPerm(pMan, pPermNew); - return; - } - // plain variable swap - ix = pMan->pPermTRev[iVar]; - assert(pMan->pPermT[ix] == iVar && pMan->pPermT[ix + 1] == jVar); - Abc_TtSwapAdjacent(pMan->pTruth, Abc_TtWordNum(pMan->nVars), ix); - pMan->pPermT[ix] = jVar; - pMan->pPermT[ix + 1] = iVar; - pMan->pPermTRev[iVar] = ix + 1; - pMan->pPermTRev[jVar] = ix; - if (((pMan->uPhase >> ix) & 1) != ((pMan->uPhase >> (ix + 1)) & 1)) - pMan->uPhase ^= 1 << ix | 1 << (ix + 1); - assert(Abc_TgCannonVerify(pMan)); + int iVar, jVar, ix; + char pPermNew[16]; + assert(idx < pMan->nGVars - 1); + iVar = pMan->pPerm[idx]; + jVar = pMan->pPerm[idx + 1]; + pMan->pPerm[idx] = jVar; + pMan->pPerm[idx + 1] = iVar; + ABC_SWAP(char, pMan->pPermDir[idx], pMan->pPermDir[idx + 1]); + if (pMan->symLink[iVar] >= 0 || pMan->symLink[jVar] >= 0) + { + Abc_TgExpendSymmetry(pMan, pMan->pPerm, pPermNew); + Abc_TgImplementPerm(pMan, pPermNew); + return; + } + // plain variable swap + ix = pMan->pPermTRev[iVar]; + assert(pMan->pPermT[ix] == iVar && pMan->pPermT[ix + 1] == jVar); + Abc_TtSwapAdjacent(pMan->pTruth, Abc_TtWordNum(pMan->nVars), ix); + pMan->pPermT[ix] = jVar; + pMan->pPermT[ix + 1] = iVar; + pMan->pPermTRev[iVar] = ix + 1; + pMan->pPermTRev[jVar] = ix; + if (((pMan->uPhase >> ix) & 1) != ((pMan->uPhase >> (ix + 1)) & 1)) + pMan->uPhase ^= 1 << ix | 1 << (ix + 1); + assert(Abc_TgCannonVerify(pMan)); } /**Function************************************************************* @@ -1542,33 +1642,33 @@ static word pSymCopy[1024]; static int Abc_TtIsSymmetric(word * pTruth, int nVars, int iVar, int jVar, int fPhase) { - int rv; - int nWords = Abc_TtWordNum(nVars); - Abc_TtCopy(pSymCopy, pTruth, nWords, 0); - Abc_TtSwapVars(pSymCopy, nVars, iVar, jVar); - rv = Abc_TtEqual(pTruth, pSymCopy, nWords) * 2; - if (!fPhase) return rv; - Abc_TtFlip(pSymCopy, nWords, iVar); - Abc_TtFlip(pSymCopy, nWords, jVar); - return rv + Abc_TtEqual(pTruth, pSymCopy, nWords); + int rv; + int nWords = Abc_TtWordNum(nVars); + Abc_TtCopy(pSymCopy, pTruth, nWords, 0); + Abc_TtSwapVars(pSymCopy, nVars, iVar, jVar); + rv = Abc_TtEqual(pTruth, pSymCopy, nWords) * 2; + if (!fPhase) return rv; + Abc_TtFlip(pSymCopy, nWords, iVar); + Abc_TtFlip(pSymCopy, nWords, jVar); + return rv + Abc_TtEqual(pTruth, pSymCopy, nWords); } static int Abc_TtIsSymmetricHigh(Abc_TgMan_t * pMan, int iVar, int jVar, int fPhase) { - int rv, iv, jv, n; - int nWords = Abc_TtWordNum(pMan->nVars); - Abc_TtCopy(pSymCopy, pMan->pTruth, nWords, 0); - for (n = 0, iv = iVar, jv = jVar; iv >= 0 && jv >= 0; iv = pMan->symLink[iv], jv = pMan->symLink[jv], n++) - Abc_TtSwapVars(pSymCopy, pMan->nVars, iv, jv); - assert(iv < 0 && jv < 0); // two symmetric groups must have the same size - rv = Abc_TtEqual(pMan->pTruth, pSymCopy, nWords) * 2; - if (!fPhase) return rv; - for (iv = iVar, jv = jVar; iv >= 0 && jv >= 0; iv = pMan->symLink[iv], jv = pMan->symLink[jv]) - { - if (pMan->symPhase[iv]) Abc_TtFlip(pSymCopy, nWords, iv); - if (pMan->symPhase[jv]) Abc_TtFlip(pSymCopy, nWords, jv); - } - return rv + Abc_TtEqual(pMan->pTruth, pSymCopy, nWords); + int rv, iv, jv, n; + int nWords = Abc_TtWordNum(pMan->nVars); + Abc_TtCopy(pSymCopy, pMan->pTruth, nWords, 0); + for (n = 0, iv = iVar, jv = jVar; iv >= 0 && jv >= 0; iv = pMan->symLink[iv], jv = pMan->symLink[jv], n++) + Abc_TtSwapVars(pSymCopy, pMan->nVars, iv, jv); + assert(iv < 0 && jv < 0); // two symmetric groups must have the same size + rv = Abc_TtEqual(pMan->pTruth, pSymCopy, nWords) * 2; + if (!fPhase) return rv; + for (iv = iVar, jv = jVar; iv >= 0 && jv >= 0; iv = pMan->symLink[iv], jv = pMan->symLink[jv]) + { + if (pMan->symPhase[iv]) Abc_TtFlip(pSymCopy, nWords, iv); + if (pMan->symPhase[jv]) Abc_TtFlip(pSymCopy, nWords, jv); + } + return rv + Abc_TtEqual(pMan->pTruth, pSymCopy, nWords); } /**Function************************************************************* @@ -1577,7 +1677,7 @@ Synopsis [Create groups by cofactor signatures] Description [Similar to Abc_TtSemiCanonicize. Use stable insertion sort to keep the order of the variables in the groups. - Defer permutation. ] + Defer permutation. ] SideEffects [] @@ -1587,53 +1687,53 @@ SeeAlso [] static void Abc_TgCreateGroups(Abc_TgMan_t * pMan) { - int pStore[17]; - int i, j, nOnes; - int nVars = pMan->nVars, nWords = Abc_TtWordNum(nVars); - TiedGroup * pGrp = pMan->pGroup; - assert(nVars <= 16); - // normalize polarity - nOnes = Abc_TtCountOnesInTruth(pMan->pTruth, nVars); - if (nOnes > (1 << (nVars - 1))) - { - Abc_TtNot(pMan->pTruth, nWords); - nOnes = (1 << nVars) - nOnes; - pMan->uPhase |= (1 << nVars); - } - // normalize phase - Abc_TtCountOnesInCofs(pMan->pTruth, nVars, pStore); - pStore[nVars] = nOnes; - for (i = 0; i < nVars; i++) - { - if (pStore[i] >= nOnes - pStore[i]) - continue; - Abc_TtFlip(pMan->pTruth, nWords, i); - pMan->uPhase |= (1 << i); - pStore[i] = nOnes - pStore[i]; - } - - // sort variables - for (i = 1; i < nVars; i++) - { - int a = pStore[i]; char aa = pMan->pPerm[i]; - for (j = i; j > 0 && pStore[j - 1] > a; j--) - pStore[j] = pStore[j - 1], pMan->pPerm[j] = pMan->pPerm[j - 1]; - pStore[j] = a; pMan->pPerm[j] = aa; - } - // group variables -// Abc_SortIdxC(pStore, pMan->pPerm, nVars); - pGrp[0].iStart = 0; - pGrp[0].fPhased = pStore[0] * 2 != nOnes; - for (i = j = 1; i < nVars; i++) - { - if (pStore[i] == pStore[i - 1]) continue; - pGrp[j].iStart = i; - pGrp[j].fPhased = pStore[i] * 2 != nOnes; - pGrp[j - 1].nGVars = i - pGrp[j - 1].iStart; - j++; - } - pGrp[j - 1].nGVars = i - pGrp[j - 1].iStart; - pMan->nGroups = j; + int pStore[17]; + int i, j, nOnes; + int nVars = pMan->nVars, nWords = Abc_TtWordNum(nVars); + TiedGroup * pGrp = pMan->pGroup; + assert(nVars <= 16); + // normalize polarity + nOnes = Abc_TtCountOnesInTruth(pMan->pTruth, nVars); + if (nOnes > nWords * 32) + { + Abc_TtNot(pMan->pTruth, nWords); + nOnes = nWords * 64 - nOnes; + pMan->uPhase |= (1 << nVars); + } + // normalize phase + Abc_TtCountOnesInCofs(pMan->pTruth, nVars, pStore); + pStore[nVars] = nOnes; + for (i = 0; i < nVars; i++) + { + if (pStore[i] >= nOnes - pStore[i]) + continue; + Abc_TtFlip(pMan->pTruth, nWords, i); + pMan->uPhase |= (1 << i); + pStore[i] = nOnes - pStore[i]; + } + + // sort variables + for (i = 1; i < nVars; i++) + { + int a = pStore[i]; char aa = pMan->pPerm[i]; + for (j = i; j > 0 && pStore[j - 1] > a; j--) + pStore[j] = pStore[j - 1], pMan->pPerm[j] = pMan->pPerm[j - 1]; + pStore[j] = a; pMan->pPerm[j] = aa; + } + // group variables +// Abc_SortIdxC(pStore, pMan->pPerm, nVars); + pGrp[0].iStart = 0; + pGrp[0].fPhased = pStore[0] * 2 != nOnes; + for (i = j = 1; i < nVars; i++) + { + if (pStore[i] == pStore[i - 1]) continue; + pGrp[j].iStart = i; + pGrp[j].fPhased = pStore[i] * 2 != nOnes; + pGrp[j - 1].nGVars = i - pGrp[j - 1].iStart; + j++; + } + pGrp[j - 1].nGVars = i - pGrp[j - 1].iStart; + pMan->nGroups = j; } /**Function************************************************************* @@ -1650,135 +1750,135 @@ SeeAlso [] static int Abc_TgGroupSymmetry(Abc_TgMan_t * pMan, TiedGroup * pGrp, int doHigh) { - int i, j, iVar, jVar, nsym = 0; - int fDone[16], scnt[16], stype[16]; - signed char *symLink = pMan->symLink; -// char * symPhase = pMan->symPhase; - int nGVars = pGrp->nGVars; - char * pVars = pMan->pPerm + pGrp->iStart; - int modified, order = 0; - - for (i = 0; i < nGVars; i++) - fDone[i] = 0, scnt[i] = 1; - - do { - modified = 0; - for (i = 0; i < nGVars - 1; i++) - { - iVar = pVars[i]; - if (iVar < 0 || fDone[i]) continue; -// if (!pGrp->fPhased && !Abc_TtHasVar(pMan->pTruth, pMan->nVars, iVar)) continue; - // Mark symmetric variables/groups - for (j = i + 1; j < nGVars; j++) - { - jVar = pVars[j]; - if (jVar < 0 || scnt[j] != scnt[i]) // || pMan->symPhase[jVar] != pMan->symPhase[iVar]) - stype[j] = 0; - else if (scnt[j] == 1) - stype[j] = Abc_TtIsSymmetric(pMan->pTruth, pMan->nVars, iVar, jVar, !pGrp->fPhased); - else - stype[j] = Abc_TtIsSymmetricHigh(pMan, iVar, jVar, !pGrp->fPhased); - } - fDone[i] = 1; - // Merge symmetric groups - for (j = i + 1; j < nGVars; j++) - { - int ii; - jVar = pVars[j]; - switch (stype[j]) - { - case 1: // E-Symmetry - Abc_TgFlipSymGroupByVar(pMan, jVar); - // fallthrough - case 2: // NE-Symmetry - pMan->symPhase[iVar] += pMan->symPhase[jVar]; - break; - case 3: // multiform Symmetry - Abc_TgClearSymGroupPhase(pMan, jVar); - break; - default: // case 0: No Symmetry - continue; - } - - for (ii = iVar; symLink[ii] >= 0; ii = symLink[ii]) - ; - symLink[ii] = jVar; - pVars[j] = -1; - scnt[i] += scnt[j]; - modified = 1; - fDone[i] = 0; - nsym++; - } - } -// if (++order > 3) printf("%d", order); - } while (doHigh && modified); - - return nsym; + int i, j, iVar, jVar, nsym = 0; + int fDone[16], scnt[16], stype[16]; + signed char *symLink = pMan->symLink; +// char * symPhase = pMan->symPhase; + int nGVars = pGrp->nGVars; + char * pVars = pMan->pPerm + pGrp->iStart; + int modified; + + for (i = 0; i < nGVars; i++) + fDone[i] = 0, scnt[i] = 1; + + do { + modified = 0; + for (i = 0; i < nGVars - 1; i++) + { + iVar = pVars[i]; + if (iVar < 0 || fDone[i]) continue; +// if (!pGrp->fPhased && !Abc_TtHasVar(pMan->pTruth, pMan->nVars, iVar)) continue; + // Mark symmetric variables/groups + for (j = i + 1; j < nGVars; j++) + { + jVar = pVars[j]; + if (jVar < 0 || scnt[j] != scnt[i]) // || pMan->symPhase[jVar] != pMan->symPhase[iVar]) + stype[j] = 0; + else if (scnt[j] == 1) + stype[j] = Abc_TtIsSymmetric(pMan->pTruth, pMan->nVars, iVar, jVar, !pGrp->fPhased); + else + stype[j] = Abc_TtIsSymmetricHigh(pMan, iVar, jVar, !pGrp->fPhased); + } + fDone[i] = 1; + // Merge symmetric groups + for (j = i + 1; j < nGVars; j++) + { + int ii; + jVar = pVars[j]; + switch (stype[j]) + { + case 1: // E-Symmetry + Abc_TgFlipSymGroupByVar(pMan, jVar); + // fallthrough + case 2: // NE-Symmetry + pMan->symPhase[iVar] += pMan->symPhase[jVar]; + break; + case 3: // multiform Symmetry + Abc_TgClearSymGroupPhase(pMan, jVar); + break; + default: // case 0: No Symmetry + continue; + } + + for (ii = iVar; symLink[ii] >= 0; ii = symLink[ii]) + ; + symLink[ii] = jVar; + pVars[j] = -1; + scnt[i] += scnt[j]; + modified = 1; + fDone[i] = 0; + nsym++; + } + } +// if (++order > 3) printf("%d", order); + } while (doHigh && modified); + + return nsym; } static void Abc_TgPurgeSymmetry(Abc_TgMan_t * pMan, int doHigh) { - int i, j, k, sum = 0, nVars = pMan->nVars; - signed char *symLink = pMan->symLink; - char gcnt[16] = { 0 }; - char * pPerm = pMan->pPerm; - - for (i = 0; i <= nVars; i++) - symLink[i] = -1; - - // purge unsupported variables - if (!pMan->pGroup[0].fPhased) - { - int iVar = pMan->nVars; - for (j = 0; j < pMan->pGroup[0].nGVars; j++) - { - int jVar = pPerm[j]; - assert(jVar >= 0); - if (!Abc_TtHasVar(pMan->pTruth, nVars, jVar)) - { - symLink[jVar] = symLink[iVar]; - symLink[iVar] = jVar; - pPerm[j] = -1; - gcnt[0]++; - } - } - } - - for (k = 0; k < pMan->nGroups; k++) - gcnt[k] += Abc_TgGroupSymmetry(pMan, pMan->pGroup + k, doHigh); - - for (i = 0; i < nVars && pPerm[i] >= 0; i++) - ; - for (j = i + 1; ; i++, j++) - { - while (j < nVars && pPerm[j] < 0) j++; - if (j >= nVars) break; - pPerm[i] = pPerm[j]; - } - for (k = 0; k < pMan->nGroups; k++) - { - pMan->pGroup[k].nGVars -= gcnt[k]; - pMan->pGroup[k].iStart -= sum; - sum += gcnt[k]; - } - if (pMan->pGroup[0].nGVars == 0) - { - pMan->nGroups--; - memmove(pMan->pGroup, pMan->pGroup + 1, sizeof(TiedGroup) * pMan->nGroups); - assert(pMan->pGroup[0].iStart == 0); - } - pMan->nGVars -= sum; + int i, j, k, sum = 0, nVars = pMan->nVars; + signed char *symLink = pMan->symLink; + char gcnt[16] = { 0 }; + char * pPerm = pMan->pPerm; + + for (i = 0; i <= nVars; i++) + symLink[i] = -1; + + // purge unsupported variables + if (!pMan->pGroup[0].fPhased) + { + int iVar = pMan->nVars; + for (j = 0; j < pMan->pGroup[0].nGVars; j++) + { + int jVar = pPerm[j]; + assert(jVar >= 0); + if (!Abc_TtHasVar(pMan->pTruth, nVars, jVar)) + { + symLink[jVar] = symLink[iVar]; + symLink[iVar] = jVar; + pPerm[j] = -1; + gcnt[0]++; + } + } + } + + for (k = 0; k < pMan->nGroups; k++) + gcnt[k] += Abc_TgGroupSymmetry(pMan, pMan->pGroup + k, doHigh); + + for (i = 0; i < nVars && pPerm[i] >= 0; i++) + ; + for (j = i + 1; ; i++, j++) + { + while (j < nVars && pPerm[j] < 0) j++; + if (j >= nVars) break; + pPerm[i] = pPerm[j]; + } + for (k = 0; k < pMan->nGroups; k++) + { + pMan->pGroup[k].nGVars -= gcnt[k]; + pMan->pGroup[k].iStart -= sum; + sum += gcnt[k]; + } + if (pMan->pGroup[0].nGVars == 0) + { + pMan->nGroups--; + memmove(pMan->pGroup, pMan->pGroup + 1, sizeof(TiedGroup) * pMan->nGroups); + assert(pMan->pGroup[0].iStart == 0); + } + pMan->nGVars -= sum; } void Abc_TgExpendSymmetry(Abc_TgMan_t * pMan, char * pPerm, char * pDest) { - int i = 0, j, k; - for (j = 0; j < pMan->nGVars; j++) - for (k = pPerm[j]; k >= 0; k = pMan->symLink[k]) - pDest[i++] = k; - for (k = pMan->symLink[pMan->nVars]; k >= 0; k = pMan->symLink[k]) - pDest[i++] = k; - assert(i == pMan->nVars); + int i = 0, j, k; + for (j = 0; j < pMan->nGVars; j++) + for (k = pPerm[j]; k >= 0; k = pMan->symLink[k]) + pDest[i++] = k; + for (k = pMan->symLink[pMan->nVars]; k >= 0; k = pMan->symLink[k]) + pDest[i++] = k; + assert(i == pMan->nVars); } @@ -1795,130 +1895,130 @@ SeeAlso [] ***********************************************************************/ static int Abc_TgSymGroupPerm(Abc_TgMan_t* pMan, int idx, TiedGroup* pTGrp) { - word* pTruth = pMan->pTruth; - static word pCopy[1024]; - static word pBest[1024]; - int Config = 0; - int nWords = Abc_TtWordNum(pMan->nVars); - Abc_TgMan_t tgManCopy, tgManBest; - int fSwapOnly = pTGrp->fPhased; - - CheckConfig(pMan); - if (fSwapOnly) - { - Abc_TgManCopy(&tgManCopy, pCopy, pMan); - Abc_TgSwapAdjacentSymGroups(&tgManCopy, idx); - CheckConfig(&tgManCopy); - if (Abc_TtCompareRev(pTruth, pCopy, nWords) < 0) - { - Abc_TgManCopy(pMan, pTruth, &tgManCopy); - return 4; - } - return 0; - } - - // save two copies - Abc_TgManCopy(&tgManCopy, pCopy, pMan); - Abc_TgManCopy(&tgManBest, pBest, pMan); - // PXY - // 001 - Abc_TgFlipSymGroup(&tgManCopy, idx); - CheckConfig(&tgManCopy); - if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) - Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 1; - // PXY - // 011 - Abc_TgFlipSymGroup(&tgManCopy, idx + 1); - CheckConfig(&tgManCopy); - if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) - Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 3; - // PXY - // 010 - Abc_TgFlipSymGroup(&tgManCopy, idx); - CheckConfig(&tgManCopy); - if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) - Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 2; - // PXY - // 110 - Abc_TgSwapAdjacentSymGroups(&tgManCopy, idx); - CheckConfig(&tgManCopy); - if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) - Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 6; - // PXY - // 111 - Abc_TgFlipSymGroup(&tgManCopy, idx + 1); - CheckConfig(&tgManCopy); - if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) - Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 7; - // PXY - // 101 - Abc_TgFlipSymGroup(&tgManCopy, idx); - CheckConfig(&tgManCopy); - if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) - Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 5; - // PXY - // 100 - Abc_TgFlipSymGroup(&tgManCopy, idx + 1); - CheckConfig(&tgManCopy); - if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) - Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 4; - // PXY - // 000 - Abc_TgSwapAdjacentSymGroups(&tgManCopy, idx); - CheckConfig(&tgManCopy); - assert(Abc_TtEqual(pTruth, pCopy, nWords)); - if (Config == 0) - return 0; - assert(Abc_TtCompareRev(pTruth, pBest, nWords) == 1); - Abc_TgManCopy(pMan, pTruth, &tgManBest); - return Config; + word* pTruth = pMan->pTruth; + static word pCopy[1024]; + static word pBest[1024]; + int Config = 0; + int nWords = Abc_TtWordNum(pMan->nVars); + Abc_TgMan_t tgManCopy, tgManBest; + int fSwapOnly = pTGrp->fPhased; + + CheckConfig(pMan); + if (fSwapOnly) + { + Abc_TgManCopy(&tgManCopy, pCopy, pMan); + Abc_TgSwapAdjacentSymGroups(&tgManCopy, idx); + CheckConfig(&tgManCopy); + if (Abc_TtCompareRev(pTruth, pCopy, nWords) < 0) + { + Abc_TgManCopy(pMan, pTruth, &tgManCopy); + return 4; + } + return 0; + } + + // save two copies + Abc_TgManCopy(&tgManCopy, pCopy, pMan); + Abc_TgManCopy(&tgManBest, pBest, pMan); + // PXY + // 001 + Abc_TgFlipSymGroup(&tgManCopy, idx); + CheckConfig(&tgManCopy); + if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) + Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 1; + // PXY + // 011 + Abc_TgFlipSymGroup(&tgManCopy, idx + 1); + CheckConfig(&tgManCopy); + if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) + Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 3; + // PXY + // 010 + Abc_TgFlipSymGroup(&tgManCopy, idx); + CheckConfig(&tgManCopy); + if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) + Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 2; + // PXY + // 110 + Abc_TgSwapAdjacentSymGroups(&tgManCopy, idx); + CheckConfig(&tgManCopy); + if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) + Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 6; + // PXY + // 111 + Abc_TgFlipSymGroup(&tgManCopy, idx + 1); + CheckConfig(&tgManCopy); + if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) + Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 7; + // PXY + // 101 + Abc_TgFlipSymGroup(&tgManCopy, idx); + CheckConfig(&tgManCopy); + if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) + Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 5; + // PXY + // 100 + Abc_TgFlipSymGroup(&tgManCopy, idx + 1); + CheckConfig(&tgManCopy); + if (Abc_TtCompareRev(pBest, pCopy, nWords) == 1) + Abc_TgManCopy(&tgManBest, pBest, &tgManCopy), Config = 4; + // PXY + // 000 + Abc_TgSwapAdjacentSymGroups(&tgManCopy, idx); + CheckConfig(&tgManCopy); + assert(Abc_TtEqual(pTruth, pCopy, nWords)); + if (Config == 0) + return 0; + assert(Abc_TtCompareRev(pTruth, pBest, nWords) == 1); + Abc_TgManCopy(pMan, pTruth, &tgManBest); + return Config; } static int Abc_TgPermPhase(Abc_TgMan_t* pMan, int iVar) { - static word pCopy[1024]; - int nWords = Abc_TtWordNum(pMan->nVars); - int ivp = pMan->pPermTRev[iVar]; - Abc_TtCopy(pCopy, pMan->pTruth, nWords, 0); - Abc_TtFlip(pCopy, nWords, ivp); - if (Abc_TtCompareRev(pMan->pTruth, pCopy, nWords) == 1) - { - Abc_TtCopy(pMan->pTruth, pCopy, nWords, 0); - pMan->uPhase ^= 1 << ivp; - return 16; - } - return 0; + static word pCopy[1024]; + int nWords = Abc_TtWordNum(pMan->nVars); + int ivp = pMan->pPermTRev[iVar]; + Abc_TtCopy(pCopy, pMan->pTruth, nWords, 0); + Abc_TtFlip(pCopy, nWords, ivp); + if (Abc_TtCompareRev(pMan->pTruth, pCopy, nWords) == 1) + { + Abc_TtCopy(pMan->pTruth, pCopy, nWords, 0); + pMan->uPhase ^= 1 << ivp; + return 16; + } + return 0; } static void Abc_TgSimpleEnumeration(Abc_TgMan_t * pMan) { - int i, j, k; - int pGid[16]; - - for (k = j = 0; j < pMan->nGroups; j++) - for (i = 0; i < pMan->pGroup[j].nGVars; i++, k++) - pGid[k] = j; - assert(k == pMan->nGVars); - - for (k = 0; k < 5; k++) - { - int fChanges = 0; - for (i = pMan->nGVars - 2; i >= 0; i--) - if (pGid[i] == pGid[i + 1]) - fChanges |= Abc_TgSymGroupPerm(pMan, i, pMan->pGroup + pGid[i]); - for (i = 1; i < pMan->nGVars - 1; i++) - if (pGid[i] == pGid[i + 1]) - fChanges |= Abc_TgSymGroupPerm(pMan, i, pMan->pGroup + pGid[i]); - - for (i = pMan->nVars - 1; i >= 0; i--) - if (pMan->symPhase[i]) - fChanges |= Abc_TgPermPhase(pMan, i); - for (i = 1; i < pMan->nVars; i++) - if (pMan->symPhase[i]) - fChanges |= Abc_TgPermPhase(pMan, i); - if (!fChanges) break; - } - assert(Abc_TgCannonVerify(pMan)); + int i, j, k; + int pGid[16]; + + for (k = j = 0; j < pMan->nGroups; j++) + for (i = 0; i < pMan->pGroup[j].nGVars; i++, k++) + pGid[k] = j; + assert(k == pMan->nGVars); + + for (k = 0; k < 5; k++) + { + int fChanges = 0; + for (i = pMan->nGVars - 2; i >= 0; i--) + if (pGid[i] == pGid[i + 1]) + fChanges |= Abc_TgSymGroupPerm(pMan, i, pMan->pGroup + pGid[i]); + for (i = 1; i < pMan->nGVars - 1; i++) + if (pGid[i] == pGid[i + 1]) + fChanges |= Abc_TgSymGroupPerm(pMan, i, pMan->pGroup + pGid[i]); + + for (i = pMan->nVars - 1; i >= 0; i--) + if (pMan->symPhase[i]) + fChanges |= Abc_TgPermPhase(pMan, i); + for (i = 1; i < pMan->nVars; i++) + if (pMan->symPhase[i]) + fChanges |= Abc_TgPermPhase(pMan, i); + if (!fChanges) break; + } + assert(Abc_TgCannonVerify(pMan)); } /**Function************************************************************* @@ -1935,194 +2035,198 @@ SeeAlso [] // enumeration time = exp((cost-27.12)*0.59) static int Abc_TgEnumerationCost(Abc_TgMan_t * pMan) { - int cSym = 0; - double cPerm = 0.0; - TiedGroup * pGrp = 0; - int i, j, n; - if (pMan->nGroups == 0) return 0; - - for (i = 0; i < pMan->nGroups; i++) - { - pGrp = pMan->pGroup + i; - n = pGrp->nGVars; - if (n > 1) - cPerm += 0.92 + log(n) / 2 + n * (log(n) - 1); - } - if (pMan->pGroup->fPhased) - n = 0; - else - { - char * pVars = pMan->pPerm; - n = pMan->pGroup->nGVars; - for (i = 0; i < n; i++) - for (j = pVars[i]; j >= 0; j = pMan->symLink[j]) - cSym++; - } - // coefficients computed by linear regression - return pMan->nVars + n * 1.09 + cPerm * 1.65 + 0.5; -// return (rv > 60 ? 100000000 : 0) + n * 1000000 + cSym * 10000 + cPerm * 100 + 0.5; + int cSym = 0; + double cPerm = 0.0; + TiedGroup * pGrp = 0; + int i, j, n; + if (pMan->nGroups == 0) return 0; + + for (i = 0; i < pMan->nGroups; i++) + { + pGrp = pMan->pGroup + i; + n = pGrp->nGVars; + if (n > 1) + cPerm += 0.92 + log(n) / 2 + n * (log(n) - 1); + } + if (pMan->pGroup->fPhased) + n = 0; + else + { + char * pVars = pMan->pPerm; + n = pMan->pGroup->nGVars; + for (i = 0; i < n; i++) + for (j = pVars[i]; j >= 0; j = pMan->symLink[j]) + cSym++; + } + // coefficients computed by linear regression + return pMan->nVars + n * 1.09 + cPerm * 1.65 + 0.5; +// return (rv > 60 ? 100000000 : 0) + n * 1000000 + cSym * 10000 + cPerm * 100 + 0.5; } static int Abc_TgIsInitPerm(char * pData, signed char * pDir, int size) { - int i; - if (pDir[0] != -1) return 0; - for (i = 1; i < size; i++) - if (pDir[i] != -1 || pData[i] < pData[i - 1]) - return 0; - return 1; + int i; + if (pDir[0] != -1) return 0; + for (i = 1; i < size; i++) + if (pDir[i] != -1 || pData[i] < pData[i - 1]) + return 0; + return 1; } static void Abc_TgFirstPermutation(Abc_TgMan_t * pMan) { - int i; - for (i = 0; i < pMan->nGVars; i++) - pMan->pPermDir[i] = -1; + int i; + for (i = 0; i < pMan->nGVars; i++) + pMan->pPermDir[i] = -1; #ifndef NDEBUG - for (i = 0; i < pMan->nGroups; i++) - { - TiedGroup * pGrp = pMan->pGroup + i; - int nGvars = pGrp->nGVars; - char * pVars = pMan->pPerm + pGrp->iStart; - signed char * pDirs = pMan->pPermDir + pGrp->iStart; - assert(Abc_TgIsInitPerm(pVars, pDirs, nGvars)); - } + for (i = 0; i < pMan->nGroups; i++) + { + TiedGroup * pGrp = pMan->pGroup + i; + int nGvars = pGrp->nGVars; + char * pVars = pMan->pPerm + pGrp->iStart; + signed char * pDirs = pMan->pPermDir + pGrp->iStart; + assert(Abc_TgIsInitPerm(pVars, pDirs, nGvars)); + } #endif } static int Abc_TgNextPermutation(Abc_TgMan_t * pMan) { - int i, j, nGvars; - TiedGroup * pGrp; - char * pVars; - signed char * pDirs; - for (i = 0; i < pMan->nGroups; i++) - { - pGrp = pMan->pGroup + i; - nGvars = pGrp->nGVars; - if (nGvars == 1) continue; - pVars = pMan->pPerm + pGrp->iStart; - pDirs = pMan->pPermDir + pGrp->iStart; - j = Abc_NextPermSwapC(pVars, pDirs, nGvars); - if (j >= 0) - { - Abc_TgSwapAdjacentSymGroups(pMan, j + pGrp->iStart); - return 1; - } - Abc_TgSwapAdjacentSymGroups(pMan, pGrp->iStart); - assert(Abc_TgIsInitPerm(pVars, pDirs, nGvars)); - } - return 0; + int i, j, nGvars; + TiedGroup * pGrp; + char * pVars; + signed char * pDirs; + for (i = 0; i < pMan->nGroups; i++) + { + pGrp = pMan->pGroup + i; + nGvars = pGrp->nGVars; + if (nGvars == 1) continue; + pVars = pMan->pPerm + pGrp->iStart; + pDirs = pMan->pPermDir + pGrp->iStart; + j = Abc_NextPermSwapC(pVars, pDirs, nGvars); + if (j >= 0) + { + Abc_TgSwapAdjacentSymGroups(pMan, j + pGrp->iStart); + return 1; + } + Abc_TgSwapAdjacentSymGroups(pMan, pGrp->iStart); + assert(Abc_TgIsInitPerm(pVars, pDirs, nGvars)); + } + return 0; } static inline unsigned grayCode(unsigned a) { return a ^ (a >> 1); } -static int grayFlip(unsigned a, int n) +static int grayFlip(unsigned a) { - unsigned d = grayCode(a) ^ grayCode(a + 1); - int i; - for (i = 0; i < n; i++) - if (d == 1U << i) return i; - assert(0); - return -1; -} + int i; + for (i = 0, a++; ; i++) + if (a & (1 << i)) return i; + } static inline void Abc_TgSaveBest(Abc_TgMan_t * pMan, Abc_TgMan_t * pBest) { - if (Abc_TtCompare(pBest->pTruth, pMan->pTruth, Abc_TtWordNum(pMan->nVars)) == 1) - Abc_TgManCopy(pBest, pBest->pTruth, pMan); + if (Abc_TtCompare(pBest->pTruth, pMan->pTruth, Abc_TtWordNum(pMan->nVars)) == 1) + Abc_TgManCopy(pBest, pBest->pTruth, pMan); } static void Abc_TgPhaseEnumeration(Abc_TgMan_t * pMan, Abc_TgMan_t * pBest) { - char pFGrps[16]; - TiedGroup * pGrp = pMan->pGroup; - int i, j, n = pGrp->nGVars; - - Abc_TgSaveBest(pMan, pBest); - if (pGrp->fPhased) return; - - // sort by symPhase - for (i = 0; i < n; i++) - { - char iv = pMan->pPerm[i]; - for (j = i; j > 0 && pMan->symPhase[pFGrps[j-1]] > pMan->symPhase[iv]; j--) - pFGrps[j] = pFGrps[j - 1]; - pFGrps[j] = iv; - } - - for (i = 0; i < (1 << n) - 1; i++) - { - Abc_TgFlipSymGroupByVar(pMan, pFGrps[grayFlip(i, n)]); - Abc_TgSaveBest(pMan, pBest); - } + char pFGrps[16]; + TiedGroup * pGrp = pMan->pGroup; + int i, j, n = pGrp->nGVars; + + Abc_TgSaveBest(pMan, pBest); + if (pGrp->fPhased) return; + + // sort by symPhase + for (i = 0; i < n; i++) + { + char iv = pMan->pPerm[i]; + for (j = i; j > 0 && pMan->symPhase[(int)pFGrps[j-1]] > pMan->symPhase[(int)iv]; j--) + pFGrps[j] = pFGrps[j - 1]; + pFGrps[j] = iv; + } + + for (i = 0; i < (1 << n) - 1; i++) + { + Abc_TgFlipSymGroupByVar(pMan, pFGrps[grayFlip(i)]); + Abc_TgSaveBest(pMan, pBest); + } } static void Abc_TgFullEnumeration(Abc_TgMan_t * pWork, Abc_TgMan_t * pBest) { -// static word pCopy[1024]; -// Abc_TgMan_t tgManCopy; -// Abc_TgManCopy(&tgManCopy, pCopy, pMan); - - Abc_TgFirstPermutation(pWork); - do Abc_TgPhaseEnumeration(pWork, pBest); - while (Abc_TgNextPermutation(pWork)); - pBest->uPhase |= 1U << 30; +// static word pCopy[1024]; +// Abc_TgMan_t tgManCopy; +// Abc_TgManCopy(&tgManCopy, pCopy, pMan); + + Abc_TgFirstPermutation(pWork); + do Abc_TgPhaseEnumeration(pWork, pBest); + while (Abc_TgNextPermutation(pWork)); + pBest->uPhase |= 1 << 30; } unsigned Abc_TtCanonicizeAda(Abc_TtHieMan_t * p, word * pTruth, int nVars, char * pCanonPerm, int iThres) { - int nWords = Abc_TtWordNum(nVars); - unsigned fExac = 0, fHash = 1U << 29; - static word pCopy[1024]; - Abc_TgMan_t tgMan, tgManCopy; - int iCost; - const int MaxCost = 84; // maximun posible cost for function with 16 inputs - const int doHigh = iThres / 100, iEnumThres = iThres % 100; + int nWords = Abc_TtWordNum(nVars); + unsigned fExac = 0, fHash = 1 << 29; + static word pCopy[1024]; + Abc_TgMan_t tgMan, tgManCopy; + int iCost; + const int MaxCost = 84; // maximun posible cost for function with 16 inputs + const int doHigh = iThres / 100, iEnumThres = iThres % 100; + + // handle constant + if ( nVars == 0 ) { + Abc_TtClear( pTruth, nWords ); + return 0; + } + Abc_TtVerifySmallTruth(pTruth, nVars); #ifdef CANON_VERIFY - Abc_TtCopy(gpVerCopy, pTruth, nWords, 0); + Abc_TtCopy(gpVerCopy, pTruth, nWords, 0); #endif - assert(nVars <= 16); - if (p && Abc_TtHieRetrieveOrInsert(p, -5, pTruth, pTruth) > 0) return fHash; - Abc_TginitMan(&tgMan, pTruth, nVars); - Abc_TgCreateGroups(&tgMan); - if (p && Abc_TtHieRetrieveOrInsert(p, -4, pTruth, pTruth) > 0) return fHash; - Abc_TgPurgeSymmetry(&tgMan, doHigh); - - Abc_TgExpendSymmetry(&tgMan, tgMan.pPerm, pCanonPerm); - Abc_TgImplementPerm(&tgMan, pCanonPerm); - assert(Abc_TgCannonVerify(&tgMan)); - - if (p == NULL) { - if (iEnumThres > MaxCost || Abc_TgEnumerationCost(&tgMan) < iEnumThres) { - Abc_TgManCopy(&tgManCopy, pCopy, &tgMan); - Abc_TgFullEnumeration(&tgManCopy, &tgMan); - } - else - Abc_TgSimpleEnumeration(&tgMan); - } - else { - iCost = Abc_TgEnumerationCost(&tgMan); - if (iCost < iEnumThres) fExac = 1U << 30; - if (Abc_TtHieRetrieveOrInsert(p, -3, pTruth, pTruth) > 0) return fHash + fExac; - Abc_TgManCopy(&tgManCopy, pCopy, &tgMan); - Abc_TgSimpleEnumeration(&tgMan); - if (Abc_TtHieRetrieveOrInsert(p, -2, pTruth, pTruth) > 0) return fHash + fExac; - if (fExac) { - Abc_TgManCopy(&tgMan, pTruth, &tgManCopy); - Abc_TgFullEnumeration(&tgManCopy, &tgMan); - } - Abc_TtHieRetrieveOrInsert(p, -1, pTruth, pTruth); - } - memcpy(pCanonPerm, tgMan.pPermT, sizeof(char) * nVars); + assert(nVars <= 16); + if (p && Abc_TtHieRetrieveOrInsert(p, -5, pTruth, pTruth) > 0) return fHash; + Abc_TginitMan(&tgMan, pTruth, nVars); + Abc_TgCreateGroups(&tgMan); + if (p && Abc_TtHieRetrieveOrInsert(p, -4, pTruth, pTruth) > 0) return fHash; + Abc_TgPurgeSymmetry(&tgMan, doHigh); + + Abc_TgExpendSymmetry(&tgMan, tgMan.pPerm, pCanonPerm); + Abc_TgImplementPerm(&tgMan, pCanonPerm); + assert(Abc_TgCannonVerify(&tgMan)); + + if (p == NULL) { + if (iEnumThres > MaxCost || Abc_TgEnumerationCost(&tgMan) < iEnumThres) { + Abc_TgManCopy(&tgManCopy, pCopy, &tgMan); + Abc_TgFullEnumeration(&tgManCopy, &tgMan); + } + else + Abc_TgSimpleEnumeration(&tgMan); + } + else { + iCost = Abc_TgEnumerationCost(&tgMan); + if (iCost < iEnumThres) fExac = 1 << 30; + if (Abc_TtHieRetrieveOrInsert(p, -3, pTruth, pTruth) > 0) return fHash + fExac; + Abc_TgManCopy(&tgManCopy, pCopy, &tgMan); + Abc_TgSimpleEnumeration(&tgMan); + if (Abc_TtHieRetrieveOrInsert(p, -2, pTruth, pTruth) > 0) return fHash + fExac; + if (fExac) { + Abc_TgManCopy(&tgMan, pTruth, &tgManCopy); + Abc_TgFullEnumeration(&tgManCopy, &tgMan); + } + Abc_TtHieRetrieveOrInsert(p, -1, pTruth, pTruth); + } + memcpy(pCanonPerm, tgMan.pPermT, sizeof(char) * nVars); #ifdef CANON_VERIFY - if (!Abc_TgCannonVerify(&tgMan)) - printf("Canonical form verification failed!\n"); + if (!Abc_TgCannonVerify(&tgMan)) + printf("Canonical form verification failed!\n"); #endif - return tgMan.uPhase; + return tgMan.uPhase; } //////////////////////////////////////////////////////////////////////// diff --git a/src/opt/dau/dauCount.c b/src/opt/dau/dauCount.c new file mode 100644 index 00000000..828c5bea --- /dev/null +++ b/src/opt/dau/dauCount.c @@ -0,0 +1,436 @@ +/**CFile**************************************************************** + + FileName [dau.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [DAG-aware unmapping.] + + Synopsis [Counting ones in the truth table.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - June 20, 2005.] + + Revision [$Id: dau.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "dauInt.h" + +ABC_NAMESPACE_IMPL_START + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +static word Table[256][32] = //{{0}}; +{ + { ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000), ABC_CONST(0x0000000000000000) }, + { ABC_CONST(0x0101010101010101), ABC_CONST(0x0101010100010101), ABC_CONST(0x0101010001010101), ABC_CONST(0x0101010000010101), ABC_CONST(0x0101000101010101), ABC_CONST(0x0101000100010101), ABC_CONST(0x0101000001010101), ABC_CONST(0x0101000000010101), ABC_CONST(0x0100010101010101), ABC_CONST(0x0100010100010101), ABC_CONST(0x0100010001010101), ABC_CONST(0x0100010000010101), ABC_CONST(0x0100000101010101), ABC_CONST(0x0100000100010101), ABC_CONST(0x0100000001010101), ABC_CONST(0x0100000000010101), ABC_CONST(0x0101010101010101), ABC_CONST(0x0101010100010101), ABC_CONST(0x0101010001010101), ABC_CONST(0x0101010000010101), ABC_CONST(0x0101000101010101), ABC_CONST(0x0101000100010101), ABC_CONST(0x0101000001010101), ABC_CONST(0x0101000000010101), ABC_CONST(0x0100010101010101), ABC_CONST(0x0100010100010101), ABC_CONST(0x0100010001010101), ABC_CONST(0x0100010000010101), ABC_CONST(0x0100000101010101), ABC_CONST(0x0100000100010101), ABC_CONST(0x0100000001010101), ABC_CONST(0x0100000000010101) }, + { ABC_CONST(0x0101010101010100), ABC_CONST(0x0101010100010100), ABC_CONST(0x0101010001010100), ABC_CONST(0x0101010000010100), ABC_CONST(0x0101000101010100), ABC_CONST(0x0101000100010100), ABC_CONST(0x0101000001010100), ABC_CONST(0x0101000000010100), ABC_CONST(0x0100010101010100), ABC_CONST(0x0100010100010100), ABC_CONST(0x0100010001010100), ABC_CONST(0x0100010000010100), ABC_CONST(0x0100000101010100), ABC_CONST(0x0100000100010100), ABC_CONST(0x0100000001010100), ABC_CONST(0x0100000000010100), ABC_CONST(0x0101010101010100), ABC_CONST(0x0101010100010100), ABC_CONST(0x0101010001010100), ABC_CONST(0x0101010000010100), ABC_CONST(0x0101000101010100), ABC_CONST(0x0101000100010100), ABC_CONST(0x0101000001010100), ABC_CONST(0x0101000000010100), ABC_CONST(0x0100010101010100), ABC_CONST(0x0100010100010100), ABC_CONST(0x0100010001010100), ABC_CONST(0x0100010000010100), ABC_CONST(0x0100000101010100), ABC_CONST(0x0100000100010100), ABC_CONST(0x0100000001010100), ABC_CONST(0x0100000000010100) }, + { ABC_CONST(0x0202020202020201), ABC_CONST(0x0202020200020201), ABC_CONST(0x0202020002020201), ABC_CONST(0x0202020000020201), ABC_CONST(0x0202000202020201), ABC_CONST(0x0202000200020201), ABC_CONST(0x0202000002020201), ABC_CONST(0x0202000000020201), ABC_CONST(0x0200020202020201), ABC_CONST(0x0200020200020201), ABC_CONST(0x0200020002020201), ABC_CONST(0x0200020000020201), ABC_CONST(0x0200000202020201), ABC_CONST(0x0200000200020201), ABC_CONST(0x0200000002020201), ABC_CONST(0x0200000000020201), ABC_CONST(0x0202020202020201), ABC_CONST(0x0202020200020201), ABC_CONST(0x0202020002020201), ABC_CONST(0x0202020000020201), ABC_CONST(0x0202000202020201), ABC_CONST(0x0202000200020201), ABC_CONST(0x0202000002020201), ABC_CONST(0x0202000000020201), ABC_CONST(0x0200020202020201), ABC_CONST(0x0200020200020201), ABC_CONST(0x0200020002020201), ABC_CONST(0x0200020000020201), ABC_CONST(0x0200000202020201), ABC_CONST(0x0200000200020201), ABC_CONST(0x0200000002020201), ABC_CONST(0x0200000000020201) }, + { ABC_CONST(0x0101010101010001), ABC_CONST(0x0101010100010001), ABC_CONST(0x0101010001010001), ABC_CONST(0x0101010000010001), ABC_CONST(0x0101000101010001), ABC_CONST(0x0101000100010001), ABC_CONST(0x0101000001010001), ABC_CONST(0x0101000000010001), ABC_CONST(0x0100010101010001), ABC_CONST(0x0100010100010001), ABC_CONST(0x0100010001010001), ABC_CONST(0x0100010000010001), ABC_CONST(0x0100000101010001), ABC_CONST(0x0100000100010001), ABC_CONST(0x0100000001010001), ABC_CONST(0x0100000000010001), ABC_CONST(0x0101010101010001), ABC_CONST(0x0101010100010001), ABC_CONST(0x0101010001010001), ABC_CONST(0x0101010000010001), ABC_CONST(0x0101000101010001), ABC_CONST(0x0101000100010001), ABC_CONST(0x0101000001010001), ABC_CONST(0x0101000000010001), ABC_CONST(0x0100010101010001), ABC_CONST(0x0100010100010001), ABC_CONST(0x0100010001010001), ABC_CONST(0x0100010000010001), ABC_CONST(0x0100000101010001), ABC_CONST(0x0100000100010001), ABC_CONST(0x0100000001010001), ABC_CONST(0x0100000000010001) }, + { ABC_CONST(0x0202020202020102), ABC_CONST(0x0202020200020102), ABC_CONST(0x0202020002020102), ABC_CONST(0x0202020000020102), ABC_CONST(0x0202000202020102), ABC_CONST(0x0202000200020102), ABC_CONST(0x0202000002020102), ABC_CONST(0x0202000000020102), ABC_CONST(0x0200020202020102), ABC_CONST(0x0200020200020102), ABC_CONST(0x0200020002020102), ABC_CONST(0x0200020000020102), ABC_CONST(0x0200000202020102), ABC_CONST(0x0200000200020102), ABC_CONST(0x0200000002020102), ABC_CONST(0x0200000000020102), ABC_CONST(0x0202020202020102), ABC_CONST(0x0202020200020102), ABC_CONST(0x0202020002020102), ABC_CONST(0x0202020000020102), ABC_CONST(0x0202000202020102), ABC_CONST(0x0202000200020102), ABC_CONST(0x0202000002020102), ABC_CONST(0x0202000000020102), ABC_CONST(0x0200020202020102), ABC_CONST(0x0200020200020102), ABC_CONST(0x0200020002020102), ABC_CONST(0x0200020000020102), ABC_CONST(0x0200000202020102), ABC_CONST(0x0200000200020102), ABC_CONST(0x0200000002020102), ABC_CONST(0x0200000000020102) }, + { ABC_CONST(0x0202020202020101), ABC_CONST(0x0202020200020101), ABC_CONST(0x0202020002020101), ABC_CONST(0x0202020000020101), ABC_CONST(0x0202000202020101), ABC_CONST(0x0202000200020101), ABC_CONST(0x0202000002020101), ABC_CONST(0x0202000000020101), ABC_CONST(0x0200020202020101), ABC_CONST(0x0200020200020101), ABC_CONST(0x0200020002020101), ABC_CONST(0x0200020000020101), ABC_CONST(0x0200000202020101), ABC_CONST(0x0200000200020101), ABC_CONST(0x0200000002020101), ABC_CONST(0x0200000000020101), ABC_CONST(0x0202020202020101), ABC_CONST(0x0202020200020101), ABC_CONST(0x0202020002020101), ABC_CONST(0x0202020000020101), ABC_CONST(0x0202000202020101), ABC_CONST(0x0202000200020101), ABC_CONST(0x0202000002020101), ABC_CONST(0x0202000000020101), ABC_CONST(0x0200020202020101), ABC_CONST(0x0200020200020101), ABC_CONST(0x0200020002020101), ABC_CONST(0x0200020000020101), ABC_CONST(0x0200000202020101), ABC_CONST(0x0200000200020101), ABC_CONST(0x0200000002020101), ABC_CONST(0x0200000000020101) }, + { ABC_CONST(0x0303030303030202), ABC_CONST(0x0303030300030202), ABC_CONST(0x0303030003030202), ABC_CONST(0x0303030000030202), ABC_CONST(0x0303000303030202), ABC_CONST(0x0303000300030202), ABC_CONST(0x0303000003030202), ABC_CONST(0x0303000000030202), ABC_CONST(0x0300030303030202), ABC_CONST(0x0300030300030202), ABC_CONST(0x0300030003030202), ABC_CONST(0x0300030000030202), ABC_CONST(0x0300000303030202), ABC_CONST(0x0300000300030202), ABC_CONST(0x0300000003030202), ABC_CONST(0x0300000000030202), ABC_CONST(0x0303030303030202), ABC_CONST(0x0303030300030202), ABC_CONST(0x0303030003030202), ABC_CONST(0x0303030000030202), ABC_CONST(0x0303000303030202), ABC_CONST(0x0303000300030202), ABC_CONST(0x0303000003030202), ABC_CONST(0x0303000000030202), ABC_CONST(0x0300030303030202), ABC_CONST(0x0300030300030202), ABC_CONST(0x0300030003030202), ABC_CONST(0x0300030000030202), ABC_CONST(0x0300000303030202), ABC_CONST(0x0300000300030202), ABC_CONST(0x0300000003030202), ABC_CONST(0x0300000000030202) }, + { ABC_CONST(0x0101010101010000), ABC_CONST(0x0101010100010000), ABC_CONST(0x0101010001010000), ABC_CONST(0x0101010000010000), ABC_CONST(0x0101000101010000), ABC_CONST(0x0101000100010000), ABC_CONST(0x0101000001010000), ABC_CONST(0x0101000000010000), ABC_CONST(0x0100010101010000), ABC_CONST(0x0100010100010000), ABC_CONST(0x0100010001010000), ABC_CONST(0x0100010000010000), ABC_CONST(0x0100000101010000), ABC_CONST(0x0100000100010000), ABC_CONST(0x0100000001010000), ABC_CONST(0x0100000000010000), ABC_CONST(0x0101010101010000), ABC_CONST(0x0101010100010000), ABC_CONST(0x0101010001010000), ABC_CONST(0x0101010000010000), ABC_CONST(0x0101000101010000), ABC_CONST(0x0101000100010000), ABC_CONST(0x0101000001010000), ABC_CONST(0x0101000000010000), ABC_CONST(0x0100010101010000), ABC_CONST(0x0100010100010000), ABC_CONST(0x0100010001010000), ABC_CONST(0x0100010000010000), ABC_CONST(0x0100000101010000), ABC_CONST(0x0100000100010000), ABC_CONST(0x0100000001010000), ABC_CONST(0x0100000000010000) }, + { ABC_CONST(0x0202020202020101), ABC_CONST(0x0202020200020101), ABC_CONST(0x0202020002020101), ABC_CONST(0x0202020000020101), ABC_CONST(0x0202000202020101), ABC_CONST(0x0202000200020101), ABC_CONST(0x0202000002020101), ABC_CONST(0x0202000000020101), ABC_CONST(0x0200020202020101), ABC_CONST(0x0200020200020101), ABC_CONST(0x0200020002020101), ABC_CONST(0x0200020000020101), ABC_CONST(0x0200000202020101), ABC_CONST(0x0200000200020101), ABC_CONST(0x0200000002020101), ABC_CONST(0x0200000000020101), ABC_CONST(0x0202020202020101), ABC_CONST(0x0202020200020101), ABC_CONST(0x0202020002020101), ABC_CONST(0x0202020000020101), ABC_CONST(0x0202000202020101), ABC_CONST(0x0202000200020101), ABC_CONST(0x0202000002020101), ABC_CONST(0x0202000000020101), ABC_CONST(0x0200020202020101), ABC_CONST(0x0200020200020101), ABC_CONST(0x0200020002020101), ABC_CONST(0x0200020000020101), ABC_CONST(0x0200000202020101), ABC_CONST(0x0200000200020101), ABC_CONST(0x0200000002020101), ABC_CONST(0x0200000000020101) }, + { ABC_CONST(0x0202020202020100), ABC_CONST(0x0202020200020100), ABC_CONST(0x0202020002020100), ABC_CONST(0x0202020000020100), ABC_CONST(0x0202000202020100), ABC_CONST(0x0202000200020100), ABC_CONST(0x0202000002020100), ABC_CONST(0x0202000000020100), ABC_CONST(0x0200020202020100), ABC_CONST(0x0200020200020100), ABC_CONST(0x0200020002020100), ABC_CONST(0x0200020000020100), ABC_CONST(0x0200000202020100), ABC_CONST(0x0200000200020100), ABC_CONST(0x0200000002020100), ABC_CONST(0x0200000000020100), ABC_CONST(0x0202020202020100), ABC_CONST(0x0202020200020100), ABC_CONST(0x0202020002020100), ABC_CONST(0x0202020000020100), ABC_CONST(0x0202000202020100), ABC_CONST(0x0202000200020100), ABC_CONST(0x0202000002020100), ABC_CONST(0x0202000000020100), ABC_CONST(0x0200020202020100), ABC_CONST(0x0200020200020100), ABC_CONST(0x0200020002020100), ABC_CONST(0x0200020000020100), ABC_CONST(0x0200000202020100), ABC_CONST(0x0200000200020100), ABC_CONST(0x0200000002020100), ABC_CONST(0x0200000000020100) }, + { ABC_CONST(0x0303030303030201), ABC_CONST(0x0303030300030201), ABC_CONST(0x0303030003030201), ABC_CONST(0x0303030000030201), ABC_CONST(0x0303000303030201), ABC_CONST(0x0303000300030201), ABC_CONST(0x0303000003030201), ABC_CONST(0x0303000000030201), ABC_CONST(0x0300030303030201), ABC_CONST(0x0300030300030201), ABC_CONST(0x0300030003030201), ABC_CONST(0x0300030000030201), ABC_CONST(0x0300000303030201), ABC_CONST(0x0300000300030201), ABC_CONST(0x0300000003030201), ABC_CONST(0x0300000000030201), ABC_CONST(0x0303030303030201), ABC_CONST(0x0303030300030201), ABC_CONST(0x0303030003030201), ABC_CONST(0x0303030000030201), ABC_CONST(0x0303000303030201), ABC_CONST(0x0303000300030201), ABC_CONST(0x0303000003030201), ABC_CONST(0x0303000000030201), ABC_CONST(0x0300030303030201), ABC_CONST(0x0300030300030201), ABC_CONST(0x0300030003030201), ABC_CONST(0x0300030000030201), ABC_CONST(0x0300000303030201), ABC_CONST(0x0300000300030201), ABC_CONST(0x0300000003030201), ABC_CONST(0x0300000000030201) }, + { ABC_CONST(0x0202020202020001), ABC_CONST(0x0202020200020001), ABC_CONST(0x0202020002020001), ABC_CONST(0x0202020000020001), ABC_CONST(0x0202000202020001), ABC_CONST(0x0202000200020001), ABC_CONST(0x0202000002020001), ABC_CONST(0x0202000000020001), ABC_CONST(0x0200020202020001), ABC_CONST(0x0200020200020001), ABC_CONST(0x0200020002020001), ABC_CONST(0x0200020000020001), ABC_CONST(0x0200000202020001), ABC_CONST(0x0200000200020001), ABC_CONST(0x0200000002020001), ABC_CONST(0x0200000000020001), ABC_CONST(0x0202020202020001), ABC_CONST(0x0202020200020001), ABC_CONST(0x0202020002020001), ABC_CONST(0x0202020000020001), ABC_CONST(0x0202000202020001), ABC_CONST(0x0202000200020001), ABC_CONST(0x0202000002020001), ABC_CONST(0x0202000000020001), ABC_CONST(0x0200020202020001), ABC_CONST(0x0200020200020001), ABC_CONST(0x0200020002020001), ABC_CONST(0x0200020000020001), ABC_CONST(0x0200000202020001), ABC_CONST(0x0200000200020001), ABC_CONST(0x0200000002020001), ABC_CONST(0x0200000000020001) }, + { ABC_CONST(0x0303030303030102), ABC_CONST(0x0303030300030102), ABC_CONST(0x0303030003030102), ABC_CONST(0x0303030000030102), ABC_CONST(0x0303000303030102), ABC_CONST(0x0303000300030102), ABC_CONST(0x0303000003030102), ABC_CONST(0x0303000000030102), ABC_CONST(0x0300030303030102), ABC_CONST(0x0300030300030102), ABC_CONST(0x0300030003030102), ABC_CONST(0x0300030000030102), ABC_CONST(0x0300000303030102), ABC_CONST(0x0300000300030102), ABC_CONST(0x0300000003030102), ABC_CONST(0x0300000000030102), ABC_CONST(0x0303030303030102), ABC_CONST(0x0303030300030102), ABC_CONST(0x0303030003030102), ABC_CONST(0x0303030000030102), ABC_CONST(0x0303000303030102), ABC_CONST(0x0303000300030102), ABC_CONST(0x0303000003030102), ABC_CONST(0x0303000000030102), ABC_CONST(0x0300030303030102), ABC_CONST(0x0300030300030102), ABC_CONST(0x0300030003030102), ABC_CONST(0x0300030000030102), ABC_CONST(0x0300000303030102), ABC_CONST(0x0300000300030102), ABC_CONST(0x0300000003030102), ABC_CONST(0x0300000000030102) }, + { ABC_CONST(0x0303030303030101), ABC_CONST(0x0303030300030101), ABC_CONST(0x0303030003030101), ABC_CONST(0x0303030000030101), ABC_CONST(0x0303000303030101), ABC_CONST(0x0303000300030101), ABC_CONST(0x0303000003030101), ABC_CONST(0x0303000000030101), ABC_CONST(0x0300030303030101), ABC_CONST(0x0300030300030101), ABC_CONST(0x0300030003030101), ABC_CONST(0x0300030000030101), ABC_CONST(0x0300000303030101), ABC_CONST(0x0300000300030101), ABC_CONST(0x0300000003030101), ABC_CONST(0x0300000000030101), ABC_CONST(0x0303030303030101), ABC_CONST(0x0303030300030101), ABC_CONST(0x0303030003030101), ABC_CONST(0x0303030000030101), ABC_CONST(0x0303000303030101), ABC_CONST(0x0303000300030101), ABC_CONST(0x0303000003030101), ABC_CONST(0x0303000000030101), ABC_CONST(0x0300030303030101), ABC_CONST(0x0300030300030101), ABC_CONST(0x0300030003030101), ABC_CONST(0x0300030000030101), ABC_CONST(0x0300000303030101), ABC_CONST(0x0300000300030101), ABC_CONST(0x0300000003030101), ABC_CONST(0x0300000000030101) }, + { ABC_CONST(0x0404040404040202), ABC_CONST(0x0404040400040202), ABC_CONST(0x0404040004040202), ABC_CONST(0x0404040000040202), ABC_CONST(0x0404000404040202), ABC_CONST(0x0404000400040202), ABC_CONST(0x0404000004040202), ABC_CONST(0x0404000000040202), ABC_CONST(0x0400040404040202), ABC_CONST(0x0400040400040202), ABC_CONST(0x0400040004040202), ABC_CONST(0x0400040000040202), ABC_CONST(0x0400000404040202), ABC_CONST(0x0400000400040202), ABC_CONST(0x0400000004040202), ABC_CONST(0x0400000000040202), ABC_CONST(0x0404040404040202), ABC_CONST(0x0404040400040202), ABC_CONST(0x0404040004040202), ABC_CONST(0x0404040000040202), ABC_CONST(0x0404000404040202), ABC_CONST(0x0404000400040202), ABC_CONST(0x0404000004040202), ABC_CONST(0x0404000000040202), ABC_CONST(0x0400040404040202), ABC_CONST(0x0400040400040202), ABC_CONST(0x0400040004040202), ABC_CONST(0x0400040000040202), ABC_CONST(0x0400000404040202), ABC_CONST(0x0400000400040202), ABC_CONST(0x0400000004040202), ABC_CONST(0x0400000000040202) }, + { ABC_CONST(0x0101010101000101), ABC_CONST(0x0101010100000101), ABC_CONST(0x0101010001000101), ABC_CONST(0x0101010000000101), ABC_CONST(0x0101000101000101), ABC_CONST(0x0101000100000101), ABC_CONST(0x0101000001000101), ABC_CONST(0x0101000000000101), ABC_CONST(0x0100010101000101), ABC_CONST(0x0100010100000101), ABC_CONST(0x0100010001000101), ABC_CONST(0x0100010000000101), ABC_CONST(0x0100000101000101), ABC_CONST(0x0100000100000101), ABC_CONST(0x0100000001000101), ABC_CONST(0x0100000000000101), ABC_CONST(0x0101010101000101), ABC_CONST(0x0101010100000101), ABC_CONST(0x0101010001000101), ABC_CONST(0x0101010000000101), ABC_CONST(0x0101000101000101), ABC_CONST(0x0101000100000101), ABC_CONST(0x0101000001000101), ABC_CONST(0x0101000000000101), ABC_CONST(0x0100010101000101), ABC_CONST(0x0100010100000101), ABC_CONST(0x0100010001000101), ABC_CONST(0x0100010000000101), ABC_CONST(0x0100000101000101), ABC_CONST(0x0100000100000101), ABC_CONST(0x0100000001000101), ABC_CONST(0x0100000000000101) }, + { ABC_CONST(0x0202020202010202), ABC_CONST(0x0202020200010202), ABC_CONST(0x0202020002010202), ABC_CONST(0x0202020000010202), ABC_CONST(0x0202000202010202), ABC_CONST(0x0202000200010202), ABC_CONST(0x0202000002010202), ABC_CONST(0x0202000000010202), ABC_CONST(0x0200020202010202), ABC_CONST(0x0200020200010202), ABC_CONST(0x0200020002010202), ABC_CONST(0x0200020000010202), ABC_CONST(0x0200000202010202), ABC_CONST(0x0200000200010202), ABC_CONST(0x0200000002010202), ABC_CONST(0x0200000000010202), ABC_CONST(0x0202020202010202), ABC_CONST(0x0202020200010202), ABC_CONST(0x0202020002010202), ABC_CONST(0x0202020000010202), ABC_CONST(0x0202000202010202), ABC_CONST(0x0202000200010202), ABC_CONST(0x0202000002010202), ABC_CONST(0x0202000000010202), ABC_CONST(0x0200020202010202), ABC_CONST(0x0200020200010202), ABC_CONST(0x0200020002010202), ABC_CONST(0x0200020000010202), ABC_CONST(0x0200000202010202), ABC_CONST(0x0200000200010202), ABC_CONST(0x0200000002010202), ABC_CONST(0x0200000000010202) }, + { ABC_CONST(0x0202020202010201), ABC_CONST(0x0202020200010201), ABC_CONST(0x0202020002010201), ABC_CONST(0x0202020000010201), ABC_CONST(0x0202000202010201), ABC_CONST(0x0202000200010201), ABC_CONST(0x0202000002010201), ABC_CONST(0x0202000000010201), ABC_CONST(0x0200020202010201), ABC_CONST(0x0200020200010201), ABC_CONST(0x0200020002010201), ABC_CONST(0x0200020000010201), ABC_CONST(0x0200000202010201), ABC_CONST(0x0200000200010201), ABC_CONST(0x0200000002010201), ABC_CONST(0x0200000000010201), ABC_CONST(0x0202020202010201), ABC_CONST(0x0202020200010201), ABC_CONST(0x0202020002010201), ABC_CONST(0x0202020000010201), ABC_CONST(0x0202000202010201), ABC_CONST(0x0202000200010201), ABC_CONST(0x0202000002010201), ABC_CONST(0x0202000000010201), ABC_CONST(0x0200020202010201), ABC_CONST(0x0200020200010201), ABC_CONST(0x0200020002010201), ABC_CONST(0x0200020000010201), ABC_CONST(0x0200000202010201), ABC_CONST(0x0200000200010201), ABC_CONST(0x0200000002010201), ABC_CONST(0x0200000000010201) }, + { ABC_CONST(0x0303030303020302), ABC_CONST(0x0303030300020302), ABC_CONST(0x0303030003020302), ABC_CONST(0x0303030000020302), ABC_CONST(0x0303000303020302), ABC_CONST(0x0303000300020302), ABC_CONST(0x0303000003020302), ABC_CONST(0x0303000000020302), ABC_CONST(0x0300030303020302), ABC_CONST(0x0300030300020302), ABC_CONST(0x0300030003020302), ABC_CONST(0x0300030000020302), ABC_CONST(0x0300000303020302), ABC_CONST(0x0300000300020302), ABC_CONST(0x0300000003020302), ABC_CONST(0x0300000000020302), ABC_CONST(0x0303030303020302), ABC_CONST(0x0303030300020302), ABC_CONST(0x0303030003020302), ABC_CONST(0x0303030000020302), ABC_CONST(0x0303000303020302), ABC_CONST(0x0303000300020302), ABC_CONST(0x0303000003020302), ABC_CONST(0x0303000000020302), ABC_CONST(0x0300030303020302), ABC_CONST(0x0300030300020302), ABC_CONST(0x0300030003020302), ABC_CONST(0x0300030000020302), ABC_CONST(0x0300000303020302), ABC_CONST(0x0300000300020302), ABC_CONST(0x0300000003020302), ABC_CONST(0x0300000000020302) }, + { ABC_CONST(0x0202020202010102), ABC_CONST(0x0202020200010102), ABC_CONST(0x0202020002010102), ABC_CONST(0x0202020000010102), ABC_CONST(0x0202000202010102), ABC_CONST(0x0202000200010102), ABC_CONST(0x0202000002010102), ABC_CONST(0x0202000000010102), ABC_CONST(0x0200020202010102), ABC_CONST(0x0200020200010102), ABC_CONST(0x0200020002010102), ABC_CONST(0x0200020000010102), ABC_CONST(0x0200000202010102), ABC_CONST(0x0200000200010102), ABC_CONST(0x0200000002010102), ABC_CONST(0x0200000000010102), ABC_CONST(0x0202020202010102), ABC_CONST(0x0202020200010102), ABC_CONST(0x0202020002010102), ABC_CONST(0x0202020000010102), ABC_CONST(0x0202000202010102), ABC_CONST(0x0202000200010102), ABC_CONST(0x0202000002010102), ABC_CONST(0x0202000000010102), ABC_CONST(0x0200020202010102), ABC_CONST(0x0200020200010102), ABC_CONST(0x0200020002010102), ABC_CONST(0x0200020000010102), ABC_CONST(0x0200000202010102), ABC_CONST(0x0200000200010102), ABC_CONST(0x0200000002010102), ABC_CONST(0x0200000000010102) }, + { ABC_CONST(0x0303030303020203), ABC_CONST(0x0303030300020203), ABC_CONST(0x0303030003020203), ABC_CONST(0x0303030000020203), ABC_CONST(0x0303000303020203), ABC_CONST(0x0303000300020203), ABC_CONST(0x0303000003020203), ABC_CONST(0x0303000000020203), ABC_CONST(0x0300030303020203), ABC_CONST(0x0300030300020203), ABC_CONST(0x0300030003020203), ABC_CONST(0x0300030000020203), ABC_CONST(0x0300000303020203), ABC_CONST(0x0300000300020203), ABC_CONST(0x0300000003020203), ABC_CONST(0x0300000000020203), ABC_CONST(0x0303030303020203), ABC_CONST(0x0303030300020203), ABC_CONST(0x0303030003020203), ABC_CONST(0x0303030000020203), ABC_CONST(0x0303000303020203), ABC_CONST(0x0303000300020203), ABC_CONST(0x0303000003020203), ABC_CONST(0x0303000000020203), ABC_CONST(0x0300030303020203), ABC_CONST(0x0300030300020203), ABC_CONST(0x0300030003020203), ABC_CONST(0x0300030000020203), ABC_CONST(0x0300000303020203), ABC_CONST(0x0300000300020203), ABC_CONST(0x0300000003020203), ABC_CONST(0x0300000000020203) }, + { ABC_CONST(0x0303030303020202), ABC_CONST(0x0303030300020202), ABC_CONST(0x0303030003020202), ABC_CONST(0x0303030000020202), ABC_CONST(0x0303000303020202), ABC_CONST(0x0303000300020202), ABC_CONST(0x0303000003020202), ABC_CONST(0x0303000000020202), ABC_CONST(0x0300030303020202), ABC_CONST(0x0300030300020202), ABC_CONST(0x0300030003020202), ABC_CONST(0x0300030000020202), ABC_CONST(0x0300000303020202), ABC_CONST(0x0300000300020202), ABC_CONST(0x0300000003020202), ABC_CONST(0x0300000000020202), ABC_CONST(0x0303030303020202), ABC_CONST(0x0303030300020202), ABC_CONST(0x0303030003020202), ABC_CONST(0x0303030000020202), ABC_CONST(0x0303000303020202), ABC_CONST(0x0303000300020202), ABC_CONST(0x0303000003020202), ABC_CONST(0x0303000000020202), ABC_CONST(0x0300030303020202), ABC_CONST(0x0300030300020202), ABC_CONST(0x0300030003020202), ABC_CONST(0x0300030000020202), ABC_CONST(0x0300000303020202), ABC_CONST(0x0300000300020202), ABC_CONST(0x0300000003020202), ABC_CONST(0x0300000000020202) }, + { ABC_CONST(0x0404040404030303), ABC_CONST(0x0404040400030303), ABC_CONST(0x0404040004030303), ABC_CONST(0x0404040000030303), ABC_CONST(0x0404000404030303), ABC_CONST(0x0404000400030303), ABC_CONST(0x0404000004030303), ABC_CONST(0x0404000000030303), ABC_CONST(0x0400040404030303), ABC_CONST(0x0400040400030303), ABC_CONST(0x0400040004030303), ABC_CONST(0x0400040000030303), ABC_CONST(0x0400000404030303), ABC_CONST(0x0400000400030303), ABC_CONST(0x0400000004030303), ABC_CONST(0x0400000000030303), ABC_CONST(0x0404040404030303), ABC_CONST(0x0404040400030303), ABC_CONST(0x0404040004030303), ABC_CONST(0x0404040000030303), ABC_CONST(0x0404000404030303), ABC_CONST(0x0404000400030303), ABC_CONST(0x0404000004030303), ABC_CONST(0x0404000000030303), ABC_CONST(0x0400040404030303), ABC_CONST(0x0400040400030303), ABC_CONST(0x0400040004030303), ABC_CONST(0x0400040000030303), ABC_CONST(0x0400000404030303), ABC_CONST(0x0400000400030303), ABC_CONST(0x0400000004030303), ABC_CONST(0x0400000000030303) }, + { ABC_CONST(0x0202020202010101), ABC_CONST(0x0202020200010101), ABC_CONST(0x0202020002010101), ABC_CONST(0x0202020000010101), ABC_CONST(0x0202000202010101), ABC_CONST(0x0202000200010101), ABC_CONST(0x0202000002010101), ABC_CONST(0x0202000000010101), ABC_CONST(0x0200020202010101), ABC_CONST(0x0200020200010101), ABC_CONST(0x0200020002010101), ABC_CONST(0x0200020000010101), ABC_CONST(0x0200000202010101), ABC_CONST(0x0200000200010101), ABC_CONST(0x0200000002010101), ABC_CONST(0x0200000000010101), ABC_CONST(0x0202020202010101), ABC_CONST(0x0202020200010101), ABC_CONST(0x0202020002010101), ABC_CONST(0x0202020000010101), ABC_CONST(0x0202000202010101), ABC_CONST(0x0202000200010101), ABC_CONST(0x0202000002010101), ABC_CONST(0x0202000000010101), ABC_CONST(0x0200020202010101), ABC_CONST(0x0200020200010101), ABC_CONST(0x0200020002010101), ABC_CONST(0x0200020000010101), ABC_CONST(0x0200000202010101), ABC_CONST(0x0200000200010101), ABC_CONST(0x0200000002010101), ABC_CONST(0x0200000000010101) }, + { ABC_CONST(0x0303030303020202), ABC_CONST(0x0303030300020202), ABC_CONST(0x0303030003020202), ABC_CONST(0x0303030000020202), ABC_CONST(0x0303000303020202), ABC_CONST(0x0303000300020202), ABC_CONST(0x0303000003020202), ABC_CONST(0x0303000000020202), ABC_CONST(0x0300030303020202), ABC_CONST(0x0300030300020202), ABC_CONST(0x0300030003020202), ABC_CONST(0x0300030000020202), ABC_CONST(0x0300000303020202), ABC_CONST(0x0300000300020202), ABC_CONST(0x0300000003020202), ABC_CONST(0x0300000000020202), ABC_CONST(0x0303030303020202), ABC_CONST(0x0303030300020202), ABC_CONST(0x0303030003020202), ABC_CONST(0x0303030000020202), ABC_CONST(0x0303000303020202), ABC_CONST(0x0303000300020202), ABC_CONST(0x0303000003020202), ABC_CONST(0x0303000000020202), ABC_CONST(0x0300030303020202), ABC_CONST(0x0300030300020202), ABC_CONST(0x0300030003020202), ABC_CONST(0x0300030000020202), ABC_CONST(0x0300000303020202), ABC_CONST(0x0300000300020202), ABC_CONST(0x0300000003020202), ABC_CONST(0x0300000000020202) }, + { ABC_CONST(0x0303030303020201), ABC_CONST(0x0303030300020201), ABC_CONST(0x0303030003020201), ABC_CONST(0x0303030000020201), ABC_CONST(0x0303000303020201), ABC_CONST(0x0303000300020201), ABC_CONST(0x0303000003020201), ABC_CONST(0x0303000000020201), ABC_CONST(0x0300030303020201), ABC_CONST(0x0300030300020201), ABC_CONST(0x0300030003020201), ABC_CONST(0x0300030000020201), ABC_CONST(0x0300000303020201), ABC_CONST(0x0300000300020201), ABC_CONST(0x0300000003020201), ABC_CONST(0x0300000000020201), ABC_CONST(0x0303030303020201), ABC_CONST(0x0303030300020201), ABC_CONST(0x0303030003020201), ABC_CONST(0x0303030000020201), ABC_CONST(0x0303000303020201), ABC_CONST(0x0303000300020201), ABC_CONST(0x0303000003020201), ABC_CONST(0x0303000000020201), ABC_CONST(0x0300030303020201), ABC_CONST(0x0300030300020201), ABC_CONST(0x0300030003020201), ABC_CONST(0x0300030000020201), ABC_CONST(0x0300000303020201), ABC_CONST(0x0300000300020201), ABC_CONST(0x0300000003020201), ABC_CONST(0x0300000000020201) }, + { ABC_CONST(0x0404040404030302), ABC_CONST(0x0404040400030302), ABC_CONST(0x0404040004030302), ABC_CONST(0x0404040000030302), ABC_CONST(0x0404000404030302), ABC_CONST(0x0404000400030302), ABC_CONST(0x0404000004030302), ABC_CONST(0x0404000000030302), ABC_CONST(0x0400040404030302), ABC_CONST(0x0400040400030302), ABC_CONST(0x0400040004030302), ABC_CONST(0x0400040000030302), ABC_CONST(0x0400000404030302), ABC_CONST(0x0400000400030302), ABC_CONST(0x0400000004030302), ABC_CONST(0x0400000000030302), ABC_CONST(0x0404040404030302), ABC_CONST(0x0404040400030302), ABC_CONST(0x0404040004030302), ABC_CONST(0x0404040000030302), ABC_CONST(0x0404000404030302), ABC_CONST(0x0404000400030302), ABC_CONST(0x0404000004030302), ABC_CONST(0x0404000000030302), ABC_CONST(0x0400040404030302), ABC_CONST(0x0400040400030302), ABC_CONST(0x0400040004030302), ABC_CONST(0x0400040000030302), ABC_CONST(0x0400000404030302), ABC_CONST(0x0400000400030302), ABC_CONST(0x0400000004030302), ABC_CONST(0x0400000000030302) }, + { ABC_CONST(0x0303030303020102), ABC_CONST(0x0303030300020102), ABC_CONST(0x0303030003020102), ABC_CONST(0x0303030000020102), ABC_CONST(0x0303000303020102), ABC_CONST(0x0303000300020102), ABC_CONST(0x0303000003020102), ABC_CONST(0x0303000000020102), ABC_CONST(0x0300030303020102), ABC_CONST(0x0300030300020102), ABC_CONST(0x0300030003020102), ABC_CONST(0x0300030000020102), ABC_CONST(0x0300000303020102), ABC_CONST(0x0300000300020102), ABC_CONST(0x0300000003020102), ABC_CONST(0x0300000000020102), ABC_CONST(0x0303030303020102), ABC_CONST(0x0303030300020102), ABC_CONST(0x0303030003020102), ABC_CONST(0x0303030000020102), ABC_CONST(0x0303000303020102), ABC_CONST(0x0303000300020102), ABC_CONST(0x0303000003020102), ABC_CONST(0x0303000000020102), ABC_CONST(0x0300030303020102), ABC_CONST(0x0300030300020102), ABC_CONST(0x0300030003020102), ABC_CONST(0x0300030000020102), ABC_CONST(0x0300000303020102), ABC_CONST(0x0300000300020102), ABC_CONST(0x0300000003020102), ABC_CONST(0x0300000000020102) }, + { ABC_CONST(0x0404040404030203), ABC_CONST(0x0404040400030203), ABC_CONST(0x0404040004030203), ABC_CONST(0x0404040000030203), ABC_CONST(0x0404000404030203), ABC_CONST(0x0404000400030203), ABC_CONST(0x0404000004030203), ABC_CONST(0x0404000000030203), ABC_CONST(0x0400040404030203), ABC_CONST(0x0400040400030203), ABC_CONST(0x0400040004030203), ABC_CONST(0x0400040000030203), ABC_CONST(0x0400000404030203), ABC_CONST(0x0400000400030203), ABC_CONST(0x0400000004030203), ABC_CONST(0x0400000000030203), ABC_CONST(0x0404040404030203), ABC_CONST(0x0404040400030203), ABC_CONST(0x0404040004030203), ABC_CONST(0x0404040000030203), ABC_CONST(0x0404000404030203), ABC_CONST(0x0404000400030203), ABC_CONST(0x0404000004030203), ABC_CONST(0x0404000000030203), ABC_CONST(0x0400040404030203), ABC_CONST(0x0400040400030203), ABC_CONST(0x0400040004030203), ABC_CONST(0x0400040000030203), ABC_CONST(0x0400000404030203), ABC_CONST(0x0400000400030203), ABC_CONST(0x0400000004030203), ABC_CONST(0x0400000000030203) }, + { ABC_CONST(0x0404040404030202), ABC_CONST(0x0404040400030202), ABC_CONST(0x0404040004030202), ABC_CONST(0x0404040000030202), ABC_CONST(0x0404000404030202), ABC_CONST(0x0404000400030202), ABC_CONST(0x0404000004030202), ABC_CONST(0x0404000000030202), ABC_CONST(0x0400040404030202), ABC_CONST(0x0400040400030202), ABC_CONST(0x0400040004030202), ABC_CONST(0x0400040000030202), ABC_CONST(0x0400000404030202), ABC_CONST(0x0400000400030202), ABC_CONST(0x0400000004030202), ABC_CONST(0x0400000000030202), ABC_CONST(0x0404040404030202), ABC_CONST(0x0404040400030202), ABC_CONST(0x0404040004030202), ABC_CONST(0x0404040000030202), ABC_CONST(0x0404000404030202), ABC_CONST(0x0404000400030202), ABC_CONST(0x0404000004030202), ABC_CONST(0x0404000000030202), ABC_CONST(0x0400040404030202), ABC_CONST(0x0400040400030202), ABC_CONST(0x0400040004030202), ABC_CONST(0x0400040000030202), ABC_CONST(0x0400000404030202), ABC_CONST(0x0400000400030202), ABC_CONST(0x0400000004030202), ABC_CONST(0x0400000000030202) }, + { ABC_CONST(0x0505050505040303), ABC_CONST(0x0505050500040303), ABC_CONST(0x0505050005040303), ABC_CONST(0x0505050000040303), ABC_CONST(0x0505000505040303), ABC_CONST(0x0505000500040303), ABC_CONST(0x0505000005040303), ABC_CONST(0x0505000000040303), ABC_CONST(0x0500050505040303), ABC_CONST(0x0500050500040303), ABC_CONST(0x0500050005040303), ABC_CONST(0x0500050000040303), ABC_CONST(0x0500000505040303), ABC_CONST(0x0500000500040303), ABC_CONST(0x0500000005040303), ABC_CONST(0x0500000000040303), ABC_CONST(0x0505050505040303), ABC_CONST(0x0505050500040303), ABC_CONST(0x0505050005040303), ABC_CONST(0x0505050000040303), ABC_CONST(0x0505000505040303), ABC_CONST(0x0505000500040303), ABC_CONST(0x0505000005040303), ABC_CONST(0x0505000000040303), ABC_CONST(0x0500050505040303), ABC_CONST(0x0500050500040303), ABC_CONST(0x0500050005040303), ABC_CONST(0x0500050000040303), ABC_CONST(0x0500000505040303), ABC_CONST(0x0500000500040303), ABC_CONST(0x0500000005040303), ABC_CONST(0x0500000000040303) }, + { ABC_CONST(0x0101010101000100), ABC_CONST(0x0101010100000100), ABC_CONST(0x0101010001000100), ABC_CONST(0x0101010000000100), ABC_CONST(0x0101000101000100), ABC_CONST(0x0101000100000100), ABC_CONST(0x0101000001000100), ABC_CONST(0x0101000000000100), ABC_CONST(0x0100010101000100), ABC_CONST(0x0100010100000100), ABC_CONST(0x0100010001000100), ABC_CONST(0x0100010000000100), ABC_CONST(0x0100000101000100), ABC_CONST(0x0100000100000100), ABC_CONST(0x0100000001000100), ABC_CONST(0x0100000000000100), ABC_CONST(0x0101010101000100), ABC_CONST(0x0101010100000100), ABC_CONST(0x0101010001000100), ABC_CONST(0x0101010000000100), ABC_CONST(0x0101000101000100), ABC_CONST(0x0101000100000100), ABC_CONST(0x0101000001000100), ABC_CONST(0x0101000000000100), ABC_CONST(0x0100010101000100), ABC_CONST(0x0100010100000100), ABC_CONST(0x0100010001000100), ABC_CONST(0x0100010000000100), ABC_CONST(0x0100000101000100), ABC_CONST(0x0100000100000100), ABC_CONST(0x0100000001000100), ABC_CONST(0x0100000000000100) }, + { ABC_CONST(0x0202020202010201), ABC_CONST(0x0202020200010201), ABC_CONST(0x0202020002010201), ABC_CONST(0x0202020000010201), ABC_CONST(0x0202000202010201), ABC_CONST(0x0202000200010201), ABC_CONST(0x0202000002010201), ABC_CONST(0x0202000000010201), ABC_CONST(0x0200020202010201), ABC_CONST(0x0200020200010201), ABC_CONST(0x0200020002010201), ABC_CONST(0x0200020000010201), ABC_CONST(0x0200000202010201), ABC_CONST(0x0200000200010201), ABC_CONST(0x0200000002010201), ABC_CONST(0x0200000000010201), ABC_CONST(0x0202020202010201), ABC_CONST(0x0202020200010201), ABC_CONST(0x0202020002010201), ABC_CONST(0x0202020000010201), ABC_CONST(0x0202000202010201), ABC_CONST(0x0202000200010201), ABC_CONST(0x0202000002010201), ABC_CONST(0x0202000000010201), ABC_CONST(0x0200020202010201), ABC_CONST(0x0200020200010201), ABC_CONST(0x0200020002010201), ABC_CONST(0x0200020000010201), ABC_CONST(0x0200000202010201), ABC_CONST(0x0200000200010201), ABC_CONST(0x0200000002010201), ABC_CONST(0x0200000000010201) }, + { ABC_CONST(0x0202020202010200), ABC_CONST(0x0202020200010200), ABC_CONST(0x0202020002010200), ABC_CONST(0x0202020000010200), ABC_CONST(0x0202000202010200), ABC_CONST(0x0202000200010200), ABC_CONST(0x0202000002010200), ABC_CONST(0x0202000000010200), ABC_CONST(0x0200020202010200), ABC_CONST(0x0200020200010200), ABC_CONST(0x0200020002010200), ABC_CONST(0x0200020000010200), ABC_CONST(0x0200000202010200), ABC_CONST(0x0200000200010200), ABC_CONST(0x0200000002010200), ABC_CONST(0x0200000000010200), ABC_CONST(0x0202020202010200), ABC_CONST(0x0202020200010200), ABC_CONST(0x0202020002010200), ABC_CONST(0x0202020000010200), ABC_CONST(0x0202000202010200), ABC_CONST(0x0202000200010200), ABC_CONST(0x0202000002010200), ABC_CONST(0x0202000000010200), ABC_CONST(0x0200020202010200), ABC_CONST(0x0200020200010200), ABC_CONST(0x0200020002010200), ABC_CONST(0x0200020000010200), ABC_CONST(0x0200000202010200), ABC_CONST(0x0200000200010200), ABC_CONST(0x0200000002010200), ABC_CONST(0x0200000000010200) }, + { ABC_CONST(0x0303030303020301), ABC_CONST(0x0303030300020301), ABC_CONST(0x0303030003020301), ABC_CONST(0x0303030000020301), ABC_CONST(0x0303000303020301), ABC_CONST(0x0303000300020301), ABC_CONST(0x0303000003020301), ABC_CONST(0x0303000000020301), ABC_CONST(0x0300030303020301), ABC_CONST(0x0300030300020301), ABC_CONST(0x0300030003020301), ABC_CONST(0x0300030000020301), ABC_CONST(0x0300000303020301), ABC_CONST(0x0300000300020301), ABC_CONST(0x0300000003020301), ABC_CONST(0x0300000000020301), ABC_CONST(0x0303030303020301), ABC_CONST(0x0303030300020301), ABC_CONST(0x0303030003020301), ABC_CONST(0x0303030000020301), ABC_CONST(0x0303000303020301), ABC_CONST(0x0303000300020301), ABC_CONST(0x0303000003020301), ABC_CONST(0x0303000000020301), ABC_CONST(0x0300030303020301), ABC_CONST(0x0300030300020301), ABC_CONST(0x0300030003020301), ABC_CONST(0x0300030000020301), ABC_CONST(0x0300000303020301), ABC_CONST(0x0300000300020301), ABC_CONST(0x0300000003020301), ABC_CONST(0x0300000000020301) }, + { ABC_CONST(0x0202020202010101), ABC_CONST(0x0202020200010101), ABC_CONST(0x0202020002010101), ABC_CONST(0x0202020000010101), ABC_CONST(0x0202000202010101), ABC_CONST(0x0202000200010101), ABC_CONST(0x0202000002010101), ABC_CONST(0x0202000000010101), ABC_CONST(0x0200020202010101), ABC_CONST(0x0200020200010101), ABC_CONST(0x0200020002010101), ABC_CONST(0x0200020000010101), ABC_CONST(0x0200000202010101), ABC_CONST(0x0200000200010101), ABC_CONST(0x0200000002010101), ABC_CONST(0x0200000000010101), ABC_CONST(0x0202020202010101), ABC_CONST(0x0202020200010101), ABC_CONST(0x0202020002010101), ABC_CONST(0x0202020000010101), ABC_CONST(0x0202000202010101), ABC_CONST(0x0202000200010101), ABC_CONST(0x0202000002010101), ABC_CONST(0x0202000000010101), ABC_CONST(0x0200020202010101), ABC_CONST(0x0200020200010101), ABC_CONST(0x0200020002010101), ABC_CONST(0x0200020000010101), ABC_CONST(0x0200000202010101), ABC_CONST(0x0200000200010101), ABC_CONST(0x0200000002010101), ABC_CONST(0x0200000000010101) }, + { ABC_CONST(0x0303030303020202), ABC_CONST(0x0303030300020202), ABC_CONST(0x0303030003020202), ABC_CONST(0x0303030000020202), ABC_CONST(0x0303000303020202), ABC_CONST(0x0303000300020202), ABC_CONST(0x0303000003020202), ABC_CONST(0x0303000000020202), ABC_CONST(0x0300030303020202), ABC_CONST(0x0300030300020202), ABC_CONST(0x0300030003020202), ABC_CONST(0x0300030000020202), ABC_CONST(0x0300000303020202), ABC_CONST(0x0300000300020202), ABC_CONST(0x0300000003020202), ABC_CONST(0x0300000000020202), ABC_CONST(0x0303030303020202), ABC_CONST(0x0303030300020202), ABC_CONST(0x0303030003020202), ABC_CONST(0x0303030000020202), ABC_CONST(0x0303000303020202), ABC_CONST(0x0303000300020202), ABC_CONST(0x0303000003020202), ABC_CONST(0x0303000000020202), ABC_CONST(0x0300030303020202), ABC_CONST(0x0300030300020202), ABC_CONST(0x0300030003020202), ABC_CONST(0x0300030000020202), ABC_CONST(0x0300000303020202), ABC_CONST(0x0300000300020202), ABC_CONST(0x0300000003020202), ABC_CONST(0x0300000000020202) }, + { ABC_CONST(0x0303030303020201), ABC_CONST(0x0303030300020201), ABC_CONST(0x0303030003020201), ABC_CONST(0x0303030000020201), ABC_CONST(0x0303000303020201), ABC_CONST(0x0303000300020201), ABC_CONST(0x0303000003020201), ABC_CONST(0x0303000000020201), ABC_CONST(0x0300030303020201), ABC_CONST(0x0300030300020201), ABC_CONST(0x0300030003020201), ABC_CONST(0x0300030000020201), ABC_CONST(0x0300000303020201), ABC_CONST(0x0300000300020201), ABC_CONST(0x0300000003020201), ABC_CONST(0x0300000000020201), ABC_CONST(0x0303030303020201), ABC_CONST(0x0303030300020201), ABC_CONST(0x0303030003020201), ABC_CONST(0x0303030000020201), ABC_CONST(0x0303000303020201), ABC_CONST(0x0303000300020201), ABC_CONST(0x0303000003020201), ABC_CONST(0x0303000000020201), ABC_CONST(0x0300030303020201), ABC_CONST(0x0300030300020201), ABC_CONST(0x0300030003020201), ABC_CONST(0x0300030000020201), ABC_CONST(0x0300000303020201), ABC_CONST(0x0300000300020201), ABC_CONST(0x0300000003020201), ABC_CONST(0x0300000000020201) }, + { ABC_CONST(0x0404040404030302), ABC_CONST(0x0404040400030302), ABC_CONST(0x0404040004030302), ABC_CONST(0x0404040000030302), ABC_CONST(0x0404000404030302), ABC_CONST(0x0404000400030302), ABC_CONST(0x0404000004030302), ABC_CONST(0x0404000000030302), ABC_CONST(0x0400040404030302), ABC_CONST(0x0400040400030302), ABC_CONST(0x0400040004030302), ABC_CONST(0x0400040000030302), ABC_CONST(0x0400000404030302), ABC_CONST(0x0400000400030302), ABC_CONST(0x0400000004030302), ABC_CONST(0x0400000000030302), ABC_CONST(0x0404040404030302), ABC_CONST(0x0404040400030302), ABC_CONST(0x0404040004030302), ABC_CONST(0x0404040000030302), ABC_CONST(0x0404000404030302), ABC_CONST(0x0404000400030302), ABC_CONST(0x0404000004030302), ABC_CONST(0x0404000000030302), ABC_CONST(0x0400040404030302), ABC_CONST(0x0400040400030302), ABC_CONST(0x0400040004030302), ABC_CONST(0x0400040000030302), ABC_CONST(0x0400000404030302), ABC_CONST(0x0400000400030302), ABC_CONST(0x0400000004030302), ABC_CONST(0x0400000000030302) }, + { ABC_CONST(0x0202020202010100), ABC_CONST(0x0202020200010100), ABC_CONST(0x0202020002010100), ABC_CONST(0x0202020000010100), ABC_CONST(0x0202000202010100), ABC_CONST(0x0202000200010100), ABC_CONST(0x0202000002010100), ABC_CONST(0x0202000000010100), ABC_CONST(0x0200020202010100), ABC_CONST(0x0200020200010100), ABC_CONST(0x0200020002010100), ABC_CONST(0x0200020000010100), ABC_CONST(0x0200000202010100), ABC_CONST(0x0200000200010100), ABC_CONST(0x0200000002010100), ABC_CONST(0x0200000000010100), ABC_CONST(0x0202020202010100), ABC_CONST(0x0202020200010100), ABC_CONST(0x0202020002010100), ABC_CONST(0x0202020000010100), ABC_CONST(0x0202000202010100), ABC_CONST(0x0202000200010100), ABC_CONST(0x0202000002010100), ABC_CONST(0x0202000000010100), ABC_CONST(0x0200020202010100), ABC_CONST(0x0200020200010100), ABC_CONST(0x0200020002010100), ABC_CONST(0x0200020000010100), ABC_CONST(0x0200000202010100), ABC_CONST(0x0200000200010100), ABC_CONST(0x0200000002010100), ABC_CONST(0x0200000000010100) }, + { ABC_CONST(0x0303030303020201), ABC_CONST(0x0303030300020201), ABC_CONST(0x0303030003020201), ABC_CONST(0x0303030000020201), ABC_CONST(0x0303000303020201), ABC_CONST(0x0303000300020201), ABC_CONST(0x0303000003020201), ABC_CONST(0x0303000000020201), ABC_CONST(0x0300030303020201), ABC_CONST(0x0300030300020201), ABC_CONST(0x0300030003020201), ABC_CONST(0x0300030000020201), ABC_CONST(0x0300000303020201), ABC_CONST(0x0300000300020201), ABC_CONST(0x0300000003020201), ABC_CONST(0x0300000000020201), ABC_CONST(0x0303030303020201), ABC_CONST(0x0303030300020201), ABC_CONST(0x0303030003020201), ABC_CONST(0x0303030000020201), ABC_CONST(0x0303000303020201), ABC_CONST(0x0303000300020201), ABC_CONST(0x0303000003020201), ABC_CONST(0x0303000000020201), ABC_CONST(0x0300030303020201), ABC_CONST(0x0300030300020201), ABC_CONST(0x0300030003020201), ABC_CONST(0x0300030000020201), ABC_CONST(0x0300000303020201), ABC_CONST(0x0300000300020201), ABC_CONST(0x0300000003020201), ABC_CONST(0x0300000000020201) }, + { ABC_CONST(0x0303030303020200), ABC_CONST(0x0303030300020200), ABC_CONST(0x0303030003020200), ABC_CONST(0x0303030000020200), ABC_CONST(0x0303000303020200), ABC_CONST(0x0303000300020200), ABC_CONST(0x0303000003020200), ABC_CONST(0x0303000000020200), ABC_CONST(0x0300030303020200), ABC_CONST(0x0300030300020200), ABC_CONST(0x0300030003020200), ABC_CONST(0x0300030000020200), ABC_CONST(0x0300000303020200), ABC_CONST(0x0300000300020200), ABC_CONST(0x0300000003020200), ABC_CONST(0x0300000000020200), ABC_CONST(0x0303030303020200), ABC_CONST(0x0303030300020200), ABC_CONST(0x0303030003020200), ABC_CONST(0x0303030000020200), ABC_CONST(0x0303000303020200), ABC_CONST(0x0303000300020200), ABC_CONST(0x0303000003020200), ABC_CONST(0x0303000000020200), ABC_CONST(0x0300030303020200), ABC_CONST(0x0300030300020200), ABC_CONST(0x0300030003020200), ABC_CONST(0x0300030000020200), ABC_CONST(0x0300000303020200), ABC_CONST(0x0300000300020200), ABC_CONST(0x0300000003020200), ABC_CONST(0x0300000000020200) }, + { ABC_CONST(0x0404040404030301), ABC_CONST(0x0404040400030301), ABC_CONST(0x0404040004030301), ABC_CONST(0x0404040000030301), ABC_CONST(0x0404000404030301), ABC_CONST(0x0404000400030301), ABC_CONST(0x0404000004030301), ABC_CONST(0x0404000000030301), ABC_CONST(0x0400040404030301), ABC_CONST(0x0400040400030301), ABC_CONST(0x0400040004030301), ABC_CONST(0x0400040000030301), ABC_CONST(0x0400000404030301), ABC_CONST(0x0400000400030301), ABC_CONST(0x0400000004030301), ABC_CONST(0x0400000000030301), ABC_CONST(0x0404040404030301), ABC_CONST(0x0404040400030301), ABC_CONST(0x0404040004030301), ABC_CONST(0x0404040000030301), ABC_CONST(0x0404000404030301), ABC_CONST(0x0404000400030301), ABC_CONST(0x0404000004030301), ABC_CONST(0x0404000000030301), ABC_CONST(0x0400040404030301), ABC_CONST(0x0400040400030301), ABC_CONST(0x0400040004030301), ABC_CONST(0x0400040000030301), ABC_CONST(0x0400000404030301), ABC_CONST(0x0400000400030301), ABC_CONST(0x0400000004030301), ABC_CONST(0x0400000000030301) }, + { ABC_CONST(0x0303030303020101), ABC_CONST(0x0303030300020101), ABC_CONST(0x0303030003020101), ABC_CONST(0x0303030000020101), ABC_CONST(0x0303000303020101), ABC_CONST(0x0303000300020101), ABC_CONST(0x0303000003020101), ABC_CONST(0x0303000000020101), ABC_CONST(0x0300030303020101), ABC_CONST(0x0300030300020101), ABC_CONST(0x0300030003020101), ABC_CONST(0x0300030000020101), ABC_CONST(0x0300000303020101), ABC_CONST(0x0300000300020101), ABC_CONST(0x0300000003020101), ABC_CONST(0x0300000000020101), ABC_CONST(0x0303030303020101), ABC_CONST(0x0303030300020101), ABC_CONST(0x0303030003020101), ABC_CONST(0x0303030000020101), ABC_CONST(0x0303000303020101), ABC_CONST(0x0303000300020101), ABC_CONST(0x0303000003020101), ABC_CONST(0x0303000000020101), ABC_CONST(0x0300030303020101), ABC_CONST(0x0300030300020101), ABC_CONST(0x0300030003020101), ABC_CONST(0x0300030000020101), ABC_CONST(0x0300000303020101), ABC_CONST(0x0300000300020101), ABC_CONST(0x0300000003020101), ABC_CONST(0x0300000000020101) }, + { ABC_CONST(0x0404040404030202), ABC_CONST(0x0404040400030202), ABC_CONST(0x0404040004030202), ABC_CONST(0x0404040000030202), ABC_CONST(0x0404000404030202), ABC_CONST(0x0404000400030202), ABC_CONST(0x0404000004030202), ABC_CONST(0x0404000000030202), ABC_CONST(0x0400040404030202), ABC_CONST(0x0400040400030202), ABC_CONST(0x0400040004030202), ABC_CONST(0x0400040000030202), ABC_CONST(0x0400000404030202), ABC_CONST(0x0400000400030202), ABC_CONST(0x0400000004030202), ABC_CONST(0x0400000000030202), ABC_CONST(0x0404040404030202), ABC_CONST(0x0404040400030202), ABC_CONST(0x0404040004030202), ABC_CONST(0x0404040000030202), ABC_CONST(0x0404000404030202), ABC_CONST(0x0404000400030202), ABC_CONST(0x0404000004030202), ABC_CONST(0x0404000000030202), ABC_CONST(0x0400040404030202), ABC_CONST(0x0400040400030202), ABC_CONST(0x0400040004030202), ABC_CONST(0x0400040000030202), ABC_CONST(0x0400000404030202), ABC_CONST(0x0400000400030202), ABC_CONST(0x0400000004030202), ABC_CONST(0x0400000000030202) }, + { ABC_CONST(0x0404040404030201), ABC_CONST(0x0404040400030201), ABC_CONST(0x0404040004030201), ABC_CONST(0x0404040000030201), ABC_CONST(0x0404000404030201), ABC_CONST(0x0404000400030201), ABC_CONST(0x0404000004030201), ABC_CONST(0x0404000000030201), ABC_CONST(0x0400040404030201), ABC_CONST(0x0400040400030201), ABC_CONST(0x0400040004030201), ABC_CONST(0x0400040000030201), ABC_CONST(0x0400000404030201), ABC_CONST(0x0400000400030201), ABC_CONST(0x0400000004030201), ABC_CONST(0x0400000000030201), ABC_CONST(0x0404040404030201), ABC_CONST(0x0404040400030201), ABC_CONST(0x0404040004030201), ABC_CONST(0x0404040000030201), ABC_CONST(0x0404000404030201), ABC_CONST(0x0404000400030201), ABC_CONST(0x0404000004030201), ABC_CONST(0x0404000000030201), ABC_CONST(0x0400040404030201), ABC_CONST(0x0400040400030201), ABC_CONST(0x0400040004030201), ABC_CONST(0x0400040000030201), ABC_CONST(0x0400000404030201), ABC_CONST(0x0400000400030201), ABC_CONST(0x0400000004030201), ABC_CONST(0x0400000000030201) }, + { ABC_CONST(0x0505050505040302), ABC_CONST(0x0505050500040302), ABC_CONST(0x0505050005040302), ABC_CONST(0x0505050000040302), ABC_CONST(0x0505000505040302), ABC_CONST(0x0505000500040302), ABC_CONST(0x0505000005040302), ABC_CONST(0x0505000000040302), ABC_CONST(0x0500050505040302), ABC_CONST(0x0500050500040302), ABC_CONST(0x0500050005040302), ABC_CONST(0x0500050000040302), ABC_CONST(0x0500000505040302), ABC_CONST(0x0500000500040302), ABC_CONST(0x0500000005040302), ABC_CONST(0x0500000000040302), ABC_CONST(0x0505050505040302), ABC_CONST(0x0505050500040302), ABC_CONST(0x0505050005040302), ABC_CONST(0x0505050000040302), ABC_CONST(0x0505000505040302), ABC_CONST(0x0505000500040302), ABC_CONST(0x0505000005040302), ABC_CONST(0x0505000000040302), ABC_CONST(0x0500050505040302), ABC_CONST(0x0500050500040302), ABC_CONST(0x0500050005040302), ABC_CONST(0x0500050000040302), ABC_CONST(0x0500000505040302), ABC_CONST(0x0500000500040302), ABC_CONST(0x0500000005040302), ABC_CONST(0x0500000000040302) }, + { ABC_CONST(0x0202020202000201), ABC_CONST(0x0202020200000201), ABC_CONST(0x0202020002000201), ABC_CONST(0x0202020000000201), ABC_CONST(0x0202000202000201), ABC_CONST(0x0202000200000201), ABC_CONST(0x0202000002000201), ABC_CONST(0x0202000000000201), ABC_CONST(0x0200020202000201), ABC_CONST(0x0200020200000201), ABC_CONST(0x0200020002000201), ABC_CONST(0x0200020000000201), ABC_CONST(0x0200000202000201), ABC_CONST(0x0200000200000201), ABC_CONST(0x0200000002000201), ABC_CONST(0x0200000000000201), ABC_CONST(0x0202020202000201), ABC_CONST(0x0202020200000201), ABC_CONST(0x0202020002000201), ABC_CONST(0x0202020000000201), ABC_CONST(0x0202000202000201), ABC_CONST(0x0202000200000201), ABC_CONST(0x0202000002000201), ABC_CONST(0x0202000000000201), ABC_CONST(0x0200020202000201), ABC_CONST(0x0200020200000201), ABC_CONST(0x0200020002000201), ABC_CONST(0x0200020000000201), ABC_CONST(0x0200000202000201), ABC_CONST(0x0200000200000201), ABC_CONST(0x0200000002000201), ABC_CONST(0x0200000000000201) }, + { ABC_CONST(0x0303030303010302), ABC_CONST(0x0303030300010302), ABC_CONST(0x0303030003010302), ABC_CONST(0x0303030000010302), ABC_CONST(0x0303000303010302), ABC_CONST(0x0303000300010302), ABC_CONST(0x0303000003010302), ABC_CONST(0x0303000000010302), ABC_CONST(0x0300030303010302), ABC_CONST(0x0300030300010302), ABC_CONST(0x0300030003010302), ABC_CONST(0x0300030000010302), ABC_CONST(0x0300000303010302), ABC_CONST(0x0300000300010302), ABC_CONST(0x0300000003010302), ABC_CONST(0x0300000000010302), ABC_CONST(0x0303030303010302), ABC_CONST(0x0303030300010302), ABC_CONST(0x0303030003010302), ABC_CONST(0x0303030000010302), ABC_CONST(0x0303000303010302), ABC_CONST(0x0303000300010302), ABC_CONST(0x0303000003010302), ABC_CONST(0x0303000000010302), ABC_CONST(0x0300030303010302), ABC_CONST(0x0300030300010302), ABC_CONST(0x0300030003010302), ABC_CONST(0x0300030000010302), ABC_CONST(0x0300000303010302), ABC_CONST(0x0300000300010302), ABC_CONST(0x0300000003010302), ABC_CONST(0x0300000000010302) }, + { ABC_CONST(0x0303030303010301), ABC_CONST(0x0303030300010301), ABC_CONST(0x0303030003010301), ABC_CONST(0x0303030000010301), ABC_CONST(0x0303000303010301), ABC_CONST(0x0303000300010301), ABC_CONST(0x0303000003010301), ABC_CONST(0x0303000000010301), ABC_CONST(0x0300030303010301), ABC_CONST(0x0300030300010301), ABC_CONST(0x0300030003010301), ABC_CONST(0x0300030000010301), ABC_CONST(0x0300000303010301), ABC_CONST(0x0300000300010301), ABC_CONST(0x0300000003010301), ABC_CONST(0x0300000000010301), ABC_CONST(0x0303030303010301), ABC_CONST(0x0303030300010301), ABC_CONST(0x0303030003010301), ABC_CONST(0x0303030000010301), ABC_CONST(0x0303000303010301), ABC_CONST(0x0303000300010301), ABC_CONST(0x0303000003010301), ABC_CONST(0x0303000000010301), ABC_CONST(0x0300030303010301), ABC_CONST(0x0300030300010301), ABC_CONST(0x0300030003010301), ABC_CONST(0x0300030000010301), ABC_CONST(0x0300000303010301), ABC_CONST(0x0300000300010301), ABC_CONST(0x0300000003010301), ABC_CONST(0x0300000000010301) }, + { ABC_CONST(0x0404040404020402), ABC_CONST(0x0404040400020402), ABC_CONST(0x0404040004020402), ABC_CONST(0x0404040000020402), ABC_CONST(0x0404000404020402), ABC_CONST(0x0404000400020402), ABC_CONST(0x0404000004020402), ABC_CONST(0x0404000000020402), ABC_CONST(0x0400040404020402), ABC_CONST(0x0400040400020402), ABC_CONST(0x0400040004020402), ABC_CONST(0x0400040000020402), ABC_CONST(0x0400000404020402), ABC_CONST(0x0400000400020402), ABC_CONST(0x0400000004020402), ABC_CONST(0x0400000000020402), ABC_CONST(0x0404040404020402), ABC_CONST(0x0404040400020402), ABC_CONST(0x0404040004020402), ABC_CONST(0x0404040000020402), ABC_CONST(0x0404000404020402), ABC_CONST(0x0404000400020402), ABC_CONST(0x0404000004020402), ABC_CONST(0x0404000000020402), ABC_CONST(0x0400040404020402), ABC_CONST(0x0400040400020402), ABC_CONST(0x0400040004020402), ABC_CONST(0x0400040000020402), ABC_CONST(0x0400000404020402), ABC_CONST(0x0400000400020402), ABC_CONST(0x0400000004020402), ABC_CONST(0x0400000000020402) }, + { ABC_CONST(0x0303030303010202), ABC_CONST(0x0303030300010202), ABC_CONST(0x0303030003010202), ABC_CONST(0x0303030000010202), ABC_CONST(0x0303000303010202), ABC_CONST(0x0303000300010202), ABC_CONST(0x0303000003010202), ABC_CONST(0x0303000000010202), ABC_CONST(0x0300030303010202), ABC_CONST(0x0300030300010202), ABC_CONST(0x0300030003010202), ABC_CONST(0x0300030000010202), ABC_CONST(0x0300000303010202), ABC_CONST(0x0300000300010202), ABC_CONST(0x0300000003010202), ABC_CONST(0x0300000000010202), ABC_CONST(0x0303030303010202), ABC_CONST(0x0303030300010202), ABC_CONST(0x0303030003010202), ABC_CONST(0x0303030000010202), ABC_CONST(0x0303000303010202), ABC_CONST(0x0303000300010202), ABC_CONST(0x0303000003010202), ABC_CONST(0x0303000000010202), ABC_CONST(0x0300030303010202), ABC_CONST(0x0300030300010202), ABC_CONST(0x0300030003010202), ABC_CONST(0x0300030000010202), ABC_CONST(0x0300000303010202), ABC_CONST(0x0300000300010202), ABC_CONST(0x0300000003010202), ABC_CONST(0x0300000000010202) }, + { ABC_CONST(0x0404040404020303), ABC_CONST(0x0404040400020303), ABC_CONST(0x0404040004020303), ABC_CONST(0x0404040000020303), ABC_CONST(0x0404000404020303), ABC_CONST(0x0404000400020303), ABC_CONST(0x0404000004020303), ABC_CONST(0x0404000000020303), ABC_CONST(0x0400040404020303), ABC_CONST(0x0400040400020303), ABC_CONST(0x0400040004020303), ABC_CONST(0x0400040000020303), ABC_CONST(0x0400000404020303), ABC_CONST(0x0400000400020303), ABC_CONST(0x0400000004020303), ABC_CONST(0x0400000000020303), ABC_CONST(0x0404040404020303), ABC_CONST(0x0404040400020303), ABC_CONST(0x0404040004020303), ABC_CONST(0x0404040000020303), ABC_CONST(0x0404000404020303), ABC_CONST(0x0404000400020303), ABC_CONST(0x0404000004020303), ABC_CONST(0x0404000000020303), ABC_CONST(0x0400040404020303), ABC_CONST(0x0400040400020303), ABC_CONST(0x0400040004020303), ABC_CONST(0x0400040000020303), ABC_CONST(0x0400000404020303), ABC_CONST(0x0400000400020303), ABC_CONST(0x0400000004020303), ABC_CONST(0x0400000000020303) }, + { ABC_CONST(0x0404040404020302), ABC_CONST(0x0404040400020302), ABC_CONST(0x0404040004020302), ABC_CONST(0x0404040000020302), ABC_CONST(0x0404000404020302), ABC_CONST(0x0404000400020302), ABC_CONST(0x0404000004020302), ABC_CONST(0x0404000000020302), ABC_CONST(0x0400040404020302), ABC_CONST(0x0400040400020302), ABC_CONST(0x0400040004020302), ABC_CONST(0x0400040000020302), ABC_CONST(0x0400000404020302), ABC_CONST(0x0400000400020302), ABC_CONST(0x0400000004020302), ABC_CONST(0x0400000000020302), ABC_CONST(0x0404040404020302), ABC_CONST(0x0404040400020302), ABC_CONST(0x0404040004020302), ABC_CONST(0x0404040000020302), ABC_CONST(0x0404000404020302), ABC_CONST(0x0404000400020302), ABC_CONST(0x0404000004020302), ABC_CONST(0x0404000000020302), ABC_CONST(0x0400040404020302), ABC_CONST(0x0400040400020302), ABC_CONST(0x0400040004020302), ABC_CONST(0x0400040000020302), ABC_CONST(0x0400000404020302), ABC_CONST(0x0400000400020302), ABC_CONST(0x0400000004020302), ABC_CONST(0x0400000000020302) }, + { ABC_CONST(0x0505050505030403), ABC_CONST(0x0505050500030403), ABC_CONST(0x0505050005030403), ABC_CONST(0x0505050000030403), ABC_CONST(0x0505000505030403), ABC_CONST(0x0505000500030403), ABC_CONST(0x0505000005030403), ABC_CONST(0x0505000000030403), ABC_CONST(0x0500050505030403), ABC_CONST(0x0500050500030403), ABC_CONST(0x0500050005030403), ABC_CONST(0x0500050000030403), ABC_CONST(0x0500000505030403), ABC_CONST(0x0500000500030403), ABC_CONST(0x0500000005030403), ABC_CONST(0x0500000000030403), ABC_CONST(0x0505050505030403), ABC_CONST(0x0505050500030403), ABC_CONST(0x0505050005030403), ABC_CONST(0x0505050000030403), ABC_CONST(0x0505000505030403), ABC_CONST(0x0505000500030403), ABC_CONST(0x0505000005030403), ABC_CONST(0x0505000000030403), ABC_CONST(0x0500050505030403), ABC_CONST(0x0500050500030403), ABC_CONST(0x0500050005030403), ABC_CONST(0x0500050000030403), ABC_CONST(0x0500000505030403), ABC_CONST(0x0500000500030403), ABC_CONST(0x0500000005030403), ABC_CONST(0x0500000000030403) }, + { ABC_CONST(0x0303030303010201), ABC_CONST(0x0303030300010201), ABC_CONST(0x0303030003010201), ABC_CONST(0x0303030000010201), ABC_CONST(0x0303000303010201), ABC_CONST(0x0303000300010201), ABC_CONST(0x0303000003010201), ABC_CONST(0x0303000000010201), ABC_CONST(0x0300030303010201), ABC_CONST(0x0300030300010201), ABC_CONST(0x0300030003010201), ABC_CONST(0x0300030000010201), ABC_CONST(0x0300000303010201), ABC_CONST(0x0300000300010201), ABC_CONST(0x0300000003010201), ABC_CONST(0x0300000000010201), ABC_CONST(0x0303030303010201), ABC_CONST(0x0303030300010201), ABC_CONST(0x0303030003010201), ABC_CONST(0x0303030000010201), ABC_CONST(0x0303000303010201), ABC_CONST(0x0303000300010201), ABC_CONST(0x0303000003010201), ABC_CONST(0x0303000000010201), ABC_CONST(0x0300030303010201), ABC_CONST(0x0300030300010201), ABC_CONST(0x0300030003010201), ABC_CONST(0x0300030000010201), ABC_CONST(0x0300000303010201), ABC_CONST(0x0300000300010201), ABC_CONST(0x0300000003010201), ABC_CONST(0x0300000000010201) }, + { ABC_CONST(0x0404040404020302), ABC_CONST(0x0404040400020302), ABC_CONST(0x0404040004020302), ABC_CONST(0x0404040000020302), ABC_CONST(0x0404000404020302), ABC_CONST(0x0404000400020302), ABC_CONST(0x0404000004020302), ABC_CONST(0x0404000000020302), ABC_CONST(0x0400040404020302), ABC_CONST(0x0400040400020302), ABC_CONST(0x0400040004020302), ABC_CONST(0x0400040000020302), ABC_CONST(0x0400000404020302), ABC_CONST(0x0400000400020302), ABC_CONST(0x0400000004020302), ABC_CONST(0x0400000000020302), ABC_CONST(0x0404040404020302), ABC_CONST(0x0404040400020302), ABC_CONST(0x0404040004020302), ABC_CONST(0x0404040000020302), ABC_CONST(0x0404000404020302), ABC_CONST(0x0404000400020302), ABC_CONST(0x0404000004020302), ABC_CONST(0x0404000000020302), ABC_CONST(0x0400040404020302), ABC_CONST(0x0400040400020302), ABC_CONST(0x0400040004020302), ABC_CONST(0x0400040000020302), ABC_CONST(0x0400000404020302), ABC_CONST(0x0400000400020302), ABC_CONST(0x0400000004020302), ABC_CONST(0x0400000000020302) }, + { ABC_CONST(0x0404040404020301), ABC_CONST(0x0404040400020301), ABC_CONST(0x0404040004020301), ABC_CONST(0x0404040000020301), ABC_CONST(0x0404000404020301), ABC_CONST(0x0404000400020301), ABC_CONST(0x0404000004020301), ABC_CONST(0x0404000000020301), ABC_CONST(0x0400040404020301), ABC_CONST(0x0400040400020301), ABC_CONST(0x0400040004020301), ABC_CONST(0x0400040000020301), ABC_CONST(0x0400000404020301), ABC_CONST(0x0400000400020301), ABC_CONST(0x0400000004020301), ABC_CONST(0x0400000000020301), ABC_CONST(0x0404040404020301), ABC_CONST(0x0404040400020301), ABC_CONST(0x0404040004020301), ABC_CONST(0x0404040000020301), ABC_CONST(0x0404000404020301), ABC_CONST(0x0404000400020301), ABC_CONST(0x0404000004020301), ABC_CONST(0x0404000000020301), ABC_CONST(0x0400040404020301), ABC_CONST(0x0400040400020301), ABC_CONST(0x0400040004020301), ABC_CONST(0x0400040000020301), ABC_CONST(0x0400000404020301), ABC_CONST(0x0400000400020301), ABC_CONST(0x0400000004020301), ABC_CONST(0x0400000000020301) }, + { ABC_CONST(0x0505050505030402), ABC_CONST(0x0505050500030402), ABC_CONST(0x0505050005030402), ABC_CONST(0x0505050000030402), ABC_CONST(0x0505000505030402), ABC_CONST(0x0505000500030402), ABC_CONST(0x0505000005030402), ABC_CONST(0x0505000000030402), ABC_CONST(0x0500050505030402), ABC_CONST(0x0500050500030402), ABC_CONST(0x0500050005030402), ABC_CONST(0x0500050000030402), ABC_CONST(0x0500000505030402), ABC_CONST(0x0500000500030402), ABC_CONST(0x0500000005030402), ABC_CONST(0x0500000000030402), ABC_CONST(0x0505050505030402), ABC_CONST(0x0505050500030402), ABC_CONST(0x0505050005030402), ABC_CONST(0x0505050000030402), ABC_CONST(0x0505000505030402), ABC_CONST(0x0505000500030402), ABC_CONST(0x0505000005030402), ABC_CONST(0x0505000000030402), ABC_CONST(0x0500050505030402), ABC_CONST(0x0500050500030402), ABC_CONST(0x0500050005030402), ABC_CONST(0x0500050000030402), ABC_CONST(0x0500000505030402), ABC_CONST(0x0500000500030402), ABC_CONST(0x0500000005030402), ABC_CONST(0x0500000000030402) }, + { ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202), ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202) }, + { ABC_CONST(0x0505050505030303), ABC_CONST(0x0505050500030303), ABC_CONST(0x0505050005030303), ABC_CONST(0x0505050000030303), ABC_CONST(0x0505000505030303), ABC_CONST(0x0505000500030303), ABC_CONST(0x0505000005030303), ABC_CONST(0x0505000000030303), ABC_CONST(0x0500050505030303), ABC_CONST(0x0500050500030303), ABC_CONST(0x0500050005030303), ABC_CONST(0x0500050000030303), ABC_CONST(0x0500000505030303), ABC_CONST(0x0500000500030303), ABC_CONST(0x0500000005030303), ABC_CONST(0x0500000000030303), ABC_CONST(0x0505050505030303), ABC_CONST(0x0505050500030303), ABC_CONST(0x0505050005030303), ABC_CONST(0x0505050000030303), ABC_CONST(0x0505000505030303), ABC_CONST(0x0505000500030303), ABC_CONST(0x0505000005030303), ABC_CONST(0x0505000000030303), ABC_CONST(0x0500050505030303), ABC_CONST(0x0500050500030303), ABC_CONST(0x0500050005030303), ABC_CONST(0x0500050000030303), ABC_CONST(0x0500000505030303), ABC_CONST(0x0500000500030303), ABC_CONST(0x0500000005030303), ABC_CONST(0x0500000000030303) }, + { ABC_CONST(0x0505050505030302), ABC_CONST(0x0505050500030302), ABC_CONST(0x0505050005030302), ABC_CONST(0x0505050000030302), ABC_CONST(0x0505000505030302), ABC_CONST(0x0505000500030302), ABC_CONST(0x0505000005030302), ABC_CONST(0x0505000000030302), ABC_CONST(0x0500050505030302), ABC_CONST(0x0500050500030302), ABC_CONST(0x0500050005030302), ABC_CONST(0x0500050000030302), ABC_CONST(0x0500000505030302), ABC_CONST(0x0500000500030302), ABC_CONST(0x0500000005030302), ABC_CONST(0x0500000000030302), ABC_CONST(0x0505050505030302), ABC_CONST(0x0505050500030302), ABC_CONST(0x0505050005030302), ABC_CONST(0x0505050000030302), ABC_CONST(0x0505000505030302), ABC_CONST(0x0505000500030302), ABC_CONST(0x0505000005030302), ABC_CONST(0x0505000000030302), ABC_CONST(0x0500050505030302), ABC_CONST(0x0500050500030302), ABC_CONST(0x0500050005030302), ABC_CONST(0x0500050000030302), ABC_CONST(0x0500000505030302), ABC_CONST(0x0500000500030302), ABC_CONST(0x0500000005030302), ABC_CONST(0x0500000000030302) }, + { ABC_CONST(0x0606060606040403), ABC_CONST(0x0606060600040403), ABC_CONST(0x0606060006040403), ABC_CONST(0x0606060000040403), ABC_CONST(0x0606000606040403), ABC_CONST(0x0606000600040403), ABC_CONST(0x0606000006040403), ABC_CONST(0x0606000000040403), ABC_CONST(0x0600060606040403), ABC_CONST(0x0600060600040403), ABC_CONST(0x0600060006040403), ABC_CONST(0x0600060000040403), ABC_CONST(0x0600000606040403), ABC_CONST(0x0600000600040403), ABC_CONST(0x0600000006040403), ABC_CONST(0x0600000000040403), ABC_CONST(0x0606060606040403), ABC_CONST(0x0606060600040403), ABC_CONST(0x0606060006040403), ABC_CONST(0x0606060000040403), ABC_CONST(0x0606000606040403), ABC_CONST(0x0606000600040403), ABC_CONST(0x0606000006040403), ABC_CONST(0x0606000000040403), ABC_CONST(0x0600060606040403), ABC_CONST(0x0600060600040403), ABC_CONST(0x0600060006040403), ABC_CONST(0x0600060000040403), ABC_CONST(0x0600000606040403), ABC_CONST(0x0600000600040403), ABC_CONST(0x0600000006040403), ABC_CONST(0x0600000000040403) }, + { ABC_CONST(0x0101010101000001), ABC_CONST(0x0101010100000001), ABC_CONST(0x0101010001000001), ABC_CONST(0x0101010000000001), ABC_CONST(0x0101000101000001), ABC_CONST(0x0101000100000001), ABC_CONST(0x0101000001000001), ABC_CONST(0x0101000000000001), ABC_CONST(0x0100010101000001), ABC_CONST(0x0100010100000001), ABC_CONST(0x0100010001000001), ABC_CONST(0x0100010000000001), ABC_CONST(0x0100000101000001), ABC_CONST(0x0100000100000001), ABC_CONST(0x0100000001000001), ABC_CONST(0x0100000000000001), ABC_CONST(0x0101010101000001), ABC_CONST(0x0101010100000001), ABC_CONST(0x0101010001000001), ABC_CONST(0x0101010000000001), ABC_CONST(0x0101000101000001), ABC_CONST(0x0101000100000001), ABC_CONST(0x0101000001000001), ABC_CONST(0x0101000000000001), ABC_CONST(0x0100010101000001), ABC_CONST(0x0100010100000001), ABC_CONST(0x0100010001000001), ABC_CONST(0x0100010000000001), ABC_CONST(0x0100000101000001), ABC_CONST(0x0100000100000001), ABC_CONST(0x0100000001000001), ABC_CONST(0x0100000000000001) }, + { ABC_CONST(0x0202020202010102), ABC_CONST(0x0202020200010102), ABC_CONST(0x0202020002010102), ABC_CONST(0x0202020000010102), ABC_CONST(0x0202000202010102), ABC_CONST(0x0202000200010102), ABC_CONST(0x0202000002010102), ABC_CONST(0x0202000000010102), ABC_CONST(0x0200020202010102), ABC_CONST(0x0200020200010102), ABC_CONST(0x0200020002010102), ABC_CONST(0x0200020000010102), ABC_CONST(0x0200000202010102), ABC_CONST(0x0200000200010102), ABC_CONST(0x0200000002010102), ABC_CONST(0x0200000000010102), ABC_CONST(0x0202020202010102), ABC_CONST(0x0202020200010102), ABC_CONST(0x0202020002010102), ABC_CONST(0x0202020000010102), ABC_CONST(0x0202000202010102), ABC_CONST(0x0202000200010102), ABC_CONST(0x0202000002010102), ABC_CONST(0x0202000000010102), ABC_CONST(0x0200020202010102), ABC_CONST(0x0200020200010102), ABC_CONST(0x0200020002010102), ABC_CONST(0x0200020000010102), ABC_CONST(0x0200000202010102), ABC_CONST(0x0200000200010102), ABC_CONST(0x0200000002010102), ABC_CONST(0x0200000000010102) }, + { ABC_CONST(0x0202020202010101), ABC_CONST(0x0202020200010101), ABC_CONST(0x0202020002010101), ABC_CONST(0x0202020000010101), ABC_CONST(0x0202000202010101), ABC_CONST(0x0202000200010101), ABC_CONST(0x0202000002010101), ABC_CONST(0x0202000000010101), ABC_CONST(0x0200020202010101), ABC_CONST(0x0200020200010101), ABC_CONST(0x0200020002010101), ABC_CONST(0x0200020000010101), ABC_CONST(0x0200000202010101), ABC_CONST(0x0200000200010101), ABC_CONST(0x0200000002010101), ABC_CONST(0x0200000000010101), ABC_CONST(0x0202020202010101), ABC_CONST(0x0202020200010101), ABC_CONST(0x0202020002010101), ABC_CONST(0x0202020000010101), ABC_CONST(0x0202000202010101), ABC_CONST(0x0202000200010101), ABC_CONST(0x0202000002010101), ABC_CONST(0x0202000000010101), ABC_CONST(0x0200020202010101), ABC_CONST(0x0200020200010101), ABC_CONST(0x0200020002010101), ABC_CONST(0x0200020000010101), ABC_CONST(0x0200000202010101), ABC_CONST(0x0200000200010101), ABC_CONST(0x0200000002010101), ABC_CONST(0x0200000000010101) }, + { ABC_CONST(0x0303030303020202), ABC_CONST(0x0303030300020202), ABC_CONST(0x0303030003020202), ABC_CONST(0x0303030000020202), ABC_CONST(0x0303000303020202), ABC_CONST(0x0303000300020202), ABC_CONST(0x0303000003020202), ABC_CONST(0x0303000000020202), ABC_CONST(0x0300030303020202), ABC_CONST(0x0300030300020202), ABC_CONST(0x0300030003020202), ABC_CONST(0x0300030000020202), ABC_CONST(0x0300000303020202), ABC_CONST(0x0300000300020202), ABC_CONST(0x0300000003020202), ABC_CONST(0x0300000000020202), ABC_CONST(0x0303030303020202), ABC_CONST(0x0303030300020202), ABC_CONST(0x0303030003020202), ABC_CONST(0x0303030000020202), ABC_CONST(0x0303000303020202), ABC_CONST(0x0303000300020202), ABC_CONST(0x0303000003020202), ABC_CONST(0x0303000000020202), ABC_CONST(0x0300030303020202), ABC_CONST(0x0300030300020202), ABC_CONST(0x0300030003020202), ABC_CONST(0x0300030000020202), ABC_CONST(0x0300000303020202), ABC_CONST(0x0300000300020202), ABC_CONST(0x0300000003020202), ABC_CONST(0x0300000000020202) }, + { ABC_CONST(0x0202020202010002), ABC_CONST(0x0202020200010002), ABC_CONST(0x0202020002010002), ABC_CONST(0x0202020000010002), ABC_CONST(0x0202000202010002), ABC_CONST(0x0202000200010002), ABC_CONST(0x0202000002010002), ABC_CONST(0x0202000000010002), ABC_CONST(0x0200020202010002), ABC_CONST(0x0200020200010002), ABC_CONST(0x0200020002010002), ABC_CONST(0x0200020000010002), ABC_CONST(0x0200000202010002), ABC_CONST(0x0200000200010002), ABC_CONST(0x0200000002010002), ABC_CONST(0x0200000000010002), ABC_CONST(0x0202020202010002), ABC_CONST(0x0202020200010002), ABC_CONST(0x0202020002010002), ABC_CONST(0x0202020000010002), ABC_CONST(0x0202000202010002), ABC_CONST(0x0202000200010002), ABC_CONST(0x0202000002010002), ABC_CONST(0x0202000000010002), ABC_CONST(0x0200020202010002), ABC_CONST(0x0200020200010002), ABC_CONST(0x0200020002010002), ABC_CONST(0x0200020000010002), ABC_CONST(0x0200000202010002), ABC_CONST(0x0200000200010002), ABC_CONST(0x0200000002010002), ABC_CONST(0x0200000000010002) }, + { ABC_CONST(0x0303030303020103), ABC_CONST(0x0303030300020103), ABC_CONST(0x0303030003020103), ABC_CONST(0x0303030000020103), ABC_CONST(0x0303000303020103), ABC_CONST(0x0303000300020103), ABC_CONST(0x0303000003020103), ABC_CONST(0x0303000000020103), ABC_CONST(0x0300030303020103), ABC_CONST(0x0300030300020103), ABC_CONST(0x0300030003020103), ABC_CONST(0x0300030000020103), ABC_CONST(0x0300000303020103), ABC_CONST(0x0300000300020103), ABC_CONST(0x0300000003020103), ABC_CONST(0x0300000000020103), ABC_CONST(0x0303030303020103), ABC_CONST(0x0303030300020103), ABC_CONST(0x0303030003020103), ABC_CONST(0x0303030000020103), ABC_CONST(0x0303000303020103), ABC_CONST(0x0303000300020103), ABC_CONST(0x0303000003020103), ABC_CONST(0x0303000000020103), ABC_CONST(0x0300030303020103), ABC_CONST(0x0300030300020103), ABC_CONST(0x0300030003020103), ABC_CONST(0x0300030000020103), ABC_CONST(0x0300000303020103), ABC_CONST(0x0300000300020103), ABC_CONST(0x0300000003020103), ABC_CONST(0x0300000000020103) }, + { ABC_CONST(0x0303030303020102), ABC_CONST(0x0303030300020102), ABC_CONST(0x0303030003020102), ABC_CONST(0x0303030000020102), ABC_CONST(0x0303000303020102), ABC_CONST(0x0303000300020102), ABC_CONST(0x0303000003020102), ABC_CONST(0x0303000000020102), ABC_CONST(0x0300030303020102), ABC_CONST(0x0300030300020102), ABC_CONST(0x0300030003020102), ABC_CONST(0x0300030000020102), ABC_CONST(0x0300000303020102), ABC_CONST(0x0300000300020102), ABC_CONST(0x0300000003020102), ABC_CONST(0x0300000000020102), ABC_CONST(0x0303030303020102), ABC_CONST(0x0303030300020102), ABC_CONST(0x0303030003020102), ABC_CONST(0x0303030000020102), ABC_CONST(0x0303000303020102), ABC_CONST(0x0303000300020102), ABC_CONST(0x0303000003020102), ABC_CONST(0x0303000000020102), ABC_CONST(0x0300030303020102), ABC_CONST(0x0300030300020102), ABC_CONST(0x0300030003020102), ABC_CONST(0x0300030000020102), ABC_CONST(0x0300000303020102), ABC_CONST(0x0300000300020102), ABC_CONST(0x0300000003020102), ABC_CONST(0x0300000000020102) }, + { ABC_CONST(0x0404040404030203), ABC_CONST(0x0404040400030203), ABC_CONST(0x0404040004030203), ABC_CONST(0x0404040000030203), ABC_CONST(0x0404000404030203), ABC_CONST(0x0404000400030203), ABC_CONST(0x0404000004030203), ABC_CONST(0x0404000000030203), ABC_CONST(0x0400040404030203), ABC_CONST(0x0400040400030203), ABC_CONST(0x0400040004030203), ABC_CONST(0x0400040000030203), ABC_CONST(0x0400000404030203), ABC_CONST(0x0400000400030203), ABC_CONST(0x0400000004030203), ABC_CONST(0x0400000000030203), ABC_CONST(0x0404040404030203), ABC_CONST(0x0404040400030203), ABC_CONST(0x0404040004030203), ABC_CONST(0x0404040000030203), ABC_CONST(0x0404000404030203), ABC_CONST(0x0404000400030203), ABC_CONST(0x0404000004030203), ABC_CONST(0x0404000000030203), ABC_CONST(0x0400040404030203), ABC_CONST(0x0400040400030203), ABC_CONST(0x0400040004030203), ABC_CONST(0x0400040000030203), ABC_CONST(0x0400000404030203), ABC_CONST(0x0400000400030203), ABC_CONST(0x0400000004030203), ABC_CONST(0x0400000000030203) }, + { ABC_CONST(0x0202020202010001), ABC_CONST(0x0202020200010001), ABC_CONST(0x0202020002010001), ABC_CONST(0x0202020000010001), ABC_CONST(0x0202000202010001), ABC_CONST(0x0202000200010001), ABC_CONST(0x0202000002010001), ABC_CONST(0x0202000000010001), ABC_CONST(0x0200020202010001), ABC_CONST(0x0200020200010001), ABC_CONST(0x0200020002010001), ABC_CONST(0x0200020000010001), ABC_CONST(0x0200000202010001), ABC_CONST(0x0200000200010001), ABC_CONST(0x0200000002010001), ABC_CONST(0x0200000000010001), ABC_CONST(0x0202020202010001), ABC_CONST(0x0202020200010001), ABC_CONST(0x0202020002010001), ABC_CONST(0x0202020000010001), ABC_CONST(0x0202000202010001), ABC_CONST(0x0202000200010001), ABC_CONST(0x0202000002010001), ABC_CONST(0x0202000000010001), ABC_CONST(0x0200020202010001), ABC_CONST(0x0200020200010001), ABC_CONST(0x0200020002010001), ABC_CONST(0x0200020000010001), ABC_CONST(0x0200000202010001), ABC_CONST(0x0200000200010001), ABC_CONST(0x0200000002010001), ABC_CONST(0x0200000000010001) }, + { ABC_CONST(0x0303030303020102), ABC_CONST(0x0303030300020102), ABC_CONST(0x0303030003020102), ABC_CONST(0x0303030000020102), ABC_CONST(0x0303000303020102), ABC_CONST(0x0303000300020102), ABC_CONST(0x0303000003020102), ABC_CONST(0x0303000000020102), ABC_CONST(0x0300030303020102), ABC_CONST(0x0300030300020102), ABC_CONST(0x0300030003020102), ABC_CONST(0x0300030000020102), ABC_CONST(0x0300000303020102), ABC_CONST(0x0300000300020102), ABC_CONST(0x0300000003020102), ABC_CONST(0x0300000000020102), ABC_CONST(0x0303030303020102), ABC_CONST(0x0303030300020102), ABC_CONST(0x0303030003020102), ABC_CONST(0x0303030000020102), ABC_CONST(0x0303000303020102), ABC_CONST(0x0303000300020102), ABC_CONST(0x0303000003020102), ABC_CONST(0x0303000000020102), ABC_CONST(0x0300030303020102), ABC_CONST(0x0300030300020102), ABC_CONST(0x0300030003020102), ABC_CONST(0x0300030000020102), ABC_CONST(0x0300000303020102), ABC_CONST(0x0300000300020102), ABC_CONST(0x0300000003020102), ABC_CONST(0x0300000000020102) }, + { ABC_CONST(0x0303030303020101), ABC_CONST(0x0303030300020101), ABC_CONST(0x0303030003020101), ABC_CONST(0x0303030000020101), ABC_CONST(0x0303000303020101), ABC_CONST(0x0303000300020101), ABC_CONST(0x0303000003020101), ABC_CONST(0x0303000000020101), ABC_CONST(0x0300030303020101), ABC_CONST(0x0300030300020101), ABC_CONST(0x0300030003020101), ABC_CONST(0x0300030000020101), ABC_CONST(0x0300000303020101), ABC_CONST(0x0300000300020101), ABC_CONST(0x0300000003020101), ABC_CONST(0x0300000000020101), ABC_CONST(0x0303030303020101), ABC_CONST(0x0303030300020101), ABC_CONST(0x0303030003020101), ABC_CONST(0x0303030000020101), ABC_CONST(0x0303000303020101), ABC_CONST(0x0303000300020101), ABC_CONST(0x0303000003020101), ABC_CONST(0x0303000000020101), ABC_CONST(0x0300030303020101), ABC_CONST(0x0300030300020101), ABC_CONST(0x0300030003020101), ABC_CONST(0x0300030000020101), ABC_CONST(0x0300000303020101), ABC_CONST(0x0300000300020101), ABC_CONST(0x0300000003020101), ABC_CONST(0x0300000000020101) }, + { ABC_CONST(0x0404040404030202), ABC_CONST(0x0404040400030202), ABC_CONST(0x0404040004030202), ABC_CONST(0x0404040000030202), ABC_CONST(0x0404000404030202), ABC_CONST(0x0404000400030202), ABC_CONST(0x0404000004030202), ABC_CONST(0x0404000000030202), ABC_CONST(0x0400040404030202), ABC_CONST(0x0400040400030202), ABC_CONST(0x0400040004030202), ABC_CONST(0x0400040000030202), ABC_CONST(0x0400000404030202), ABC_CONST(0x0400000400030202), ABC_CONST(0x0400000004030202), ABC_CONST(0x0400000000030202), ABC_CONST(0x0404040404030202), ABC_CONST(0x0404040400030202), ABC_CONST(0x0404040004030202), ABC_CONST(0x0404040000030202), ABC_CONST(0x0404000404030202), ABC_CONST(0x0404000400030202), ABC_CONST(0x0404000004030202), ABC_CONST(0x0404000000030202), ABC_CONST(0x0400040404030202), ABC_CONST(0x0400040400030202), ABC_CONST(0x0400040004030202), ABC_CONST(0x0400040000030202), ABC_CONST(0x0400000404030202), ABC_CONST(0x0400000400030202), ABC_CONST(0x0400000004030202), ABC_CONST(0x0400000000030202) }, + { ABC_CONST(0x0303030303020002), ABC_CONST(0x0303030300020002), ABC_CONST(0x0303030003020002), ABC_CONST(0x0303030000020002), ABC_CONST(0x0303000303020002), ABC_CONST(0x0303000300020002), ABC_CONST(0x0303000003020002), ABC_CONST(0x0303000000020002), ABC_CONST(0x0300030303020002), ABC_CONST(0x0300030300020002), ABC_CONST(0x0300030003020002), ABC_CONST(0x0300030000020002), ABC_CONST(0x0300000303020002), ABC_CONST(0x0300000300020002), ABC_CONST(0x0300000003020002), ABC_CONST(0x0300000000020002), ABC_CONST(0x0303030303020002), ABC_CONST(0x0303030300020002), ABC_CONST(0x0303030003020002), ABC_CONST(0x0303030000020002), ABC_CONST(0x0303000303020002), ABC_CONST(0x0303000300020002), ABC_CONST(0x0303000003020002), ABC_CONST(0x0303000000020002), ABC_CONST(0x0300030303020002), ABC_CONST(0x0300030300020002), ABC_CONST(0x0300030003020002), ABC_CONST(0x0300030000020002), ABC_CONST(0x0300000303020002), ABC_CONST(0x0300000300020002), ABC_CONST(0x0300000003020002), ABC_CONST(0x0300000000020002) }, + { ABC_CONST(0x0404040404030103), ABC_CONST(0x0404040400030103), ABC_CONST(0x0404040004030103), ABC_CONST(0x0404040000030103), ABC_CONST(0x0404000404030103), ABC_CONST(0x0404000400030103), ABC_CONST(0x0404000004030103), ABC_CONST(0x0404000000030103), ABC_CONST(0x0400040404030103), ABC_CONST(0x0400040400030103), ABC_CONST(0x0400040004030103), ABC_CONST(0x0400040000030103), ABC_CONST(0x0400000404030103), ABC_CONST(0x0400000400030103), ABC_CONST(0x0400000004030103), ABC_CONST(0x0400000000030103), ABC_CONST(0x0404040404030103), ABC_CONST(0x0404040400030103), ABC_CONST(0x0404040004030103), ABC_CONST(0x0404040000030103), ABC_CONST(0x0404000404030103), ABC_CONST(0x0404000400030103), ABC_CONST(0x0404000004030103), ABC_CONST(0x0404000000030103), ABC_CONST(0x0400040404030103), ABC_CONST(0x0400040400030103), ABC_CONST(0x0400040004030103), ABC_CONST(0x0400040000030103), ABC_CONST(0x0400000404030103), ABC_CONST(0x0400000400030103), ABC_CONST(0x0400000004030103), ABC_CONST(0x0400000000030103) }, + { ABC_CONST(0x0404040404030102), ABC_CONST(0x0404040400030102), ABC_CONST(0x0404040004030102), ABC_CONST(0x0404040000030102), ABC_CONST(0x0404000404030102), ABC_CONST(0x0404000400030102), ABC_CONST(0x0404000004030102), ABC_CONST(0x0404000000030102), ABC_CONST(0x0400040404030102), ABC_CONST(0x0400040400030102), ABC_CONST(0x0400040004030102), ABC_CONST(0x0400040000030102), ABC_CONST(0x0400000404030102), ABC_CONST(0x0400000400030102), ABC_CONST(0x0400000004030102), ABC_CONST(0x0400000000030102), ABC_CONST(0x0404040404030102), ABC_CONST(0x0404040400030102), ABC_CONST(0x0404040004030102), ABC_CONST(0x0404040000030102), ABC_CONST(0x0404000404030102), ABC_CONST(0x0404000400030102), ABC_CONST(0x0404000004030102), ABC_CONST(0x0404000000030102), ABC_CONST(0x0400040404030102), ABC_CONST(0x0400040400030102), ABC_CONST(0x0400040004030102), ABC_CONST(0x0400040000030102), ABC_CONST(0x0400000404030102), ABC_CONST(0x0400000400030102), ABC_CONST(0x0400000004030102), ABC_CONST(0x0400000000030102) }, + { ABC_CONST(0x0505050505040203), ABC_CONST(0x0505050500040203), ABC_CONST(0x0505050005040203), ABC_CONST(0x0505050000040203), ABC_CONST(0x0505000505040203), ABC_CONST(0x0505000500040203), ABC_CONST(0x0505000005040203), ABC_CONST(0x0505000000040203), ABC_CONST(0x0500050505040203), ABC_CONST(0x0500050500040203), ABC_CONST(0x0500050005040203), ABC_CONST(0x0500050000040203), ABC_CONST(0x0500000505040203), ABC_CONST(0x0500000500040203), ABC_CONST(0x0500000005040203), ABC_CONST(0x0500000000040203), ABC_CONST(0x0505050505040203), ABC_CONST(0x0505050500040203), ABC_CONST(0x0505050005040203), ABC_CONST(0x0505050000040203), ABC_CONST(0x0505000505040203), ABC_CONST(0x0505000500040203), ABC_CONST(0x0505000005040203), ABC_CONST(0x0505000000040203), ABC_CONST(0x0500050505040203), ABC_CONST(0x0500050500040203), ABC_CONST(0x0500050005040203), ABC_CONST(0x0500050000040203), ABC_CONST(0x0500000505040203), ABC_CONST(0x0500000500040203), ABC_CONST(0x0500000005040203), ABC_CONST(0x0500000000040203) }, + { ABC_CONST(0x0202020202000102), ABC_CONST(0x0202020200000102), ABC_CONST(0x0202020002000102), ABC_CONST(0x0202020000000102), ABC_CONST(0x0202000202000102), ABC_CONST(0x0202000200000102), ABC_CONST(0x0202000002000102), ABC_CONST(0x0202000000000102), ABC_CONST(0x0200020202000102), ABC_CONST(0x0200020200000102), ABC_CONST(0x0200020002000102), ABC_CONST(0x0200020000000102), ABC_CONST(0x0200000202000102), ABC_CONST(0x0200000200000102), ABC_CONST(0x0200000002000102), ABC_CONST(0x0200000000000102), ABC_CONST(0x0202020202000102), ABC_CONST(0x0202020200000102), ABC_CONST(0x0202020002000102), ABC_CONST(0x0202020000000102), ABC_CONST(0x0202000202000102), ABC_CONST(0x0202000200000102), ABC_CONST(0x0202000002000102), ABC_CONST(0x0202000000000102), ABC_CONST(0x0200020202000102), ABC_CONST(0x0200020200000102), ABC_CONST(0x0200020002000102), ABC_CONST(0x0200020000000102), ABC_CONST(0x0200000202000102), ABC_CONST(0x0200000200000102), ABC_CONST(0x0200000002000102), ABC_CONST(0x0200000000000102) }, + { ABC_CONST(0x0303030303010203), ABC_CONST(0x0303030300010203), ABC_CONST(0x0303030003010203), ABC_CONST(0x0303030000010203), ABC_CONST(0x0303000303010203), ABC_CONST(0x0303000300010203), ABC_CONST(0x0303000003010203), ABC_CONST(0x0303000000010203), ABC_CONST(0x0300030303010203), ABC_CONST(0x0300030300010203), ABC_CONST(0x0300030003010203), ABC_CONST(0x0300030000010203), ABC_CONST(0x0300000303010203), ABC_CONST(0x0300000300010203), ABC_CONST(0x0300000003010203), ABC_CONST(0x0300000000010203), ABC_CONST(0x0303030303010203), ABC_CONST(0x0303030300010203), ABC_CONST(0x0303030003010203), ABC_CONST(0x0303030000010203), ABC_CONST(0x0303000303010203), ABC_CONST(0x0303000300010203), ABC_CONST(0x0303000003010203), ABC_CONST(0x0303000000010203), ABC_CONST(0x0300030303010203), ABC_CONST(0x0300030300010203), ABC_CONST(0x0300030003010203), ABC_CONST(0x0300030000010203), ABC_CONST(0x0300000303010203), ABC_CONST(0x0300000300010203), ABC_CONST(0x0300000003010203), ABC_CONST(0x0300000000010203) }, + { ABC_CONST(0x0303030303010202), ABC_CONST(0x0303030300010202), ABC_CONST(0x0303030003010202), ABC_CONST(0x0303030000010202), ABC_CONST(0x0303000303010202), ABC_CONST(0x0303000300010202), ABC_CONST(0x0303000003010202), ABC_CONST(0x0303000000010202), ABC_CONST(0x0300030303010202), ABC_CONST(0x0300030300010202), ABC_CONST(0x0300030003010202), ABC_CONST(0x0300030000010202), ABC_CONST(0x0300000303010202), ABC_CONST(0x0300000300010202), ABC_CONST(0x0300000003010202), ABC_CONST(0x0300000000010202), ABC_CONST(0x0303030303010202), ABC_CONST(0x0303030300010202), ABC_CONST(0x0303030003010202), ABC_CONST(0x0303030000010202), ABC_CONST(0x0303000303010202), ABC_CONST(0x0303000300010202), ABC_CONST(0x0303000003010202), ABC_CONST(0x0303000000010202), ABC_CONST(0x0300030303010202), ABC_CONST(0x0300030300010202), ABC_CONST(0x0300030003010202), ABC_CONST(0x0300030000010202), ABC_CONST(0x0300000303010202), ABC_CONST(0x0300000300010202), ABC_CONST(0x0300000003010202), ABC_CONST(0x0300000000010202) }, + { ABC_CONST(0x0404040404020303), ABC_CONST(0x0404040400020303), ABC_CONST(0x0404040004020303), ABC_CONST(0x0404040000020303), ABC_CONST(0x0404000404020303), ABC_CONST(0x0404000400020303), ABC_CONST(0x0404000004020303), ABC_CONST(0x0404000000020303), ABC_CONST(0x0400040404020303), ABC_CONST(0x0400040400020303), ABC_CONST(0x0400040004020303), ABC_CONST(0x0400040000020303), ABC_CONST(0x0400000404020303), ABC_CONST(0x0400000400020303), ABC_CONST(0x0400000004020303), ABC_CONST(0x0400000000020303), ABC_CONST(0x0404040404020303), ABC_CONST(0x0404040400020303), ABC_CONST(0x0404040004020303), ABC_CONST(0x0404040000020303), ABC_CONST(0x0404000404020303), ABC_CONST(0x0404000400020303), ABC_CONST(0x0404000004020303), ABC_CONST(0x0404000000020303), ABC_CONST(0x0400040404020303), ABC_CONST(0x0400040400020303), ABC_CONST(0x0400040004020303), ABC_CONST(0x0400040000020303), ABC_CONST(0x0400000404020303), ABC_CONST(0x0400000400020303), ABC_CONST(0x0400000004020303), ABC_CONST(0x0400000000020303) }, + { ABC_CONST(0x0303030303010103), ABC_CONST(0x0303030300010103), ABC_CONST(0x0303030003010103), ABC_CONST(0x0303030000010103), ABC_CONST(0x0303000303010103), ABC_CONST(0x0303000300010103), ABC_CONST(0x0303000003010103), ABC_CONST(0x0303000000010103), ABC_CONST(0x0300030303010103), ABC_CONST(0x0300030300010103), ABC_CONST(0x0300030003010103), ABC_CONST(0x0300030000010103), ABC_CONST(0x0300000303010103), ABC_CONST(0x0300000300010103), ABC_CONST(0x0300000003010103), ABC_CONST(0x0300000000010103), ABC_CONST(0x0303030303010103), ABC_CONST(0x0303030300010103), ABC_CONST(0x0303030003010103), ABC_CONST(0x0303030000010103), ABC_CONST(0x0303000303010103), ABC_CONST(0x0303000300010103), ABC_CONST(0x0303000003010103), ABC_CONST(0x0303000000010103), ABC_CONST(0x0300030303010103), ABC_CONST(0x0300030300010103), ABC_CONST(0x0300030003010103), ABC_CONST(0x0300030000010103), ABC_CONST(0x0300000303010103), ABC_CONST(0x0300000300010103), ABC_CONST(0x0300000003010103), ABC_CONST(0x0300000000010103) }, + { ABC_CONST(0x0404040404020204), ABC_CONST(0x0404040400020204), ABC_CONST(0x0404040004020204), ABC_CONST(0x0404040000020204), ABC_CONST(0x0404000404020204), ABC_CONST(0x0404000400020204), ABC_CONST(0x0404000004020204), ABC_CONST(0x0404000000020204), ABC_CONST(0x0400040404020204), ABC_CONST(0x0400040400020204), ABC_CONST(0x0400040004020204), ABC_CONST(0x0400040000020204), ABC_CONST(0x0400000404020204), ABC_CONST(0x0400000400020204), ABC_CONST(0x0400000004020204), ABC_CONST(0x0400000000020204), ABC_CONST(0x0404040404020204), ABC_CONST(0x0404040400020204), ABC_CONST(0x0404040004020204), ABC_CONST(0x0404040000020204), ABC_CONST(0x0404000404020204), ABC_CONST(0x0404000400020204), ABC_CONST(0x0404000004020204), ABC_CONST(0x0404000000020204), ABC_CONST(0x0400040404020204), ABC_CONST(0x0400040400020204), ABC_CONST(0x0400040004020204), ABC_CONST(0x0400040000020204), ABC_CONST(0x0400000404020204), ABC_CONST(0x0400000400020204), ABC_CONST(0x0400000004020204), ABC_CONST(0x0400000000020204) }, + { ABC_CONST(0x0404040404020203), ABC_CONST(0x0404040400020203), ABC_CONST(0x0404040004020203), ABC_CONST(0x0404040000020203), ABC_CONST(0x0404000404020203), ABC_CONST(0x0404000400020203), ABC_CONST(0x0404000004020203), ABC_CONST(0x0404000000020203), ABC_CONST(0x0400040404020203), ABC_CONST(0x0400040400020203), ABC_CONST(0x0400040004020203), ABC_CONST(0x0400040000020203), ABC_CONST(0x0400000404020203), ABC_CONST(0x0400000400020203), ABC_CONST(0x0400000004020203), ABC_CONST(0x0400000000020203), ABC_CONST(0x0404040404020203), ABC_CONST(0x0404040400020203), ABC_CONST(0x0404040004020203), ABC_CONST(0x0404040000020203), ABC_CONST(0x0404000404020203), ABC_CONST(0x0404000400020203), ABC_CONST(0x0404000004020203), ABC_CONST(0x0404000000020203), ABC_CONST(0x0400040404020203), ABC_CONST(0x0400040400020203), ABC_CONST(0x0400040004020203), ABC_CONST(0x0400040000020203), ABC_CONST(0x0400000404020203), ABC_CONST(0x0400000400020203), ABC_CONST(0x0400000004020203), ABC_CONST(0x0400000000020203) }, + { ABC_CONST(0x0505050505030304), ABC_CONST(0x0505050500030304), ABC_CONST(0x0505050005030304), ABC_CONST(0x0505050000030304), ABC_CONST(0x0505000505030304), ABC_CONST(0x0505000500030304), ABC_CONST(0x0505000005030304), ABC_CONST(0x0505000000030304), ABC_CONST(0x0500050505030304), ABC_CONST(0x0500050500030304), ABC_CONST(0x0500050005030304), ABC_CONST(0x0500050000030304), ABC_CONST(0x0500000505030304), ABC_CONST(0x0500000500030304), ABC_CONST(0x0500000005030304), ABC_CONST(0x0500000000030304), ABC_CONST(0x0505050505030304), ABC_CONST(0x0505050500030304), ABC_CONST(0x0505050005030304), ABC_CONST(0x0505050000030304), ABC_CONST(0x0505000505030304), ABC_CONST(0x0505000500030304), ABC_CONST(0x0505000005030304), ABC_CONST(0x0505000000030304), ABC_CONST(0x0500050505030304), ABC_CONST(0x0500050500030304), ABC_CONST(0x0500050005030304), ABC_CONST(0x0500050000030304), ABC_CONST(0x0500000505030304), ABC_CONST(0x0500000500030304), ABC_CONST(0x0500000005030304), ABC_CONST(0x0500000000030304) }, + { ABC_CONST(0x0303030303010102), ABC_CONST(0x0303030300010102), ABC_CONST(0x0303030003010102), ABC_CONST(0x0303030000010102), ABC_CONST(0x0303000303010102), ABC_CONST(0x0303000300010102), ABC_CONST(0x0303000003010102), ABC_CONST(0x0303000000010102), ABC_CONST(0x0300030303010102), ABC_CONST(0x0300030300010102), ABC_CONST(0x0300030003010102), ABC_CONST(0x0300030000010102), ABC_CONST(0x0300000303010102), ABC_CONST(0x0300000300010102), ABC_CONST(0x0300000003010102), ABC_CONST(0x0300000000010102), ABC_CONST(0x0303030303010102), ABC_CONST(0x0303030300010102), ABC_CONST(0x0303030003010102), ABC_CONST(0x0303030000010102), ABC_CONST(0x0303000303010102), ABC_CONST(0x0303000300010102), ABC_CONST(0x0303000003010102), ABC_CONST(0x0303000000010102), ABC_CONST(0x0300030303010102), ABC_CONST(0x0300030300010102), ABC_CONST(0x0300030003010102), ABC_CONST(0x0300030000010102), ABC_CONST(0x0300000303010102), ABC_CONST(0x0300000300010102), ABC_CONST(0x0300000003010102), ABC_CONST(0x0300000000010102) }, + { ABC_CONST(0x0404040404020203), ABC_CONST(0x0404040400020203), ABC_CONST(0x0404040004020203), ABC_CONST(0x0404040000020203), ABC_CONST(0x0404000404020203), ABC_CONST(0x0404000400020203), ABC_CONST(0x0404000004020203), ABC_CONST(0x0404000000020203), ABC_CONST(0x0400040404020203), ABC_CONST(0x0400040400020203), ABC_CONST(0x0400040004020203), ABC_CONST(0x0400040000020203), ABC_CONST(0x0400000404020203), ABC_CONST(0x0400000400020203), ABC_CONST(0x0400000004020203), ABC_CONST(0x0400000000020203), ABC_CONST(0x0404040404020203), ABC_CONST(0x0404040400020203), ABC_CONST(0x0404040004020203), ABC_CONST(0x0404040000020203), ABC_CONST(0x0404000404020203), ABC_CONST(0x0404000400020203), ABC_CONST(0x0404000004020203), ABC_CONST(0x0404000000020203), ABC_CONST(0x0400040404020203), ABC_CONST(0x0400040400020203), ABC_CONST(0x0400040004020203), ABC_CONST(0x0400040000020203), ABC_CONST(0x0400000404020203), ABC_CONST(0x0400000400020203), ABC_CONST(0x0400000004020203), ABC_CONST(0x0400000000020203) }, + { ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202), ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202) }, + { ABC_CONST(0x0505050505030303), ABC_CONST(0x0505050500030303), ABC_CONST(0x0505050005030303), ABC_CONST(0x0505050000030303), ABC_CONST(0x0505000505030303), ABC_CONST(0x0505000500030303), ABC_CONST(0x0505000005030303), ABC_CONST(0x0505000000030303), ABC_CONST(0x0500050505030303), ABC_CONST(0x0500050500030303), ABC_CONST(0x0500050005030303), ABC_CONST(0x0500050000030303), ABC_CONST(0x0500000505030303), ABC_CONST(0x0500000500030303), ABC_CONST(0x0500000005030303), ABC_CONST(0x0500000000030303), ABC_CONST(0x0505050505030303), ABC_CONST(0x0505050500030303), ABC_CONST(0x0505050005030303), ABC_CONST(0x0505050000030303), ABC_CONST(0x0505000505030303), ABC_CONST(0x0505000500030303), ABC_CONST(0x0505000005030303), ABC_CONST(0x0505000000030303), ABC_CONST(0x0500050505030303), ABC_CONST(0x0500050500030303), ABC_CONST(0x0500050005030303), ABC_CONST(0x0500050000030303), ABC_CONST(0x0500000505030303), ABC_CONST(0x0500000500030303), ABC_CONST(0x0500000005030303), ABC_CONST(0x0500000000030303) }, + { ABC_CONST(0x0404040404020103), ABC_CONST(0x0404040400020103), ABC_CONST(0x0404040004020103), ABC_CONST(0x0404040000020103), ABC_CONST(0x0404000404020103), ABC_CONST(0x0404000400020103), ABC_CONST(0x0404000004020103), ABC_CONST(0x0404000000020103), ABC_CONST(0x0400040404020103), ABC_CONST(0x0400040400020103), ABC_CONST(0x0400040004020103), ABC_CONST(0x0400040000020103), ABC_CONST(0x0400000404020103), ABC_CONST(0x0400000400020103), ABC_CONST(0x0400000004020103), ABC_CONST(0x0400000000020103), ABC_CONST(0x0404040404020103), ABC_CONST(0x0404040400020103), ABC_CONST(0x0404040004020103), ABC_CONST(0x0404040000020103), ABC_CONST(0x0404000404020103), ABC_CONST(0x0404000400020103), ABC_CONST(0x0404000004020103), ABC_CONST(0x0404000000020103), ABC_CONST(0x0400040404020103), ABC_CONST(0x0400040400020103), ABC_CONST(0x0400040004020103), ABC_CONST(0x0400040000020103), ABC_CONST(0x0400000404020103), ABC_CONST(0x0400000400020103), ABC_CONST(0x0400000004020103), ABC_CONST(0x0400000000020103) }, + { ABC_CONST(0x0505050505030204), ABC_CONST(0x0505050500030204), ABC_CONST(0x0505050005030204), ABC_CONST(0x0505050000030204), ABC_CONST(0x0505000505030204), ABC_CONST(0x0505000500030204), ABC_CONST(0x0505000005030204), ABC_CONST(0x0505000000030204), ABC_CONST(0x0500050505030204), ABC_CONST(0x0500050500030204), ABC_CONST(0x0500050005030204), ABC_CONST(0x0500050000030204), ABC_CONST(0x0500000505030204), ABC_CONST(0x0500000500030204), ABC_CONST(0x0500000005030204), ABC_CONST(0x0500000000030204), ABC_CONST(0x0505050505030204), ABC_CONST(0x0505050500030204), ABC_CONST(0x0505050005030204), ABC_CONST(0x0505050000030204), ABC_CONST(0x0505000505030204), ABC_CONST(0x0505000500030204), ABC_CONST(0x0505000005030204), ABC_CONST(0x0505000000030204), ABC_CONST(0x0500050505030204), ABC_CONST(0x0500050500030204), ABC_CONST(0x0500050005030204), ABC_CONST(0x0500050000030204), ABC_CONST(0x0500000505030204), ABC_CONST(0x0500000500030204), ABC_CONST(0x0500000005030204), ABC_CONST(0x0500000000030204) }, + { ABC_CONST(0x0505050505030203), ABC_CONST(0x0505050500030203), ABC_CONST(0x0505050005030203), ABC_CONST(0x0505050000030203), ABC_CONST(0x0505000505030203), ABC_CONST(0x0505000500030203), ABC_CONST(0x0505000005030203), ABC_CONST(0x0505000000030203), ABC_CONST(0x0500050505030203), ABC_CONST(0x0500050500030203), ABC_CONST(0x0500050005030203), ABC_CONST(0x0500050000030203), ABC_CONST(0x0500000505030203), ABC_CONST(0x0500000500030203), ABC_CONST(0x0500000005030203), ABC_CONST(0x0500000000030203), ABC_CONST(0x0505050505030203), ABC_CONST(0x0505050500030203), ABC_CONST(0x0505050005030203), ABC_CONST(0x0505050000030203), ABC_CONST(0x0505000505030203), ABC_CONST(0x0505000500030203), ABC_CONST(0x0505000005030203), ABC_CONST(0x0505000000030203), ABC_CONST(0x0500050505030203), ABC_CONST(0x0500050500030203), ABC_CONST(0x0500050005030203), ABC_CONST(0x0500050000030203), ABC_CONST(0x0500000505030203), ABC_CONST(0x0500000500030203), ABC_CONST(0x0500000005030203), ABC_CONST(0x0500000000030203) }, + { ABC_CONST(0x0606060606040304), ABC_CONST(0x0606060600040304), ABC_CONST(0x0606060006040304), ABC_CONST(0x0606060000040304), ABC_CONST(0x0606000606040304), ABC_CONST(0x0606000600040304), ABC_CONST(0x0606000006040304), ABC_CONST(0x0606000000040304), ABC_CONST(0x0600060606040304), ABC_CONST(0x0600060600040304), ABC_CONST(0x0600060006040304), ABC_CONST(0x0600060000040304), ABC_CONST(0x0600000606040304), ABC_CONST(0x0600000600040304), ABC_CONST(0x0600000006040304), ABC_CONST(0x0600000000040304), ABC_CONST(0x0606060606040304), ABC_CONST(0x0606060600040304), ABC_CONST(0x0606060006040304), ABC_CONST(0x0606060000040304), ABC_CONST(0x0606000606040304), ABC_CONST(0x0606000600040304), ABC_CONST(0x0606000006040304), ABC_CONST(0x0606000000040304), ABC_CONST(0x0600060606040304), ABC_CONST(0x0600060600040304), ABC_CONST(0x0600060006040304), ABC_CONST(0x0600060000040304), ABC_CONST(0x0600000606040304), ABC_CONST(0x0600000600040304), ABC_CONST(0x0600000006040304), ABC_CONST(0x0600000000040304) }, + { ABC_CONST(0x0202020202000101), ABC_CONST(0x0202020200000101), ABC_CONST(0x0202020002000101), ABC_CONST(0x0202020000000101), ABC_CONST(0x0202000202000101), ABC_CONST(0x0202000200000101), ABC_CONST(0x0202000002000101), ABC_CONST(0x0202000000000101), ABC_CONST(0x0200020202000101), ABC_CONST(0x0200020200000101), ABC_CONST(0x0200020002000101), ABC_CONST(0x0200020000000101), ABC_CONST(0x0200000202000101), ABC_CONST(0x0200000200000101), ABC_CONST(0x0200000002000101), ABC_CONST(0x0200000000000101), ABC_CONST(0x0202020202000101), ABC_CONST(0x0202020200000101), ABC_CONST(0x0202020002000101), ABC_CONST(0x0202020000000101), ABC_CONST(0x0202000202000101), ABC_CONST(0x0202000200000101), ABC_CONST(0x0202000002000101), ABC_CONST(0x0202000000000101), ABC_CONST(0x0200020202000101), ABC_CONST(0x0200020200000101), ABC_CONST(0x0200020002000101), ABC_CONST(0x0200020000000101), ABC_CONST(0x0200000202000101), ABC_CONST(0x0200000200000101), ABC_CONST(0x0200000002000101), ABC_CONST(0x0200000000000101) }, + { ABC_CONST(0x0303030303010202), ABC_CONST(0x0303030300010202), ABC_CONST(0x0303030003010202), ABC_CONST(0x0303030000010202), ABC_CONST(0x0303000303010202), ABC_CONST(0x0303000300010202), ABC_CONST(0x0303000003010202), ABC_CONST(0x0303000000010202), ABC_CONST(0x0300030303010202), ABC_CONST(0x0300030300010202), ABC_CONST(0x0300030003010202), ABC_CONST(0x0300030000010202), ABC_CONST(0x0300000303010202), ABC_CONST(0x0300000300010202), ABC_CONST(0x0300000003010202), ABC_CONST(0x0300000000010202), ABC_CONST(0x0303030303010202), ABC_CONST(0x0303030300010202), ABC_CONST(0x0303030003010202), ABC_CONST(0x0303030000010202), ABC_CONST(0x0303000303010202), ABC_CONST(0x0303000300010202), ABC_CONST(0x0303000003010202), ABC_CONST(0x0303000000010202), ABC_CONST(0x0300030303010202), ABC_CONST(0x0300030300010202), ABC_CONST(0x0300030003010202), ABC_CONST(0x0300030000010202), ABC_CONST(0x0300000303010202), ABC_CONST(0x0300000300010202), ABC_CONST(0x0300000003010202), ABC_CONST(0x0300000000010202) }, + { ABC_CONST(0x0303030303010201), ABC_CONST(0x0303030300010201), ABC_CONST(0x0303030003010201), ABC_CONST(0x0303030000010201), ABC_CONST(0x0303000303010201), ABC_CONST(0x0303000300010201), ABC_CONST(0x0303000003010201), ABC_CONST(0x0303000000010201), ABC_CONST(0x0300030303010201), ABC_CONST(0x0300030300010201), ABC_CONST(0x0300030003010201), ABC_CONST(0x0300030000010201), ABC_CONST(0x0300000303010201), ABC_CONST(0x0300000300010201), ABC_CONST(0x0300000003010201), ABC_CONST(0x0300000000010201), ABC_CONST(0x0303030303010201), ABC_CONST(0x0303030300010201), ABC_CONST(0x0303030003010201), ABC_CONST(0x0303030000010201), ABC_CONST(0x0303000303010201), ABC_CONST(0x0303000300010201), ABC_CONST(0x0303000003010201), ABC_CONST(0x0303000000010201), ABC_CONST(0x0300030303010201), ABC_CONST(0x0300030300010201), ABC_CONST(0x0300030003010201), ABC_CONST(0x0300030000010201), ABC_CONST(0x0300000303010201), ABC_CONST(0x0300000300010201), ABC_CONST(0x0300000003010201), ABC_CONST(0x0300000000010201) }, + { ABC_CONST(0x0404040404020302), ABC_CONST(0x0404040400020302), ABC_CONST(0x0404040004020302), ABC_CONST(0x0404040000020302), ABC_CONST(0x0404000404020302), ABC_CONST(0x0404000400020302), ABC_CONST(0x0404000004020302), ABC_CONST(0x0404000000020302), ABC_CONST(0x0400040404020302), ABC_CONST(0x0400040400020302), ABC_CONST(0x0400040004020302), ABC_CONST(0x0400040000020302), ABC_CONST(0x0400000404020302), ABC_CONST(0x0400000400020302), ABC_CONST(0x0400000004020302), ABC_CONST(0x0400000000020302), ABC_CONST(0x0404040404020302), ABC_CONST(0x0404040400020302), ABC_CONST(0x0404040004020302), ABC_CONST(0x0404040000020302), ABC_CONST(0x0404000404020302), ABC_CONST(0x0404000400020302), ABC_CONST(0x0404000004020302), ABC_CONST(0x0404000000020302), ABC_CONST(0x0400040404020302), ABC_CONST(0x0400040400020302), ABC_CONST(0x0400040004020302), ABC_CONST(0x0400040000020302), ABC_CONST(0x0400000404020302), ABC_CONST(0x0400000400020302), ABC_CONST(0x0400000004020302), ABC_CONST(0x0400000000020302) }, + { ABC_CONST(0x0303030303010102), ABC_CONST(0x0303030300010102), ABC_CONST(0x0303030003010102), ABC_CONST(0x0303030000010102), ABC_CONST(0x0303000303010102), ABC_CONST(0x0303000300010102), ABC_CONST(0x0303000003010102), ABC_CONST(0x0303000000010102), ABC_CONST(0x0300030303010102), ABC_CONST(0x0300030300010102), ABC_CONST(0x0300030003010102), ABC_CONST(0x0300030000010102), ABC_CONST(0x0300000303010102), ABC_CONST(0x0300000300010102), ABC_CONST(0x0300000003010102), ABC_CONST(0x0300000000010102), ABC_CONST(0x0303030303010102), ABC_CONST(0x0303030300010102), ABC_CONST(0x0303030003010102), ABC_CONST(0x0303030000010102), ABC_CONST(0x0303000303010102), ABC_CONST(0x0303000300010102), ABC_CONST(0x0303000003010102), ABC_CONST(0x0303000000010102), ABC_CONST(0x0300030303010102), ABC_CONST(0x0300030300010102), ABC_CONST(0x0300030003010102), ABC_CONST(0x0300030000010102), ABC_CONST(0x0300000303010102), ABC_CONST(0x0300000300010102), ABC_CONST(0x0300000003010102), ABC_CONST(0x0300000000010102) }, + { ABC_CONST(0x0404040404020203), ABC_CONST(0x0404040400020203), ABC_CONST(0x0404040004020203), ABC_CONST(0x0404040000020203), ABC_CONST(0x0404000404020203), ABC_CONST(0x0404000400020203), ABC_CONST(0x0404000004020203), ABC_CONST(0x0404000000020203), ABC_CONST(0x0400040404020203), ABC_CONST(0x0400040400020203), ABC_CONST(0x0400040004020203), ABC_CONST(0x0400040000020203), ABC_CONST(0x0400000404020203), ABC_CONST(0x0400000400020203), ABC_CONST(0x0400000004020203), ABC_CONST(0x0400000000020203), ABC_CONST(0x0404040404020203), ABC_CONST(0x0404040400020203), ABC_CONST(0x0404040004020203), ABC_CONST(0x0404040000020203), ABC_CONST(0x0404000404020203), ABC_CONST(0x0404000400020203), ABC_CONST(0x0404000004020203), ABC_CONST(0x0404000000020203), ABC_CONST(0x0400040404020203), ABC_CONST(0x0400040400020203), ABC_CONST(0x0400040004020203), ABC_CONST(0x0400040000020203), ABC_CONST(0x0400000404020203), ABC_CONST(0x0400000400020203), ABC_CONST(0x0400000004020203), ABC_CONST(0x0400000000020203) }, + { ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202), ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202) }, + { ABC_CONST(0x0505050505030303), ABC_CONST(0x0505050500030303), ABC_CONST(0x0505050005030303), ABC_CONST(0x0505050000030303), ABC_CONST(0x0505000505030303), ABC_CONST(0x0505000500030303), ABC_CONST(0x0505000005030303), ABC_CONST(0x0505000000030303), ABC_CONST(0x0500050505030303), ABC_CONST(0x0500050500030303), ABC_CONST(0x0500050005030303), ABC_CONST(0x0500050000030303), ABC_CONST(0x0500000505030303), ABC_CONST(0x0500000500030303), ABC_CONST(0x0500000005030303), ABC_CONST(0x0500000000030303), ABC_CONST(0x0505050505030303), ABC_CONST(0x0505050500030303), ABC_CONST(0x0505050005030303), ABC_CONST(0x0505050000030303), ABC_CONST(0x0505000505030303), ABC_CONST(0x0505000500030303), ABC_CONST(0x0505000005030303), ABC_CONST(0x0505000000030303), ABC_CONST(0x0500050505030303), ABC_CONST(0x0500050500030303), ABC_CONST(0x0500050005030303), ABC_CONST(0x0500050000030303), ABC_CONST(0x0500000505030303), ABC_CONST(0x0500000500030303), ABC_CONST(0x0500000005030303), ABC_CONST(0x0500000000030303) }, + { ABC_CONST(0x0303030303010101), ABC_CONST(0x0303030300010101), ABC_CONST(0x0303030003010101), ABC_CONST(0x0303030000010101), ABC_CONST(0x0303000303010101), ABC_CONST(0x0303000300010101), ABC_CONST(0x0303000003010101), ABC_CONST(0x0303000000010101), ABC_CONST(0x0300030303010101), ABC_CONST(0x0300030300010101), ABC_CONST(0x0300030003010101), ABC_CONST(0x0300030000010101), ABC_CONST(0x0300000303010101), ABC_CONST(0x0300000300010101), ABC_CONST(0x0300000003010101), ABC_CONST(0x0300000000010101), ABC_CONST(0x0303030303010101), ABC_CONST(0x0303030300010101), ABC_CONST(0x0303030003010101), ABC_CONST(0x0303030000010101), ABC_CONST(0x0303000303010101), ABC_CONST(0x0303000300010101), ABC_CONST(0x0303000003010101), ABC_CONST(0x0303000000010101), ABC_CONST(0x0300030303010101), ABC_CONST(0x0300030300010101), ABC_CONST(0x0300030003010101), ABC_CONST(0x0300030000010101), ABC_CONST(0x0300000303010101), ABC_CONST(0x0300000300010101), ABC_CONST(0x0300000003010101), ABC_CONST(0x0300000000010101) }, + { ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202), ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202) }, + { ABC_CONST(0x0404040404020201), ABC_CONST(0x0404040400020201), ABC_CONST(0x0404040004020201), ABC_CONST(0x0404040000020201), ABC_CONST(0x0404000404020201), ABC_CONST(0x0404000400020201), ABC_CONST(0x0404000004020201), ABC_CONST(0x0404000000020201), ABC_CONST(0x0400040404020201), ABC_CONST(0x0400040400020201), ABC_CONST(0x0400040004020201), ABC_CONST(0x0400040000020201), ABC_CONST(0x0400000404020201), ABC_CONST(0x0400000400020201), ABC_CONST(0x0400000004020201), ABC_CONST(0x0400000000020201), ABC_CONST(0x0404040404020201), ABC_CONST(0x0404040400020201), ABC_CONST(0x0404040004020201), ABC_CONST(0x0404040000020201), ABC_CONST(0x0404000404020201), ABC_CONST(0x0404000400020201), ABC_CONST(0x0404000004020201), ABC_CONST(0x0404000000020201), ABC_CONST(0x0400040404020201), ABC_CONST(0x0400040400020201), ABC_CONST(0x0400040004020201), ABC_CONST(0x0400040000020201), ABC_CONST(0x0400000404020201), ABC_CONST(0x0400000400020201), ABC_CONST(0x0400000004020201), ABC_CONST(0x0400000000020201) }, + { ABC_CONST(0x0505050505030302), ABC_CONST(0x0505050500030302), ABC_CONST(0x0505050005030302), ABC_CONST(0x0505050000030302), ABC_CONST(0x0505000505030302), ABC_CONST(0x0505000500030302), ABC_CONST(0x0505000005030302), ABC_CONST(0x0505000000030302), ABC_CONST(0x0500050505030302), ABC_CONST(0x0500050500030302), ABC_CONST(0x0500050005030302), ABC_CONST(0x0500050000030302), ABC_CONST(0x0500000505030302), ABC_CONST(0x0500000500030302), ABC_CONST(0x0500000005030302), ABC_CONST(0x0500000000030302), ABC_CONST(0x0505050505030302), ABC_CONST(0x0505050500030302), ABC_CONST(0x0505050005030302), ABC_CONST(0x0505050000030302), ABC_CONST(0x0505000505030302), ABC_CONST(0x0505000500030302), ABC_CONST(0x0505000005030302), ABC_CONST(0x0505000000030302), ABC_CONST(0x0500050505030302), ABC_CONST(0x0500050500030302), ABC_CONST(0x0500050005030302), ABC_CONST(0x0500050000030302), ABC_CONST(0x0500000505030302), ABC_CONST(0x0500000500030302), ABC_CONST(0x0500000005030302), ABC_CONST(0x0500000000030302) }, + { ABC_CONST(0x0404040404020102), ABC_CONST(0x0404040400020102), ABC_CONST(0x0404040004020102), ABC_CONST(0x0404040000020102), ABC_CONST(0x0404000404020102), ABC_CONST(0x0404000400020102), ABC_CONST(0x0404000004020102), ABC_CONST(0x0404000000020102), ABC_CONST(0x0400040404020102), ABC_CONST(0x0400040400020102), ABC_CONST(0x0400040004020102), ABC_CONST(0x0400040000020102), ABC_CONST(0x0400000404020102), ABC_CONST(0x0400000400020102), ABC_CONST(0x0400000004020102), ABC_CONST(0x0400000000020102), ABC_CONST(0x0404040404020102), ABC_CONST(0x0404040400020102), ABC_CONST(0x0404040004020102), ABC_CONST(0x0404040000020102), ABC_CONST(0x0404000404020102), ABC_CONST(0x0404000400020102), ABC_CONST(0x0404000004020102), ABC_CONST(0x0404000000020102), ABC_CONST(0x0400040404020102), ABC_CONST(0x0400040400020102), ABC_CONST(0x0400040004020102), ABC_CONST(0x0400040000020102), ABC_CONST(0x0400000404020102), ABC_CONST(0x0400000400020102), ABC_CONST(0x0400000004020102), ABC_CONST(0x0400000000020102) }, + { ABC_CONST(0x0505050505030203), ABC_CONST(0x0505050500030203), ABC_CONST(0x0505050005030203), ABC_CONST(0x0505050000030203), ABC_CONST(0x0505000505030203), ABC_CONST(0x0505000500030203), ABC_CONST(0x0505000005030203), ABC_CONST(0x0505000000030203), ABC_CONST(0x0500050505030203), ABC_CONST(0x0500050500030203), ABC_CONST(0x0500050005030203), ABC_CONST(0x0500050000030203), ABC_CONST(0x0500000505030203), ABC_CONST(0x0500000500030203), ABC_CONST(0x0500000005030203), ABC_CONST(0x0500000000030203), ABC_CONST(0x0505050505030203), ABC_CONST(0x0505050500030203), ABC_CONST(0x0505050005030203), ABC_CONST(0x0505050000030203), ABC_CONST(0x0505000505030203), ABC_CONST(0x0505000500030203), ABC_CONST(0x0505000005030203), ABC_CONST(0x0505000000030203), ABC_CONST(0x0500050505030203), ABC_CONST(0x0500050500030203), ABC_CONST(0x0500050005030203), ABC_CONST(0x0500050000030203), ABC_CONST(0x0500000505030203), ABC_CONST(0x0500000500030203), ABC_CONST(0x0500000005030203), ABC_CONST(0x0500000000030203) }, + { ABC_CONST(0x0505050505030202), ABC_CONST(0x0505050500030202), ABC_CONST(0x0505050005030202), ABC_CONST(0x0505050000030202), ABC_CONST(0x0505000505030202), ABC_CONST(0x0505000500030202), ABC_CONST(0x0505000005030202), ABC_CONST(0x0505000000030202), ABC_CONST(0x0500050505030202), ABC_CONST(0x0500050500030202), ABC_CONST(0x0500050005030202), ABC_CONST(0x0500050000030202), ABC_CONST(0x0500000505030202), ABC_CONST(0x0500000500030202), ABC_CONST(0x0500000005030202), ABC_CONST(0x0500000000030202), ABC_CONST(0x0505050505030202), ABC_CONST(0x0505050500030202), ABC_CONST(0x0505050005030202), ABC_CONST(0x0505050000030202), ABC_CONST(0x0505000505030202), ABC_CONST(0x0505000500030202), ABC_CONST(0x0505000005030202), ABC_CONST(0x0505000000030202), ABC_CONST(0x0500050505030202), ABC_CONST(0x0500050500030202), ABC_CONST(0x0500050005030202), ABC_CONST(0x0500050000030202), ABC_CONST(0x0500000505030202), ABC_CONST(0x0500000500030202), ABC_CONST(0x0500000005030202), ABC_CONST(0x0500000000030202) }, + { ABC_CONST(0x0606060606040303), ABC_CONST(0x0606060600040303), ABC_CONST(0x0606060006040303), ABC_CONST(0x0606060000040303), ABC_CONST(0x0606000606040303), ABC_CONST(0x0606000600040303), ABC_CONST(0x0606000006040303), ABC_CONST(0x0606000000040303), ABC_CONST(0x0600060606040303), ABC_CONST(0x0600060600040303), ABC_CONST(0x0600060006040303), ABC_CONST(0x0600060000040303), ABC_CONST(0x0600000606040303), ABC_CONST(0x0600000600040303), ABC_CONST(0x0600000006040303), ABC_CONST(0x0600000000040303), ABC_CONST(0x0606060606040303), ABC_CONST(0x0606060600040303), ABC_CONST(0x0606060006040303), ABC_CONST(0x0606060000040303), ABC_CONST(0x0606000606040303), ABC_CONST(0x0606000600040303), ABC_CONST(0x0606000006040303), ABC_CONST(0x0606000000040303), ABC_CONST(0x0600060606040303), ABC_CONST(0x0600060600040303), ABC_CONST(0x0600060006040303), ABC_CONST(0x0600060000040303), ABC_CONST(0x0600000606040303), ABC_CONST(0x0600000600040303), ABC_CONST(0x0600000006040303), ABC_CONST(0x0600000000040303) }, + { ABC_CONST(0x0303030303000202), ABC_CONST(0x0303030300000202), ABC_CONST(0x0303030003000202), ABC_CONST(0x0303030000000202), ABC_CONST(0x0303000303000202), ABC_CONST(0x0303000300000202), ABC_CONST(0x0303000003000202), ABC_CONST(0x0303000000000202), ABC_CONST(0x0300030303000202), ABC_CONST(0x0300030300000202), ABC_CONST(0x0300030003000202), ABC_CONST(0x0300030000000202), ABC_CONST(0x0300000303000202), ABC_CONST(0x0300000300000202), ABC_CONST(0x0300000003000202), ABC_CONST(0x0300000000000202), ABC_CONST(0x0303030303000202), ABC_CONST(0x0303030300000202), ABC_CONST(0x0303030003000202), ABC_CONST(0x0303030000000202), ABC_CONST(0x0303000303000202), ABC_CONST(0x0303000300000202), ABC_CONST(0x0303000003000202), ABC_CONST(0x0303000000000202), ABC_CONST(0x0300030303000202), ABC_CONST(0x0300030300000202), ABC_CONST(0x0300030003000202), ABC_CONST(0x0300030000000202), ABC_CONST(0x0300000303000202), ABC_CONST(0x0300000300000202), ABC_CONST(0x0300000003000202), ABC_CONST(0x0300000000000202) }, + { ABC_CONST(0x0404040404010303), ABC_CONST(0x0404040400010303), ABC_CONST(0x0404040004010303), ABC_CONST(0x0404040000010303), ABC_CONST(0x0404000404010303), ABC_CONST(0x0404000400010303), ABC_CONST(0x0404000004010303), ABC_CONST(0x0404000000010303), ABC_CONST(0x0400040404010303), ABC_CONST(0x0400040400010303), ABC_CONST(0x0400040004010303), ABC_CONST(0x0400040000010303), ABC_CONST(0x0400000404010303), ABC_CONST(0x0400000400010303), ABC_CONST(0x0400000004010303), ABC_CONST(0x0400000000010303), ABC_CONST(0x0404040404010303), ABC_CONST(0x0404040400010303), ABC_CONST(0x0404040004010303), ABC_CONST(0x0404040000010303), ABC_CONST(0x0404000404010303), ABC_CONST(0x0404000400010303), ABC_CONST(0x0404000004010303), ABC_CONST(0x0404000000010303), ABC_CONST(0x0400040404010303), ABC_CONST(0x0400040400010303), ABC_CONST(0x0400040004010303), ABC_CONST(0x0400040000010303), ABC_CONST(0x0400000404010303), ABC_CONST(0x0400000400010303), ABC_CONST(0x0400000004010303), ABC_CONST(0x0400000000010303) }, + { ABC_CONST(0x0404040404010302), ABC_CONST(0x0404040400010302), ABC_CONST(0x0404040004010302), ABC_CONST(0x0404040000010302), ABC_CONST(0x0404000404010302), ABC_CONST(0x0404000400010302), ABC_CONST(0x0404000004010302), ABC_CONST(0x0404000000010302), ABC_CONST(0x0400040404010302), ABC_CONST(0x0400040400010302), ABC_CONST(0x0400040004010302), ABC_CONST(0x0400040000010302), ABC_CONST(0x0400000404010302), ABC_CONST(0x0400000400010302), ABC_CONST(0x0400000004010302), ABC_CONST(0x0400000000010302), ABC_CONST(0x0404040404010302), ABC_CONST(0x0404040400010302), ABC_CONST(0x0404040004010302), ABC_CONST(0x0404040000010302), ABC_CONST(0x0404000404010302), ABC_CONST(0x0404000400010302), ABC_CONST(0x0404000004010302), ABC_CONST(0x0404000000010302), ABC_CONST(0x0400040404010302), ABC_CONST(0x0400040400010302), ABC_CONST(0x0400040004010302), ABC_CONST(0x0400040000010302), ABC_CONST(0x0400000404010302), ABC_CONST(0x0400000400010302), ABC_CONST(0x0400000004010302), ABC_CONST(0x0400000000010302) }, + { ABC_CONST(0x0505050505020403), ABC_CONST(0x0505050500020403), ABC_CONST(0x0505050005020403), ABC_CONST(0x0505050000020403), ABC_CONST(0x0505000505020403), ABC_CONST(0x0505000500020403), ABC_CONST(0x0505000005020403), ABC_CONST(0x0505000000020403), ABC_CONST(0x0500050505020403), ABC_CONST(0x0500050500020403), ABC_CONST(0x0500050005020403), ABC_CONST(0x0500050000020403), ABC_CONST(0x0500000505020403), ABC_CONST(0x0500000500020403), ABC_CONST(0x0500000005020403), ABC_CONST(0x0500000000020403), ABC_CONST(0x0505050505020403), ABC_CONST(0x0505050500020403), ABC_CONST(0x0505050005020403), ABC_CONST(0x0505050000020403), ABC_CONST(0x0505000505020403), ABC_CONST(0x0505000500020403), ABC_CONST(0x0505000005020403), ABC_CONST(0x0505000000020403), ABC_CONST(0x0500050505020403), ABC_CONST(0x0500050500020403), ABC_CONST(0x0500050005020403), ABC_CONST(0x0500050000020403), ABC_CONST(0x0500000505020403), ABC_CONST(0x0500000500020403), ABC_CONST(0x0500000005020403), ABC_CONST(0x0500000000020403) }, + { ABC_CONST(0x0404040404010203), ABC_CONST(0x0404040400010203), ABC_CONST(0x0404040004010203), ABC_CONST(0x0404040000010203), ABC_CONST(0x0404000404010203), ABC_CONST(0x0404000400010203), ABC_CONST(0x0404000004010203), ABC_CONST(0x0404000000010203), ABC_CONST(0x0400040404010203), ABC_CONST(0x0400040400010203), ABC_CONST(0x0400040004010203), ABC_CONST(0x0400040000010203), ABC_CONST(0x0400000404010203), ABC_CONST(0x0400000400010203), ABC_CONST(0x0400000004010203), ABC_CONST(0x0400000000010203), ABC_CONST(0x0404040404010203), ABC_CONST(0x0404040400010203), ABC_CONST(0x0404040004010203), ABC_CONST(0x0404040000010203), ABC_CONST(0x0404000404010203), ABC_CONST(0x0404000400010203), ABC_CONST(0x0404000004010203), ABC_CONST(0x0404000000010203), ABC_CONST(0x0400040404010203), ABC_CONST(0x0400040400010203), ABC_CONST(0x0400040004010203), ABC_CONST(0x0400040000010203), ABC_CONST(0x0400000404010203), ABC_CONST(0x0400000400010203), ABC_CONST(0x0400000004010203), ABC_CONST(0x0400000000010203) }, + { ABC_CONST(0x0505050505020304), ABC_CONST(0x0505050500020304), ABC_CONST(0x0505050005020304), ABC_CONST(0x0505050000020304), ABC_CONST(0x0505000505020304), ABC_CONST(0x0505000500020304), ABC_CONST(0x0505000005020304), ABC_CONST(0x0505000000020304), ABC_CONST(0x0500050505020304), ABC_CONST(0x0500050500020304), ABC_CONST(0x0500050005020304), ABC_CONST(0x0500050000020304), ABC_CONST(0x0500000505020304), ABC_CONST(0x0500000500020304), ABC_CONST(0x0500000005020304), ABC_CONST(0x0500000000020304), ABC_CONST(0x0505050505020304), ABC_CONST(0x0505050500020304), ABC_CONST(0x0505050005020304), ABC_CONST(0x0505050000020304), ABC_CONST(0x0505000505020304), ABC_CONST(0x0505000500020304), ABC_CONST(0x0505000005020304), ABC_CONST(0x0505000000020304), ABC_CONST(0x0500050505020304), ABC_CONST(0x0500050500020304), ABC_CONST(0x0500050005020304), ABC_CONST(0x0500050000020304), ABC_CONST(0x0500000505020304), ABC_CONST(0x0500000500020304), ABC_CONST(0x0500000005020304), ABC_CONST(0x0500000000020304) }, + { ABC_CONST(0x0505050505020303), ABC_CONST(0x0505050500020303), ABC_CONST(0x0505050005020303), ABC_CONST(0x0505050000020303), ABC_CONST(0x0505000505020303), ABC_CONST(0x0505000500020303), ABC_CONST(0x0505000005020303), ABC_CONST(0x0505000000020303), ABC_CONST(0x0500050505020303), ABC_CONST(0x0500050500020303), ABC_CONST(0x0500050005020303), ABC_CONST(0x0500050000020303), ABC_CONST(0x0500000505020303), ABC_CONST(0x0500000500020303), ABC_CONST(0x0500000005020303), ABC_CONST(0x0500000000020303), ABC_CONST(0x0505050505020303), ABC_CONST(0x0505050500020303), ABC_CONST(0x0505050005020303), ABC_CONST(0x0505050000020303), ABC_CONST(0x0505000505020303), ABC_CONST(0x0505000500020303), ABC_CONST(0x0505000005020303), ABC_CONST(0x0505000000020303), ABC_CONST(0x0500050505020303), ABC_CONST(0x0500050500020303), ABC_CONST(0x0500050005020303), ABC_CONST(0x0500050000020303), ABC_CONST(0x0500000505020303), ABC_CONST(0x0500000500020303), ABC_CONST(0x0500000005020303), ABC_CONST(0x0500000000020303) }, + { ABC_CONST(0x0606060606030404), ABC_CONST(0x0606060600030404), ABC_CONST(0x0606060006030404), ABC_CONST(0x0606060000030404), ABC_CONST(0x0606000606030404), ABC_CONST(0x0606000600030404), ABC_CONST(0x0606000006030404), ABC_CONST(0x0606000000030404), ABC_CONST(0x0600060606030404), ABC_CONST(0x0600060600030404), ABC_CONST(0x0600060006030404), ABC_CONST(0x0600060000030404), ABC_CONST(0x0600000606030404), ABC_CONST(0x0600000600030404), ABC_CONST(0x0600000006030404), ABC_CONST(0x0600000000030404), ABC_CONST(0x0606060606030404), ABC_CONST(0x0606060600030404), ABC_CONST(0x0606060006030404), ABC_CONST(0x0606060000030404), ABC_CONST(0x0606000606030404), ABC_CONST(0x0606000600030404), ABC_CONST(0x0606000006030404), ABC_CONST(0x0606000000030404), ABC_CONST(0x0600060606030404), ABC_CONST(0x0600060600030404), ABC_CONST(0x0600060006030404), ABC_CONST(0x0600060000030404), ABC_CONST(0x0600000606030404), ABC_CONST(0x0600000600030404), ABC_CONST(0x0600000006030404), ABC_CONST(0x0600000000030404) }, + { ABC_CONST(0x0404040404010202), ABC_CONST(0x0404040400010202), ABC_CONST(0x0404040004010202), ABC_CONST(0x0404040000010202), ABC_CONST(0x0404000404010202), ABC_CONST(0x0404000400010202), ABC_CONST(0x0404000004010202), ABC_CONST(0x0404000000010202), ABC_CONST(0x0400040404010202), ABC_CONST(0x0400040400010202), ABC_CONST(0x0400040004010202), ABC_CONST(0x0400040000010202), ABC_CONST(0x0400000404010202), ABC_CONST(0x0400000400010202), ABC_CONST(0x0400000004010202), ABC_CONST(0x0400000000010202), ABC_CONST(0x0404040404010202), ABC_CONST(0x0404040400010202), ABC_CONST(0x0404040004010202), ABC_CONST(0x0404040000010202), ABC_CONST(0x0404000404010202), ABC_CONST(0x0404000400010202), ABC_CONST(0x0404000004010202), ABC_CONST(0x0404000000010202), ABC_CONST(0x0400040404010202), ABC_CONST(0x0400040400010202), ABC_CONST(0x0400040004010202), ABC_CONST(0x0400040000010202), ABC_CONST(0x0400000404010202), ABC_CONST(0x0400000400010202), ABC_CONST(0x0400000004010202), ABC_CONST(0x0400000000010202) }, + { ABC_CONST(0x0505050505020303), ABC_CONST(0x0505050500020303), ABC_CONST(0x0505050005020303), ABC_CONST(0x0505050000020303), ABC_CONST(0x0505000505020303), ABC_CONST(0x0505000500020303), ABC_CONST(0x0505000005020303), ABC_CONST(0x0505000000020303), ABC_CONST(0x0500050505020303), ABC_CONST(0x0500050500020303), ABC_CONST(0x0500050005020303), ABC_CONST(0x0500050000020303), ABC_CONST(0x0500000505020303), ABC_CONST(0x0500000500020303), ABC_CONST(0x0500000005020303), ABC_CONST(0x0500000000020303), ABC_CONST(0x0505050505020303), ABC_CONST(0x0505050500020303), ABC_CONST(0x0505050005020303), ABC_CONST(0x0505050000020303), ABC_CONST(0x0505000505020303), ABC_CONST(0x0505000500020303), ABC_CONST(0x0505000005020303), ABC_CONST(0x0505000000020303), ABC_CONST(0x0500050505020303), ABC_CONST(0x0500050500020303), ABC_CONST(0x0500050005020303), ABC_CONST(0x0500050000020303), ABC_CONST(0x0500000505020303), ABC_CONST(0x0500000500020303), ABC_CONST(0x0500000005020303), ABC_CONST(0x0500000000020303) }, + { ABC_CONST(0x0505050505020302), ABC_CONST(0x0505050500020302), ABC_CONST(0x0505050005020302), ABC_CONST(0x0505050000020302), ABC_CONST(0x0505000505020302), ABC_CONST(0x0505000500020302), ABC_CONST(0x0505000005020302), ABC_CONST(0x0505000000020302), ABC_CONST(0x0500050505020302), ABC_CONST(0x0500050500020302), ABC_CONST(0x0500050005020302), ABC_CONST(0x0500050000020302), ABC_CONST(0x0500000505020302), ABC_CONST(0x0500000500020302), ABC_CONST(0x0500000005020302), ABC_CONST(0x0500000000020302), ABC_CONST(0x0505050505020302), ABC_CONST(0x0505050500020302), ABC_CONST(0x0505050005020302), ABC_CONST(0x0505050000020302), ABC_CONST(0x0505000505020302), ABC_CONST(0x0505000500020302), ABC_CONST(0x0505000005020302), ABC_CONST(0x0505000000020302), ABC_CONST(0x0500050505020302), ABC_CONST(0x0500050500020302), ABC_CONST(0x0500050005020302), ABC_CONST(0x0500050000020302), ABC_CONST(0x0500000505020302), ABC_CONST(0x0500000500020302), ABC_CONST(0x0500000005020302), ABC_CONST(0x0500000000020302) }, + { ABC_CONST(0x0606060606030403), ABC_CONST(0x0606060600030403), ABC_CONST(0x0606060006030403), ABC_CONST(0x0606060000030403), ABC_CONST(0x0606000606030403), ABC_CONST(0x0606000600030403), ABC_CONST(0x0606000006030403), ABC_CONST(0x0606000000030403), ABC_CONST(0x0600060606030403), ABC_CONST(0x0600060600030403), ABC_CONST(0x0600060006030403), ABC_CONST(0x0600060000030403), ABC_CONST(0x0600000606030403), ABC_CONST(0x0600000600030403), ABC_CONST(0x0600000006030403), ABC_CONST(0x0600000000030403), ABC_CONST(0x0606060606030403), ABC_CONST(0x0606060600030403), ABC_CONST(0x0606060006030403), ABC_CONST(0x0606060000030403), ABC_CONST(0x0606000606030403), ABC_CONST(0x0606000600030403), ABC_CONST(0x0606000006030403), ABC_CONST(0x0606000000030403), ABC_CONST(0x0600060606030403), ABC_CONST(0x0600060600030403), ABC_CONST(0x0600060006030403), ABC_CONST(0x0600060000030403), ABC_CONST(0x0600000606030403), ABC_CONST(0x0600000600030403), ABC_CONST(0x0600000006030403), ABC_CONST(0x0600000000030403) }, + { ABC_CONST(0x0505050505020203), ABC_CONST(0x0505050500020203), ABC_CONST(0x0505050005020203), ABC_CONST(0x0505050000020203), ABC_CONST(0x0505000505020203), ABC_CONST(0x0505000500020203), ABC_CONST(0x0505000005020203), ABC_CONST(0x0505000000020203), ABC_CONST(0x0500050505020203), ABC_CONST(0x0500050500020203), ABC_CONST(0x0500050005020203), ABC_CONST(0x0500050000020203), ABC_CONST(0x0500000505020203), ABC_CONST(0x0500000500020203), ABC_CONST(0x0500000005020203), ABC_CONST(0x0500000000020203), ABC_CONST(0x0505050505020203), ABC_CONST(0x0505050500020203), ABC_CONST(0x0505050005020203), ABC_CONST(0x0505050000020203), ABC_CONST(0x0505000505020203), ABC_CONST(0x0505000500020203), ABC_CONST(0x0505000005020203), ABC_CONST(0x0505000000020203), ABC_CONST(0x0500050505020203), ABC_CONST(0x0500050500020203), ABC_CONST(0x0500050005020203), ABC_CONST(0x0500050000020203), ABC_CONST(0x0500000505020203), ABC_CONST(0x0500000500020203), ABC_CONST(0x0500000005020203), ABC_CONST(0x0500000000020203) }, + { ABC_CONST(0x0606060606030304), ABC_CONST(0x0606060600030304), ABC_CONST(0x0606060006030304), ABC_CONST(0x0606060000030304), ABC_CONST(0x0606000606030304), ABC_CONST(0x0606000600030304), ABC_CONST(0x0606000006030304), ABC_CONST(0x0606000000030304), ABC_CONST(0x0600060606030304), ABC_CONST(0x0600060600030304), ABC_CONST(0x0600060006030304), ABC_CONST(0x0600060000030304), ABC_CONST(0x0600000606030304), ABC_CONST(0x0600000600030304), ABC_CONST(0x0600000006030304), ABC_CONST(0x0600000000030304), ABC_CONST(0x0606060606030304), ABC_CONST(0x0606060600030304), ABC_CONST(0x0606060006030304), ABC_CONST(0x0606060000030304), ABC_CONST(0x0606000606030304), ABC_CONST(0x0606000600030304), ABC_CONST(0x0606000006030304), ABC_CONST(0x0606000000030304), ABC_CONST(0x0600060606030304), ABC_CONST(0x0600060600030304), ABC_CONST(0x0600060006030304), ABC_CONST(0x0600060000030304), ABC_CONST(0x0600000606030304), ABC_CONST(0x0600000600030304), ABC_CONST(0x0600000006030304), ABC_CONST(0x0600000000030304) }, + { ABC_CONST(0x0606060606030303), ABC_CONST(0x0606060600030303), ABC_CONST(0x0606060006030303), ABC_CONST(0x0606060000030303), ABC_CONST(0x0606000606030303), ABC_CONST(0x0606000600030303), ABC_CONST(0x0606000006030303), ABC_CONST(0x0606000000030303), ABC_CONST(0x0600060606030303), ABC_CONST(0x0600060600030303), ABC_CONST(0x0600060006030303), ABC_CONST(0x0600060000030303), ABC_CONST(0x0600000606030303), ABC_CONST(0x0600000600030303), ABC_CONST(0x0600000006030303), ABC_CONST(0x0600000000030303), ABC_CONST(0x0606060606030303), ABC_CONST(0x0606060600030303), ABC_CONST(0x0606060006030303), ABC_CONST(0x0606060000030303), ABC_CONST(0x0606000606030303), ABC_CONST(0x0606000600030303), ABC_CONST(0x0606000006030303), ABC_CONST(0x0606000000030303), ABC_CONST(0x0600060606030303), ABC_CONST(0x0600060600030303), ABC_CONST(0x0600060006030303), ABC_CONST(0x0600060000030303), ABC_CONST(0x0600000606030303), ABC_CONST(0x0600000600030303), ABC_CONST(0x0600000006030303), ABC_CONST(0x0600000000030303) }, + { ABC_CONST(0x0707070707040404), ABC_CONST(0x0707070700040404), ABC_CONST(0x0707070007040404), ABC_CONST(0x0707070000040404), ABC_CONST(0x0707000707040404), ABC_CONST(0x0707000700040404), ABC_CONST(0x0707000007040404), ABC_CONST(0x0707000000040404), ABC_CONST(0x0700070707040404), ABC_CONST(0x0700070700040404), ABC_CONST(0x0700070007040404), ABC_CONST(0x0700070000040404), ABC_CONST(0x0700000707040404), ABC_CONST(0x0700000700040404), ABC_CONST(0x0700000007040404), ABC_CONST(0x0700000000040404), ABC_CONST(0x0707070707040404), ABC_CONST(0x0707070700040404), ABC_CONST(0x0707070007040404), ABC_CONST(0x0707070000040404), ABC_CONST(0x0707000707040404), ABC_CONST(0x0707000700040404), ABC_CONST(0x0707000007040404), ABC_CONST(0x0707000000040404), ABC_CONST(0x0700070707040404), ABC_CONST(0x0700070700040404), ABC_CONST(0x0700070007040404), ABC_CONST(0x0700070000040404), ABC_CONST(0x0700000707040404), ABC_CONST(0x0700000700040404), ABC_CONST(0x0700000007040404), ABC_CONST(0x0700000000040404) }, + { ABC_CONST(0x0101010101000000), ABC_CONST(0x0101010100000000), ABC_CONST(0x0101010001000000), ABC_CONST(0x0101010000000000), ABC_CONST(0x0101000101000000), ABC_CONST(0x0101000100000000), ABC_CONST(0x0101000001000000), ABC_CONST(0x0101000000000000), ABC_CONST(0x0100010101000000), ABC_CONST(0x0100010100000000), ABC_CONST(0x0100010001000000), ABC_CONST(0x0100010000000000), ABC_CONST(0x0100000101000000), ABC_CONST(0x0100000100000000), ABC_CONST(0x0100000001000000), ABC_CONST(0x0100000000000000), ABC_CONST(0x0101010101000000), ABC_CONST(0x0101010100000000), ABC_CONST(0x0101010001000000), ABC_CONST(0x0101010000000000), ABC_CONST(0x0101000101000000), ABC_CONST(0x0101000100000000), ABC_CONST(0x0101000001000000), ABC_CONST(0x0101000000000000), ABC_CONST(0x0100010101000000), ABC_CONST(0x0100010100000000), ABC_CONST(0x0100010001000000), ABC_CONST(0x0100010000000000), ABC_CONST(0x0100000101000000), ABC_CONST(0x0100000100000000), ABC_CONST(0x0100000001000000), ABC_CONST(0x0100000000000000) }, + { ABC_CONST(0x0202020202010101), ABC_CONST(0x0202020200010101), ABC_CONST(0x0202020002010101), ABC_CONST(0x0202020000010101), ABC_CONST(0x0202000202010101), ABC_CONST(0x0202000200010101), ABC_CONST(0x0202000002010101), ABC_CONST(0x0202000000010101), ABC_CONST(0x0200020202010101), ABC_CONST(0x0200020200010101), ABC_CONST(0x0200020002010101), ABC_CONST(0x0200020000010101), ABC_CONST(0x0200000202010101), ABC_CONST(0x0200000200010101), ABC_CONST(0x0200000002010101), ABC_CONST(0x0200000000010101), ABC_CONST(0x0202020202010101), ABC_CONST(0x0202020200010101), ABC_CONST(0x0202020002010101), ABC_CONST(0x0202020000010101), ABC_CONST(0x0202000202010101), ABC_CONST(0x0202000200010101), ABC_CONST(0x0202000002010101), ABC_CONST(0x0202000000010101), ABC_CONST(0x0200020202010101), ABC_CONST(0x0200020200010101), ABC_CONST(0x0200020002010101), ABC_CONST(0x0200020000010101), ABC_CONST(0x0200000202010101), ABC_CONST(0x0200000200010101), ABC_CONST(0x0200000002010101), ABC_CONST(0x0200000000010101) }, + { ABC_CONST(0x0202020202010100), ABC_CONST(0x0202020200010100), ABC_CONST(0x0202020002010100), ABC_CONST(0x0202020000010100), ABC_CONST(0x0202000202010100), ABC_CONST(0x0202000200010100), ABC_CONST(0x0202000002010100), ABC_CONST(0x0202000000010100), ABC_CONST(0x0200020202010100), ABC_CONST(0x0200020200010100), ABC_CONST(0x0200020002010100), ABC_CONST(0x0200020000010100), ABC_CONST(0x0200000202010100), ABC_CONST(0x0200000200010100), ABC_CONST(0x0200000002010100), ABC_CONST(0x0200000000010100), ABC_CONST(0x0202020202010100), ABC_CONST(0x0202020200010100), ABC_CONST(0x0202020002010100), ABC_CONST(0x0202020000010100), ABC_CONST(0x0202000202010100), ABC_CONST(0x0202000200010100), ABC_CONST(0x0202000002010100), ABC_CONST(0x0202000000010100), ABC_CONST(0x0200020202010100), ABC_CONST(0x0200020200010100), ABC_CONST(0x0200020002010100), ABC_CONST(0x0200020000010100), ABC_CONST(0x0200000202010100), ABC_CONST(0x0200000200010100), ABC_CONST(0x0200000002010100), ABC_CONST(0x0200000000010100) }, + { ABC_CONST(0x0303030303020201), ABC_CONST(0x0303030300020201), ABC_CONST(0x0303030003020201), ABC_CONST(0x0303030000020201), ABC_CONST(0x0303000303020201), ABC_CONST(0x0303000300020201), ABC_CONST(0x0303000003020201), ABC_CONST(0x0303000000020201), ABC_CONST(0x0300030303020201), ABC_CONST(0x0300030300020201), ABC_CONST(0x0300030003020201), ABC_CONST(0x0300030000020201), ABC_CONST(0x0300000303020201), ABC_CONST(0x0300000300020201), ABC_CONST(0x0300000003020201), ABC_CONST(0x0300000000020201), ABC_CONST(0x0303030303020201), ABC_CONST(0x0303030300020201), ABC_CONST(0x0303030003020201), ABC_CONST(0x0303030000020201), ABC_CONST(0x0303000303020201), ABC_CONST(0x0303000300020201), ABC_CONST(0x0303000003020201), ABC_CONST(0x0303000000020201), ABC_CONST(0x0300030303020201), ABC_CONST(0x0300030300020201), ABC_CONST(0x0300030003020201), ABC_CONST(0x0300030000020201), ABC_CONST(0x0300000303020201), ABC_CONST(0x0300000300020201), ABC_CONST(0x0300000003020201), ABC_CONST(0x0300000000020201) }, + { ABC_CONST(0x0202020202010001), ABC_CONST(0x0202020200010001), ABC_CONST(0x0202020002010001), ABC_CONST(0x0202020000010001), ABC_CONST(0x0202000202010001), ABC_CONST(0x0202000200010001), ABC_CONST(0x0202000002010001), ABC_CONST(0x0202000000010001), ABC_CONST(0x0200020202010001), ABC_CONST(0x0200020200010001), ABC_CONST(0x0200020002010001), ABC_CONST(0x0200020000010001), ABC_CONST(0x0200000202010001), ABC_CONST(0x0200000200010001), ABC_CONST(0x0200000002010001), ABC_CONST(0x0200000000010001), ABC_CONST(0x0202020202010001), ABC_CONST(0x0202020200010001), ABC_CONST(0x0202020002010001), ABC_CONST(0x0202020000010001), ABC_CONST(0x0202000202010001), ABC_CONST(0x0202000200010001), ABC_CONST(0x0202000002010001), ABC_CONST(0x0202000000010001), ABC_CONST(0x0200020202010001), ABC_CONST(0x0200020200010001), ABC_CONST(0x0200020002010001), ABC_CONST(0x0200020000010001), ABC_CONST(0x0200000202010001), ABC_CONST(0x0200000200010001), ABC_CONST(0x0200000002010001), ABC_CONST(0x0200000000010001) }, + { ABC_CONST(0x0303030303020102), ABC_CONST(0x0303030300020102), ABC_CONST(0x0303030003020102), ABC_CONST(0x0303030000020102), ABC_CONST(0x0303000303020102), ABC_CONST(0x0303000300020102), ABC_CONST(0x0303000003020102), ABC_CONST(0x0303000000020102), ABC_CONST(0x0300030303020102), ABC_CONST(0x0300030300020102), ABC_CONST(0x0300030003020102), ABC_CONST(0x0300030000020102), ABC_CONST(0x0300000303020102), ABC_CONST(0x0300000300020102), ABC_CONST(0x0300000003020102), ABC_CONST(0x0300000000020102), ABC_CONST(0x0303030303020102), ABC_CONST(0x0303030300020102), ABC_CONST(0x0303030003020102), ABC_CONST(0x0303030000020102), ABC_CONST(0x0303000303020102), ABC_CONST(0x0303000300020102), ABC_CONST(0x0303000003020102), ABC_CONST(0x0303000000020102), ABC_CONST(0x0300030303020102), ABC_CONST(0x0300030300020102), ABC_CONST(0x0300030003020102), ABC_CONST(0x0300030000020102), ABC_CONST(0x0300000303020102), ABC_CONST(0x0300000300020102), ABC_CONST(0x0300000003020102), ABC_CONST(0x0300000000020102) }, + { ABC_CONST(0x0303030303020101), ABC_CONST(0x0303030300020101), ABC_CONST(0x0303030003020101), ABC_CONST(0x0303030000020101), ABC_CONST(0x0303000303020101), ABC_CONST(0x0303000300020101), ABC_CONST(0x0303000003020101), ABC_CONST(0x0303000000020101), ABC_CONST(0x0300030303020101), ABC_CONST(0x0300030300020101), ABC_CONST(0x0300030003020101), ABC_CONST(0x0300030000020101), ABC_CONST(0x0300000303020101), ABC_CONST(0x0300000300020101), ABC_CONST(0x0300000003020101), ABC_CONST(0x0300000000020101), ABC_CONST(0x0303030303020101), ABC_CONST(0x0303030300020101), ABC_CONST(0x0303030003020101), ABC_CONST(0x0303030000020101), ABC_CONST(0x0303000303020101), ABC_CONST(0x0303000300020101), ABC_CONST(0x0303000003020101), ABC_CONST(0x0303000000020101), ABC_CONST(0x0300030303020101), ABC_CONST(0x0300030300020101), ABC_CONST(0x0300030003020101), ABC_CONST(0x0300030000020101), ABC_CONST(0x0300000303020101), ABC_CONST(0x0300000300020101), ABC_CONST(0x0300000003020101), ABC_CONST(0x0300000000020101) }, + { ABC_CONST(0x0404040404030202), ABC_CONST(0x0404040400030202), ABC_CONST(0x0404040004030202), ABC_CONST(0x0404040000030202), ABC_CONST(0x0404000404030202), ABC_CONST(0x0404000400030202), ABC_CONST(0x0404000004030202), ABC_CONST(0x0404000000030202), ABC_CONST(0x0400040404030202), ABC_CONST(0x0400040400030202), ABC_CONST(0x0400040004030202), ABC_CONST(0x0400040000030202), ABC_CONST(0x0400000404030202), ABC_CONST(0x0400000400030202), ABC_CONST(0x0400000004030202), ABC_CONST(0x0400000000030202), ABC_CONST(0x0404040404030202), ABC_CONST(0x0404040400030202), ABC_CONST(0x0404040004030202), ABC_CONST(0x0404040000030202), ABC_CONST(0x0404000404030202), ABC_CONST(0x0404000400030202), ABC_CONST(0x0404000004030202), ABC_CONST(0x0404000000030202), ABC_CONST(0x0400040404030202), ABC_CONST(0x0400040400030202), ABC_CONST(0x0400040004030202), ABC_CONST(0x0400040000030202), ABC_CONST(0x0400000404030202), ABC_CONST(0x0400000400030202), ABC_CONST(0x0400000004030202), ABC_CONST(0x0400000000030202) }, + { ABC_CONST(0x0202020202010000), ABC_CONST(0x0202020200010000), ABC_CONST(0x0202020002010000), ABC_CONST(0x0202020000010000), ABC_CONST(0x0202000202010000), ABC_CONST(0x0202000200010000), ABC_CONST(0x0202000002010000), ABC_CONST(0x0202000000010000), ABC_CONST(0x0200020202010000), ABC_CONST(0x0200020200010000), ABC_CONST(0x0200020002010000), ABC_CONST(0x0200020000010000), ABC_CONST(0x0200000202010000), ABC_CONST(0x0200000200010000), ABC_CONST(0x0200000002010000), ABC_CONST(0x0200000000010000), ABC_CONST(0x0202020202010000), ABC_CONST(0x0202020200010000), ABC_CONST(0x0202020002010000), ABC_CONST(0x0202020000010000), ABC_CONST(0x0202000202010000), ABC_CONST(0x0202000200010000), ABC_CONST(0x0202000002010000), ABC_CONST(0x0202000000010000), ABC_CONST(0x0200020202010000), ABC_CONST(0x0200020200010000), ABC_CONST(0x0200020002010000), ABC_CONST(0x0200020000010000), ABC_CONST(0x0200000202010000), ABC_CONST(0x0200000200010000), ABC_CONST(0x0200000002010000), ABC_CONST(0x0200000000010000) }, + { ABC_CONST(0x0303030303020101), ABC_CONST(0x0303030300020101), ABC_CONST(0x0303030003020101), ABC_CONST(0x0303030000020101), ABC_CONST(0x0303000303020101), ABC_CONST(0x0303000300020101), ABC_CONST(0x0303000003020101), ABC_CONST(0x0303000000020101), ABC_CONST(0x0300030303020101), ABC_CONST(0x0300030300020101), ABC_CONST(0x0300030003020101), ABC_CONST(0x0300030000020101), ABC_CONST(0x0300000303020101), ABC_CONST(0x0300000300020101), ABC_CONST(0x0300000003020101), ABC_CONST(0x0300000000020101), ABC_CONST(0x0303030303020101), ABC_CONST(0x0303030300020101), ABC_CONST(0x0303030003020101), ABC_CONST(0x0303030000020101), ABC_CONST(0x0303000303020101), ABC_CONST(0x0303000300020101), ABC_CONST(0x0303000003020101), ABC_CONST(0x0303000000020101), ABC_CONST(0x0300030303020101), ABC_CONST(0x0300030300020101), ABC_CONST(0x0300030003020101), ABC_CONST(0x0300030000020101), ABC_CONST(0x0300000303020101), ABC_CONST(0x0300000300020101), ABC_CONST(0x0300000003020101), ABC_CONST(0x0300000000020101) }, + { ABC_CONST(0x0303030303020100), ABC_CONST(0x0303030300020100), ABC_CONST(0x0303030003020100), ABC_CONST(0x0303030000020100), ABC_CONST(0x0303000303020100), ABC_CONST(0x0303000300020100), ABC_CONST(0x0303000003020100), ABC_CONST(0x0303000000020100), ABC_CONST(0x0300030303020100), ABC_CONST(0x0300030300020100), ABC_CONST(0x0300030003020100), ABC_CONST(0x0300030000020100), ABC_CONST(0x0300000303020100), ABC_CONST(0x0300000300020100), ABC_CONST(0x0300000003020100), ABC_CONST(0x0300000000020100), ABC_CONST(0x0303030303020100), ABC_CONST(0x0303030300020100), ABC_CONST(0x0303030003020100), ABC_CONST(0x0303030000020100), ABC_CONST(0x0303000303020100), ABC_CONST(0x0303000300020100), ABC_CONST(0x0303000003020100), ABC_CONST(0x0303000000020100), ABC_CONST(0x0300030303020100), ABC_CONST(0x0300030300020100), ABC_CONST(0x0300030003020100), ABC_CONST(0x0300030000020100), ABC_CONST(0x0300000303020100), ABC_CONST(0x0300000300020100), ABC_CONST(0x0300000003020100), ABC_CONST(0x0300000000020100) }, + { ABC_CONST(0x0404040404030201), ABC_CONST(0x0404040400030201), ABC_CONST(0x0404040004030201), ABC_CONST(0x0404040000030201), ABC_CONST(0x0404000404030201), ABC_CONST(0x0404000400030201), ABC_CONST(0x0404000004030201), ABC_CONST(0x0404000000030201), ABC_CONST(0x0400040404030201), ABC_CONST(0x0400040400030201), ABC_CONST(0x0400040004030201), ABC_CONST(0x0400040000030201), ABC_CONST(0x0400000404030201), ABC_CONST(0x0400000400030201), ABC_CONST(0x0400000004030201), ABC_CONST(0x0400000000030201), ABC_CONST(0x0404040404030201), ABC_CONST(0x0404040400030201), ABC_CONST(0x0404040004030201), ABC_CONST(0x0404040000030201), ABC_CONST(0x0404000404030201), ABC_CONST(0x0404000400030201), ABC_CONST(0x0404000004030201), ABC_CONST(0x0404000000030201), ABC_CONST(0x0400040404030201), ABC_CONST(0x0400040400030201), ABC_CONST(0x0400040004030201), ABC_CONST(0x0400040000030201), ABC_CONST(0x0400000404030201), ABC_CONST(0x0400000400030201), ABC_CONST(0x0400000004030201), ABC_CONST(0x0400000000030201) }, + { ABC_CONST(0x0303030303020001), ABC_CONST(0x0303030300020001), ABC_CONST(0x0303030003020001), ABC_CONST(0x0303030000020001), ABC_CONST(0x0303000303020001), ABC_CONST(0x0303000300020001), ABC_CONST(0x0303000003020001), ABC_CONST(0x0303000000020001), ABC_CONST(0x0300030303020001), ABC_CONST(0x0300030300020001), ABC_CONST(0x0300030003020001), ABC_CONST(0x0300030000020001), ABC_CONST(0x0300000303020001), ABC_CONST(0x0300000300020001), ABC_CONST(0x0300000003020001), ABC_CONST(0x0300000000020001), ABC_CONST(0x0303030303020001), ABC_CONST(0x0303030300020001), ABC_CONST(0x0303030003020001), ABC_CONST(0x0303030000020001), ABC_CONST(0x0303000303020001), ABC_CONST(0x0303000300020001), ABC_CONST(0x0303000003020001), ABC_CONST(0x0303000000020001), ABC_CONST(0x0300030303020001), ABC_CONST(0x0300030300020001), ABC_CONST(0x0300030003020001), ABC_CONST(0x0300030000020001), ABC_CONST(0x0300000303020001), ABC_CONST(0x0300000300020001), ABC_CONST(0x0300000003020001), ABC_CONST(0x0300000000020001) }, + { ABC_CONST(0x0404040404030102), ABC_CONST(0x0404040400030102), ABC_CONST(0x0404040004030102), ABC_CONST(0x0404040000030102), ABC_CONST(0x0404000404030102), ABC_CONST(0x0404000400030102), ABC_CONST(0x0404000004030102), ABC_CONST(0x0404000000030102), ABC_CONST(0x0400040404030102), ABC_CONST(0x0400040400030102), ABC_CONST(0x0400040004030102), ABC_CONST(0x0400040000030102), ABC_CONST(0x0400000404030102), ABC_CONST(0x0400000400030102), ABC_CONST(0x0400000004030102), ABC_CONST(0x0400000000030102), ABC_CONST(0x0404040404030102), ABC_CONST(0x0404040400030102), ABC_CONST(0x0404040004030102), ABC_CONST(0x0404040000030102), ABC_CONST(0x0404000404030102), ABC_CONST(0x0404000400030102), ABC_CONST(0x0404000004030102), ABC_CONST(0x0404000000030102), ABC_CONST(0x0400040404030102), ABC_CONST(0x0400040400030102), ABC_CONST(0x0400040004030102), ABC_CONST(0x0400040000030102), ABC_CONST(0x0400000404030102), ABC_CONST(0x0400000400030102), ABC_CONST(0x0400000004030102), ABC_CONST(0x0400000000030102) }, + { ABC_CONST(0x0404040404030101), ABC_CONST(0x0404040400030101), ABC_CONST(0x0404040004030101), ABC_CONST(0x0404040000030101), ABC_CONST(0x0404000404030101), ABC_CONST(0x0404000400030101), ABC_CONST(0x0404000004030101), ABC_CONST(0x0404000000030101), ABC_CONST(0x0400040404030101), ABC_CONST(0x0400040400030101), ABC_CONST(0x0400040004030101), ABC_CONST(0x0400040000030101), ABC_CONST(0x0400000404030101), ABC_CONST(0x0400000400030101), ABC_CONST(0x0400000004030101), ABC_CONST(0x0400000000030101), ABC_CONST(0x0404040404030101), ABC_CONST(0x0404040400030101), ABC_CONST(0x0404040004030101), ABC_CONST(0x0404040000030101), ABC_CONST(0x0404000404030101), ABC_CONST(0x0404000400030101), ABC_CONST(0x0404000004030101), ABC_CONST(0x0404000000030101), ABC_CONST(0x0400040404030101), ABC_CONST(0x0400040400030101), ABC_CONST(0x0400040004030101), ABC_CONST(0x0400040000030101), ABC_CONST(0x0400000404030101), ABC_CONST(0x0400000400030101), ABC_CONST(0x0400000004030101), ABC_CONST(0x0400000000030101) }, + { ABC_CONST(0x0505050505040202), ABC_CONST(0x0505050500040202), ABC_CONST(0x0505050005040202), ABC_CONST(0x0505050000040202), ABC_CONST(0x0505000505040202), ABC_CONST(0x0505000500040202), ABC_CONST(0x0505000005040202), ABC_CONST(0x0505000000040202), ABC_CONST(0x0500050505040202), ABC_CONST(0x0500050500040202), ABC_CONST(0x0500050005040202), ABC_CONST(0x0500050000040202), ABC_CONST(0x0500000505040202), ABC_CONST(0x0500000500040202), ABC_CONST(0x0500000005040202), ABC_CONST(0x0500000000040202), ABC_CONST(0x0505050505040202), ABC_CONST(0x0505050500040202), ABC_CONST(0x0505050005040202), ABC_CONST(0x0505050000040202), ABC_CONST(0x0505000505040202), ABC_CONST(0x0505000500040202), ABC_CONST(0x0505000005040202), ABC_CONST(0x0505000000040202), ABC_CONST(0x0500050505040202), ABC_CONST(0x0500050500040202), ABC_CONST(0x0500050005040202), ABC_CONST(0x0500050000040202), ABC_CONST(0x0500000505040202), ABC_CONST(0x0500000500040202), ABC_CONST(0x0500000005040202), ABC_CONST(0x0500000000040202) }, + { ABC_CONST(0x0202020202000101), ABC_CONST(0x0202020200000101), ABC_CONST(0x0202020002000101), ABC_CONST(0x0202020000000101), ABC_CONST(0x0202000202000101), ABC_CONST(0x0202000200000101), ABC_CONST(0x0202000002000101), ABC_CONST(0x0202000000000101), ABC_CONST(0x0200020202000101), ABC_CONST(0x0200020200000101), ABC_CONST(0x0200020002000101), ABC_CONST(0x0200020000000101), ABC_CONST(0x0200000202000101), ABC_CONST(0x0200000200000101), ABC_CONST(0x0200000002000101), ABC_CONST(0x0200000000000101), ABC_CONST(0x0202020202000101), ABC_CONST(0x0202020200000101), ABC_CONST(0x0202020002000101), ABC_CONST(0x0202020000000101), ABC_CONST(0x0202000202000101), ABC_CONST(0x0202000200000101), ABC_CONST(0x0202000002000101), ABC_CONST(0x0202000000000101), ABC_CONST(0x0200020202000101), ABC_CONST(0x0200020200000101), ABC_CONST(0x0200020002000101), ABC_CONST(0x0200020000000101), ABC_CONST(0x0200000202000101), ABC_CONST(0x0200000200000101), ABC_CONST(0x0200000002000101), ABC_CONST(0x0200000000000101) }, + { ABC_CONST(0x0303030303010202), ABC_CONST(0x0303030300010202), ABC_CONST(0x0303030003010202), ABC_CONST(0x0303030000010202), ABC_CONST(0x0303000303010202), ABC_CONST(0x0303000300010202), ABC_CONST(0x0303000003010202), ABC_CONST(0x0303000000010202), ABC_CONST(0x0300030303010202), ABC_CONST(0x0300030300010202), ABC_CONST(0x0300030003010202), ABC_CONST(0x0300030000010202), ABC_CONST(0x0300000303010202), ABC_CONST(0x0300000300010202), ABC_CONST(0x0300000003010202), ABC_CONST(0x0300000000010202), ABC_CONST(0x0303030303010202), ABC_CONST(0x0303030300010202), ABC_CONST(0x0303030003010202), ABC_CONST(0x0303030000010202), ABC_CONST(0x0303000303010202), ABC_CONST(0x0303000300010202), ABC_CONST(0x0303000003010202), ABC_CONST(0x0303000000010202), ABC_CONST(0x0300030303010202), ABC_CONST(0x0300030300010202), ABC_CONST(0x0300030003010202), ABC_CONST(0x0300030000010202), ABC_CONST(0x0300000303010202), ABC_CONST(0x0300000300010202), ABC_CONST(0x0300000003010202), ABC_CONST(0x0300000000010202) }, + { ABC_CONST(0x0303030303010201), ABC_CONST(0x0303030300010201), ABC_CONST(0x0303030003010201), ABC_CONST(0x0303030000010201), ABC_CONST(0x0303000303010201), ABC_CONST(0x0303000300010201), ABC_CONST(0x0303000003010201), ABC_CONST(0x0303000000010201), ABC_CONST(0x0300030303010201), ABC_CONST(0x0300030300010201), ABC_CONST(0x0300030003010201), ABC_CONST(0x0300030000010201), ABC_CONST(0x0300000303010201), ABC_CONST(0x0300000300010201), ABC_CONST(0x0300000003010201), ABC_CONST(0x0300000000010201), ABC_CONST(0x0303030303010201), ABC_CONST(0x0303030300010201), ABC_CONST(0x0303030003010201), ABC_CONST(0x0303030000010201), ABC_CONST(0x0303000303010201), ABC_CONST(0x0303000300010201), ABC_CONST(0x0303000003010201), ABC_CONST(0x0303000000010201), ABC_CONST(0x0300030303010201), ABC_CONST(0x0300030300010201), ABC_CONST(0x0300030003010201), ABC_CONST(0x0300030000010201), ABC_CONST(0x0300000303010201), ABC_CONST(0x0300000300010201), ABC_CONST(0x0300000003010201), ABC_CONST(0x0300000000010201) }, + { ABC_CONST(0x0404040404020302), ABC_CONST(0x0404040400020302), ABC_CONST(0x0404040004020302), ABC_CONST(0x0404040000020302), ABC_CONST(0x0404000404020302), ABC_CONST(0x0404000400020302), ABC_CONST(0x0404000004020302), ABC_CONST(0x0404000000020302), ABC_CONST(0x0400040404020302), ABC_CONST(0x0400040400020302), ABC_CONST(0x0400040004020302), ABC_CONST(0x0400040000020302), ABC_CONST(0x0400000404020302), ABC_CONST(0x0400000400020302), ABC_CONST(0x0400000004020302), ABC_CONST(0x0400000000020302), ABC_CONST(0x0404040404020302), ABC_CONST(0x0404040400020302), ABC_CONST(0x0404040004020302), ABC_CONST(0x0404040000020302), ABC_CONST(0x0404000404020302), ABC_CONST(0x0404000400020302), ABC_CONST(0x0404000004020302), ABC_CONST(0x0404000000020302), ABC_CONST(0x0400040404020302), ABC_CONST(0x0400040400020302), ABC_CONST(0x0400040004020302), ABC_CONST(0x0400040000020302), ABC_CONST(0x0400000404020302), ABC_CONST(0x0400000400020302), ABC_CONST(0x0400000004020302), ABC_CONST(0x0400000000020302) }, + { ABC_CONST(0x0303030303010102), ABC_CONST(0x0303030300010102), ABC_CONST(0x0303030003010102), ABC_CONST(0x0303030000010102), ABC_CONST(0x0303000303010102), ABC_CONST(0x0303000300010102), ABC_CONST(0x0303000003010102), ABC_CONST(0x0303000000010102), ABC_CONST(0x0300030303010102), ABC_CONST(0x0300030300010102), ABC_CONST(0x0300030003010102), ABC_CONST(0x0300030000010102), ABC_CONST(0x0300000303010102), ABC_CONST(0x0300000300010102), ABC_CONST(0x0300000003010102), ABC_CONST(0x0300000000010102), ABC_CONST(0x0303030303010102), ABC_CONST(0x0303030300010102), ABC_CONST(0x0303030003010102), ABC_CONST(0x0303030000010102), ABC_CONST(0x0303000303010102), ABC_CONST(0x0303000300010102), ABC_CONST(0x0303000003010102), ABC_CONST(0x0303000000010102), ABC_CONST(0x0300030303010102), ABC_CONST(0x0300030300010102), ABC_CONST(0x0300030003010102), ABC_CONST(0x0300030000010102), ABC_CONST(0x0300000303010102), ABC_CONST(0x0300000300010102), ABC_CONST(0x0300000003010102), ABC_CONST(0x0300000000010102) }, + { ABC_CONST(0x0404040404020203), ABC_CONST(0x0404040400020203), ABC_CONST(0x0404040004020203), ABC_CONST(0x0404040000020203), ABC_CONST(0x0404000404020203), ABC_CONST(0x0404000400020203), ABC_CONST(0x0404000004020203), ABC_CONST(0x0404000000020203), ABC_CONST(0x0400040404020203), ABC_CONST(0x0400040400020203), ABC_CONST(0x0400040004020203), ABC_CONST(0x0400040000020203), ABC_CONST(0x0400000404020203), ABC_CONST(0x0400000400020203), ABC_CONST(0x0400000004020203), ABC_CONST(0x0400000000020203), ABC_CONST(0x0404040404020203), ABC_CONST(0x0404040400020203), ABC_CONST(0x0404040004020203), ABC_CONST(0x0404040000020203), ABC_CONST(0x0404000404020203), ABC_CONST(0x0404000400020203), ABC_CONST(0x0404000004020203), ABC_CONST(0x0404000000020203), ABC_CONST(0x0400040404020203), ABC_CONST(0x0400040400020203), ABC_CONST(0x0400040004020203), ABC_CONST(0x0400040000020203), ABC_CONST(0x0400000404020203), ABC_CONST(0x0400000400020203), ABC_CONST(0x0400000004020203), ABC_CONST(0x0400000000020203) }, + { ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202), ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202) }, + { ABC_CONST(0x0505050505030303), ABC_CONST(0x0505050500030303), ABC_CONST(0x0505050005030303), ABC_CONST(0x0505050000030303), ABC_CONST(0x0505000505030303), ABC_CONST(0x0505000500030303), ABC_CONST(0x0505000005030303), ABC_CONST(0x0505000000030303), ABC_CONST(0x0500050505030303), ABC_CONST(0x0500050500030303), ABC_CONST(0x0500050005030303), ABC_CONST(0x0500050000030303), ABC_CONST(0x0500000505030303), ABC_CONST(0x0500000500030303), ABC_CONST(0x0500000005030303), ABC_CONST(0x0500000000030303), ABC_CONST(0x0505050505030303), ABC_CONST(0x0505050500030303), ABC_CONST(0x0505050005030303), ABC_CONST(0x0505050000030303), ABC_CONST(0x0505000505030303), ABC_CONST(0x0505000500030303), ABC_CONST(0x0505000005030303), ABC_CONST(0x0505000000030303), ABC_CONST(0x0500050505030303), ABC_CONST(0x0500050500030303), ABC_CONST(0x0500050005030303), ABC_CONST(0x0500050000030303), ABC_CONST(0x0500000505030303), ABC_CONST(0x0500000500030303), ABC_CONST(0x0500000005030303), ABC_CONST(0x0500000000030303) }, + { ABC_CONST(0x0303030303010101), ABC_CONST(0x0303030300010101), ABC_CONST(0x0303030003010101), ABC_CONST(0x0303030000010101), ABC_CONST(0x0303000303010101), ABC_CONST(0x0303000300010101), ABC_CONST(0x0303000003010101), ABC_CONST(0x0303000000010101), ABC_CONST(0x0300030303010101), ABC_CONST(0x0300030300010101), ABC_CONST(0x0300030003010101), ABC_CONST(0x0300030000010101), ABC_CONST(0x0300000303010101), ABC_CONST(0x0300000300010101), ABC_CONST(0x0300000003010101), ABC_CONST(0x0300000000010101), ABC_CONST(0x0303030303010101), ABC_CONST(0x0303030300010101), ABC_CONST(0x0303030003010101), ABC_CONST(0x0303030000010101), ABC_CONST(0x0303000303010101), ABC_CONST(0x0303000300010101), ABC_CONST(0x0303000003010101), ABC_CONST(0x0303000000010101), ABC_CONST(0x0300030303010101), ABC_CONST(0x0300030300010101), ABC_CONST(0x0300030003010101), ABC_CONST(0x0300030000010101), ABC_CONST(0x0300000303010101), ABC_CONST(0x0300000300010101), ABC_CONST(0x0300000003010101), ABC_CONST(0x0300000000010101) }, + { ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202), ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202) }, + { ABC_CONST(0x0404040404020201), ABC_CONST(0x0404040400020201), ABC_CONST(0x0404040004020201), ABC_CONST(0x0404040000020201), ABC_CONST(0x0404000404020201), ABC_CONST(0x0404000400020201), ABC_CONST(0x0404000004020201), ABC_CONST(0x0404000000020201), ABC_CONST(0x0400040404020201), ABC_CONST(0x0400040400020201), ABC_CONST(0x0400040004020201), ABC_CONST(0x0400040000020201), ABC_CONST(0x0400000404020201), ABC_CONST(0x0400000400020201), ABC_CONST(0x0400000004020201), ABC_CONST(0x0400000000020201), ABC_CONST(0x0404040404020201), ABC_CONST(0x0404040400020201), ABC_CONST(0x0404040004020201), ABC_CONST(0x0404040000020201), ABC_CONST(0x0404000404020201), ABC_CONST(0x0404000400020201), ABC_CONST(0x0404000004020201), ABC_CONST(0x0404000000020201), ABC_CONST(0x0400040404020201), ABC_CONST(0x0400040400020201), ABC_CONST(0x0400040004020201), ABC_CONST(0x0400040000020201), ABC_CONST(0x0400000404020201), ABC_CONST(0x0400000400020201), ABC_CONST(0x0400000004020201), ABC_CONST(0x0400000000020201) }, + { ABC_CONST(0x0505050505030302), ABC_CONST(0x0505050500030302), ABC_CONST(0x0505050005030302), ABC_CONST(0x0505050000030302), ABC_CONST(0x0505000505030302), ABC_CONST(0x0505000500030302), ABC_CONST(0x0505000005030302), ABC_CONST(0x0505000000030302), ABC_CONST(0x0500050505030302), ABC_CONST(0x0500050500030302), ABC_CONST(0x0500050005030302), ABC_CONST(0x0500050000030302), ABC_CONST(0x0500000505030302), ABC_CONST(0x0500000500030302), ABC_CONST(0x0500000005030302), ABC_CONST(0x0500000000030302), ABC_CONST(0x0505050505030302), ABC_CONST(0x0505050500030302), ABC_CONST(0x0505050005030302), ABC_CONST(0x0505050000030302), ABC_CONST(0x0505000505030302), ABC_CONST(0x0505000500030302), ABC_CONST(0x0505000005030302), ABC_CONST(0x0505000000030302), ABC_CONST(0x0500050505030302), ABC_CONST(0x0500050500030302), ABC_CONST(0x0500050005030302), ABC_CONST(0x0500050000030302), ABC_CONST(0x0500000505030302), ABC_CONST(0x0500000500030302), ABC_CONST(0x0500000005030302), ABC_CONST(0x0500000000030302) }, + { ABC_CONST(0x0404040404020102), ABC_CONST(0x0404040400020102), ABC_CONST(0x0404040004020102), ABC_CONST(0x0404040000020102), ABC_CONST(0x0404000404020102), ABC_CONST(0x0404000400020102), ABC_CONST(0x0404000004020102), ABC_CONST(0x0404000000020102), ABC_CONST(0x0400040404020102), ABC_CONST(0x0400040400020102), ABC_CONST(0x0400040004020102), ABC_CONST(0x0400040000020102), ABC_CONST(0x0400000404020102), ABC_CONST(0x0400000400020102), ABC_CONST(0x0400000004020102), ABC_CONST(0x0400000000020102), ABC_CONST(0x0404040404020102), ABC_CONST(0x0404040400020102), ABC_CONST(0x0404040004020102), ABC_CONST(0x0404040000020102), ABC_CONST(0x0404000404020102), ABC_CONST(0x0404000400020102), ABC_CONST(0x0404000004020102), ABC_CONST(0x0404000000020102), ABC_CONST(0x0400040404020102), ABC_CONST(0x0400040400020102), ABC_CONST(0x0400040004020102), ABC_CONST(0x0400040000020102), ABC_CONST(0x0400000404020102), ABC_CONST(0x0400000400020102), ABC_CONST(0x0400000004020102), ABC_CONST(0x0400000000020102) }, + { ABC_CONST(0x0505050505030203), ABC_CONST(0x0505050500030203), ABC_CONST(0x0505050005030203), ABC_CONST(0x0505050000030203), ABC_CONST(0x0505000505030203), ABC_CONST(0x0505000500030203), ABC_CONST(0x0505000005030203), ABC_CONST(0x0505000000030203), ABC_CONST(0x0500050505030203), ABC_CONST(0x0500050500030203), ABC_CONST(0x0500050005030203), ABC_CONST(0x0500050000030203), ABC_CONST(0x0500000505030203), ABC_CONST(0x0500000500030203), ABC_CONST(0x0500000005030203), ABC_CONST(0x0500000000030203), ABC_CONST(0x0505050505030203), ABC_CONST(0x0505050500030203), ABC_CONST(0x0505050005030203), ABC_CONST(0x0505050000030203), ABC_CONST(0x0505000505030203), ABC_CONST(0x0505000500030203), ABC_CONST(0x0505000005030203), ABC_CONST(0x0505000000030203), ABC_CONST(0x0500050505030203), ABC_CONST(0x0500050500030203), ABC_CONST(0x0500050005030203), ABC_CONST(0x0500050000030203), ABC_CONST(0x0500000505030203), ABC_CONST(0x0500000500030203), ABC_CONST(0x0500000005030203), ABC_CONST(0x0500000000030203) }, + { ABC_CONST(0x0505050505030202), ABC_CONST(0x0505050500030202), ABC_CONST(0x0505050005030202), ABC_CONST(0x0505050000030202), ABC_CONST(0x0505000505030202), ABC_CONST(0x0505000500030202), ABC_CONST(0x0505000005030202), ABC_CONST(0x0505000000030202), ABC_CONST(0x0500050505030202), ABC_CONST(0x0500050500030202), ABC_CONST(0x0500050005030202), ABC_CONST(0x0500050000030202), ABC_CONST(0x0500000505030202), ABC_CONST(0x0500000500030202), ABC_CONST(0x0500000005030202), ABC_CONST(0x0500000000030202), ABC_CONST(0x0505050505030202), ABC_CONST(0x0505050500030202), ABC_CONST(0x0505050005030202), ABC_CONST(0x0505050000030202), ABC_CONST(0x0505000505030202), ABC_CONST(0x0505000500030202), ABC_CONST(0x0505000005030202), ABC_CONST(0x0505000000030202), ABC_CONST(0x0500050505030202), ABC_CONST(0x0500050500030202), ABC_CONST(0x0500050005030202), ABC_CONST(0x0500050000030202), ABC_CONST(0x0500000505030202), ABC_CONST(0x0500000500030202), ABC_CONST(0x0500000005030202), ABC_CONST(0x0500000000030202) }, + { ABC_CONST(0x0606060606040303), ABC_CONST(0x0606060600040303), ABC_CONST(0x0606060006040303), ABC_CONST(0x0606060000040303), ABC_CONST(0x0606000606040303), ABC_CONST(0x0606000600040303), ABC_CONST(0x0606000006040303), ABC_CONST(0x0606000000040303), ABC_CONST(0x0600060606040303), ABC_CONST(0x0600060600040303), ABC_CONST(0x0600060006040303), ABC_CONST(0x0600060000040303), ABC_CONST(0x0600000606040303), ABC_CONST(0x0600000600040303), ABC_CONST(0x0600000006040303), ABC_CONST(0x0600000000040303), ABC_CONST(0x0606060606040303), ABC_CONST(0x0606060600040303), ABC_CONST(0x0606060006040303), ABC_CONST(0x0606060000040303), ABC_CONST(0x0606000606040303), ABC_CONST(0x0606000600040303), ABC_CONST(0x0606000006040303), ABC_CONST(0x0606000000040303), ABC_CONST(0x0600060606040303), ABC_CONST(0x0600060600040303), ABC_CONST(0x0600060006040303), ABC_CONST(0x0600060000040303), ABC_CONST(0x0600000606040303), ABC_CONST(0x0600000600040303), ABC_CONST(0x0600000006040303), ABC_CONST(0x0600000000040303) }, + { ABC_CONST(0x0202020202000100), ABC_CONST(0x0202020200000100), ABC_CONST(0x0202020002000100), ABC_CONST(0x0202020000000100), ABC_CONST(0x0202000202000100), ABC_CONST(0x0202000200000100), ABC_CONST(0x0202000002000100), ABC_CONST(0x0202000000000100), ABC_CONST(0x0200020202000100), ABC_CONST(0x0200020200000100), ABC_CONST(0x0200020002000100), ABC_CONST(0x0200020000000100), ABC_CONST(0x0200000202000100), ABC_CONST(0x0200000200000100), ABC_CONST(0x0200000002000100), ABC_CONST(0x0200000000000100), ABC_CONST(0x0202020202000100), ABC_CONST(0x0202020200000100), ABC_CONST(0x0202020002000100), ABC_CONST(0x0202020000000100), ABC_CONST(0x0202000202000100), ABC_CONST(0x0202000200000100), ABC_CONST(0x0202000002000100), ABC_CONST(0x0202000000000100), ABC_CONST(0x0200020202000100), ABC_CONST(0x0200020200000100), ABC_CONST(0x0200020002000100), ABC_CONST(0x0200020000000100), ABC_CONST(0x0200000202000100), ABC_CONST(0x0200000200000100), ABC_CONST(0x0200000002000100), ABC_CONST(0x0200000000000100) }, + { ABC_CONST(0x0303030303010201), ABC_CONST(0x0303030300010201), ABC_CONST(0x0303030003010201), ABC_CONST(0x0303030000010201), ABC_CONST(0x0303000303010201), ABC_CONST(0x0303000300010201), ABC_CONST(0x0303000003010201), ABC_CONST(0x0303000000010201), ABC_CONST(0x0300030303010201), ABC_CONST(0x0300030300010201), ABC_CONST(0x0300030003010201), ABC_CONST(0x0300030000010201), ABC_CONST(0x0300000303010201), ABC_CONST(0x0300000300010201), ABC_CONST(0x0300000003010201), ABC_CONST(0x0300000000010201), ABC_CONST(0x0303030303010201), ABC_CONST(0x0303030300010201), ABC_CONST(0x0303030003010201), ABC_CONST(0x0303030000010201), ABC_CONST(0x0303000303010201), ABC_CONST(0x0303000300010201), ABC_CONST(0x0303000003010201), ABC_CONST(0x0303000000010201), ABC_CONST(0x0300030303010201), ABC_CONST(0x0300030300010201), ABC_CONST(0x0300030003010201), ABC_CONST(0x0300030000010201), ABC_CONST(0x0300000303010201), ABC_CONST(0x0300000300010201), ABC_CONST(0x0300000003010201), ABC_CONST(0x0300000000010201) }, + { ABC_CONST(0x0303030303010200), ABC_CONST(0x0303030300010200), ABC_CONST(0x0303030003010200), ABC_CONST(0x0303030000010200), ABC_CONST(0x0303000303010200), ABC_CONST(0x0303000300010200), ABC_CONST(0x0303000003010200), ABC_CONST(0x0303000000010200), ABC_CONST(0x0300030303010200), ABC_CONST(0x0300030300010200), ABC_CONST(0x0300030003010200), ABC_CONST(0x0300030000010200), ABC_CONST(0x0300000303010200), ABC_CONST(0x0300000300010200), ABC_CONST(0x0300000003010200), ABC_CONST(0x0300000000010200), ABC_CONST(0x0303030303010200), ABC_CONST(0x0303030300010200), ABC_CONST(0x0303030003010200), ABC_CONST(0x0303030000010200), ABC_CONST(0x0303000303010200), ABC_CONST(0x0303000300010200), ABC_CONST(0x0303000003010200), ABC_CONST(0x0303000000010200), ABC_CONST(0x0300030303010200), ABC_CONST(0x0300030300010200), ABC_CONST(0x0300030003010200), ABC_CONST(0x0300030000010200), ABC_CONST(0x0300000303010200), ABC_CONST(0x0300000300010200), ABC_CONST(0x0300000003010200), ABC_CONST(0x0300000000010200) }, + { ABC_CONST(0x0404040404020301), ABC_CONST(0x0404040400020301), ABC_CONST(0x0404040004020301), ABC_CONST(0x0404040000020301), ABC_CONST(0x0404000404020301), ABC_CONST(0x0404000400020301), ABC_CONST(0x0404000004020301), ABC_CONST(0x0404000000020301), ABC_CONST(0x0400040404020301), ABC_CONST(0x0400040400020301), ABC_CONST(0x0400040004020301), ABC_CONST(0x0400040000020301), ABC_CONST(0x0400000404020301), ABC_CONST(0x0400000400020301), ABC_CONST(0x0400000004020301), ABC_CONST(0x0400000000020301), ABC_CONST(0x0404040404020301), ABC_CONST(0x0404040400020301), ABC_CONST(0x0404040004020301), ABC_CONST(0x0404040000020301), ABC_CONST(0x0404000404020301), ABC_CONST(0x0404000400020301), ABC_CONST(0x0404000004020301), ABC_CONST(0x0404000000020301), ABC_CONST(0x0400040404020301), ABC_CONST(0x0400040400020301), ABC_CONST(0x0400040004020301), ABC_CONST(0x0400040000020301), ABC_CONST(0x0400000404020301), ABC_CONST(0x0400000400020301), ABC_CONST(0x0400000004020301), ABC_CONST(0x0400000000020301) }, + { ABC_CONST(0x0303030303010101), ABC_CONST(0x0303030300010101), ABC_CONST(0x0303030003010101), ABC_CONST(0x0303030000010101), ABC_CONST(0x0303000303010101), ABC_CONST(0x0303000300010101), ABC_CONST(0x0303000003010101), ABC_CONST(0x0303000000010101), ABC_CONST(0x0300030303010101), ABC_CONST(0x0300030300010101), ABC_CONST(0x0300030003010101), ABC_CONST(0x0300030000010101), ABC_CONST(0x0300000303010101), ABC_CONST(0x0300000300010101), ABC_CONST(0x0300000003010101), ABC_CONST(0x0300000000010101), ABC_CONST(0x0303030303010101), ABC_CONST(0x0303030300010101), ABC_CONST(0x0303030003010101), ABC_CONST(0x0303030000010101), ABC_CONST(0x0303000303010101), ABC_CONST(0x0303000300010101), ABC_CONST(0x0303000003010101), ABC_CONST(0x0303000000010101), ABC_CONST(0x0300030303010101), ABC_CONST(0x0300030300010101), ABC_CONST(0x0300030003010101), ABC_CONST(0x0300030000010101), ABC_CONST(0x0300000303010101), ABC_CONST(0x0300000300010101), ABC_CONST(0x0300000003010101), ABC_CONST(0x0300000000010101) }, + { ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202), ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202) }, + { ABC_CONST(0x0404040404020201), ABC_CONST(0x0404040400020201), ABC_CONST(0x0404040004020201), ABC_CONST(0x0404040000020201), ABC_CONST(0x0404000404020201), ABC_CONST(0x0404000400020201), ABC_CONST(0x0404000004020201), ABC_CONST(0x0404000000020201), ABC_CONST(0x0400040404020201), ABC_CONST(0x0400040400020201), ABC_CONST(0x0400040004020201), ABC_CONST(0x0400040000020201), ABC_CONST(0x0400000404020201), ABC_CONST(0x0400000400020201), ABC_CONST(0x0400000004020201), ABC_CONST(0x0400000000020201), ABC_CONST(0x0404040404020201), ABC_CONST(0x0404040400020201), ABC_CONST(0x0404040004020201), ABC_CONST(0x0404040000020201), ABC_CONST(0x0404000404020201), ABC_CONST(0x0404000400020201), ABC_CONST(0x0404000004020201), ABC_CONST(0x0404000000020201), ABC_CONST(0x0400040404020201), ABC_CONST(0x0400040400020201), ABC_CONST(0x0400040004020201), ABC_CONST(0x0400040000020201), ABC_CONST(0x0400000404020201), ABC_CONST(0x0400000400020201), ABC_CONST(0x0400000004020201), ABC_CONST(0x0400000000020201) }, + { ABC_CONST(0x0505050505030302), ABC_CONST(0x0505050500030302), ABC_CONST(0x0505050005030302), ABC_CONST(0x0505050000030302), ABC_CONST(0x0505000505030302), ABC_CONST(0x0505000500030302), ABC_CONST(0x0505000005030302), ABC_CONST(0x0505000000030302), ABC_CONST(0x0500050505030302), ABC_CONST(0x0500050500030302), ABC_CONST(0x0500050005030302), ABC_CONST(0x0500050000030302), ABC_CONST(0x0500000505030302), ABC_CONST(0x0500000500030302), ABC_CONST(0x0500000005030302), ABC_CONST(0x0500000000030302), ABC_CONST(0x0505050505030302), ABC_CONST(0x0505050500030302), ABC_CONST(0x0505050005030302), ABC_CONST(0x0505050000030302), ABC_CONST(0x0505000505030302), ABC_CONST(0x0505000500030302), ABC_CONST(0x0505000005030302), ABC_CONST(0x0505000000030302), ABC_CONST(0x0500050505030302), ABC_CONST(0x0500050500030302), ABC_CONST(0x0500050005030302), ABC_CONST(0x0500050000030302), ABC_CONST(0x0500000505030302), ABC_CONST(0x0500000500030302), ABC_CONST(0x0500000005030302), ABC_CONST(0x0500000000030302) }, + { ABC_CONST(0x0303030303010100), ABC_CONST(0x0303030300010100), ABC_CONST(0x0303030003010100), ABC_CONST(0x0303030000010100), ABC_CONST(0x0303000303010100), ABC_CONST(0x0303000300010100), ABC_CONST(0x0303000003010100), ABC_CONST(0x0303000000010100), ABC_CONST(0x0300030303010100), ABC_CONST(0x0300030300010100), ABC_CONST(0x0300030003010100), ABC_CONST(0x0300030000010100), ABC_CONST(0x0300000303010100), ABC_CONST(0x0300000300010100), ABC_CONST(0x0300000003010100), ABC_CONST(0x0300000000010100), ABC_CONST(0x0303030303010100), ABC_CONST(0x0303030300010100), ABC_CONST(0x0303030003010100), ABC_CONST(0x0303030000010100), ABC_CONST(0x0303000303010100), ABC_CONST(0x0303000300010100), ABC_CONST(0x0303000003010100), ABC_CONST(0x0303000000010100), ABC_CONST(0x0300030303010100), ABC_CONST(0x0300030300010100), ABC_CONST(0x0300030003010100), ABC_CONST(0x0300030000010100), ABC_CONST(0x0300000303010100), ABC_CONST(0x0300000300010100), ABC_CONST(0x0300000003010100), ABC_CONST(0x0300000000010100) }, + { ABC_CONST(0x0404040404020201), ABC_CONST(0x0404040400020201), ABC_CONST(0x0404040004020201), ABC_CONST(0x0404040000020201), ABC_CONST(0x0404000404020201), ABC_CONST(0x0404000400020201), ABC_CONST(0x0404000004020201), ABC_CONST(0x0404000000020201), ABC_CONST(0x0400040404020201), ABC_CONST(0x0400040400020201), ABC_CONST(0x0400040004020201), ABC_CONST(0x0400040000020201), ABC_CONST(0x0400000404020201), ABC_CONST(0x0400000400020201), ABC_CONST(0x0400000004020201), ABC_CONST(0x0400000000020201), ABC_CONST(0x0404040404020201), ABC_CONST(0x0404040400020201), ABC_CONST(0x0404040004020201), ABC_CONST(0x0404040000020201), ABC_CONST(0x0404000404020201), ABC_CONST(0x0404000400020201), ABC_CONST(0x0404000004020201), ABC_CONST(0x0404000000020201), ABC_CONST(0x0400040404020201), ABC_CONST(0x0400040400020201), ABC_CONST(0x0400040004020201), ABC_CONST(0x0400040000020201), ABC_CONST(0x0400000404020201), ABC_CONST(0x0400000400020201), ABC_CONST(0x0400000004020201), ABC_CONST(0x0400000000020201) }, + { ABC_CONST(0x0404040404020200), ABC_CONST(0x0404040400020200), ABC_CONST(0x0404040004020200), ABC_CONST(0x0404040000020200), ABC_CONST(0x0404000404020200), ABC_CONST(0x0404000400020200), ABC_CONST(0x0404000004020200), ABC_CONST(0x0404000000020200), ABC_CONST(0x0400040404020200), ABC_CONST(0x0400040400020200), ABC_CONST(0x0400040004020200), ABC_CONST(0x0400040000020200), ABC_CONST(0x0400000404020200), ABC_CONST(0x0400000400020200), ABC_CONST(0x0400000004020200), ABC_CONST(0x0400000000020200), ABC_CONST(0x0404040404020200), ABC_CONST(0x0404040400020200), ABC_CONST(0x0404040004020200), ABC_CONST(0x0404040000020200), ABC_CONST(0x0404000404020200), ABC_CONST(0x0404000400020200), ABC_CONST(0x0404000004020200), ABC_CONST(0x0404000000020200), ABC_CONST(0x0400040404020200), ABC_CONST(0x0400040400020200), ABC_CONST(0x0400040004020200), ABC_CONST(0x0400040000020200), ABC_CONST(0x0400000404020200), ABC_CONST(0x0400000400020200), ABC_CONST(0x0400000004020200), ABC_CONST(0x0400000000020200) }, + { ABC_CONST(0x0505050505030301), ABC_CONST(0x0505050500030301), ABC_CONST(0x0505050005030301), ABC_CONST(0x0505050000030301), ABC_CONST(0x0505000505030301), ABC_CONST(0x0505000500030301), ABC_CONST(0x0505000005030301), ABC_CONST(0x0505000000030301), ABC_CONST(0x0500050505030301), ABC_CONST(0x0500050500030301), ABC_CONST(0x0500050005030301), ABC_CONST(0x0500050000030301), ABC_CONST(0x0500000505030301), ABC_CONST(0x0500000500030301), ABC_CONST(0x0500000005030301), ABC_CONST(0x0500000000030301), ABC_CONST(0x0505050505030301), ABC_CONST(0x0505050500030301), ABC_CONST(0x0505050005030301), ABC_CONST(0x0505050000030301), ABC_CONST(0x0505000505030301), ABC_CONST(0x0505000500030301), ABC_CONST(0x0505000005030301), ABC_CONST(0x0505000000030301), ABC_CONST(0x0500050505030301), ABC_CONST(0x0500050500030301), ABC_CONST(0x0500050005030301), ABC_CONST(0x0500050000030301), ABC_CONST(0x0500000505030301), ABC_CONST(0x0500000500030301), ABC_CONST(0x0500000005030301), ABC_CONST(0x0500000000030301) }, + { ABC_CONST(0x0404040404020101), ABC_CONST(0x0404040400020101), ABC_CONST(0x0404040004020101), ABC_CONST(0x0404040000020101), ABC_CONST(0x0404000404020101), ABC_CONST(0x0404000400020101), ABC_CONST(0x0404000004020101), ABC_CONST(0x0404000000020101), ABC_CONST(0x0400040404020101), ABC_CONST(0x0400040400020101), ABC_CONST(0x0400040004020101), ABC_CONST(0x0400040000020101), ABC_CONST(0x0400000404020101), ABC_CONST(0x0400000400020101), ABC_CONST(0x0400000004020101), ABC_CONST(0x0400000000020101), ABC_CONST(0x0404040404020101), ABC_CONST(0x0404040400020101), ABC_CONST(0x0404040004020101), ABC_CONST(0x0404040000020101), ABC_CONST(0x0404000404020101), ABC_CONST(0x0404000400020101), ABC_CONST(0x0404000004020101), ABC_CONST(0x0404000000020101), ABC_CONST(0x0400040404020101), ABC_CONST(0x0400040400020101), ABC_CONST(0x0400040004020101), ABC_CONST(0x0400040000020101), ABC_CONST(0x0400000404020101), ABC_CONST(0x0400000400020101), ABC_CONST(0x0400000004020101), ABC_CONST(0x0400000000020101) }, + { ABC_CONST(0x0505050505030202), ABC_CONST(0x0505050500030202), ABC_CONST(0x0505050005030202), ABC_CONST(0x0505050000030202), ABC_CONST(0x0505000505030202), ABC_CONST(0x0505000500030202), ABC_CONST(0x0505000005030202), ABC_CONST(0x0505000000030202), ABC_CONST(0x0500050505030202), ABC_CONST(0x0500050500030202), ABC_CONST(0x0500050005030202), ABC_CONST(0x0500050000030202), ABC_CONST(0x0500000505030202), ABC_CONST(0x0500000500030202), ABC_CONST(0x0500000005030202), ABC_CONST(0x0500000000030202), ABC_CONST(0x0505050505030202), ABC_CONST(0x0505050500030202), ABC_CONST(0x0505050005030202), ABC_CONST(0x0505050000030202), ABC_CONST(0x0505000505030202), ABC_CONST(0x0505000500030202), ABC_CONST(0x0505000005030202), ABC_CONST(0x0505000000030202), ABC_CONST(0x0500050505030202), ABC_CONST(0x0500050500030202), ABC_CONST(0x0500050005030202), ABC_CONST(0x0500050000030202), ABC_CONST(0x0500000505030202), ABC_CONST(0x0500000500030202), ABC_CONST(0x0500000005030202), ABC_CONST(0x0500000000030202) }, + { ABC_CONST(0x0505050505030201), ABC_CONST(0x0505050500030201), ABC_CONST(0x0505050005030201), ABC_CONST(0x0505050000030201), ABC_CONST(0x0505000505030201), ABC_CONST(0x0505000500030201), ABC_CONST(0x0505000005030201), ABC_CONST(0x0505000000030201), ABC_CONST(0x0500050505030201), ABC_CONST(0x0500050500030201), ABC_CONST(0x0500050005030201), ABC_CONST(0x0500050000030201), ABC_CONST(0x0500000505030201), ABC_CONST(0x0500000500030201), ABC_CONST(0x0500000005030201), ABC_CONST(0x0500000000030201), ABC_CONST(0x0505050505030201), ABC_CONST(0x0505050500030201), ABC_CONST(0x0505050005030201), ABC_CONST(0x0505050000030201), ABC_CONST(0x0505000505030201), ABC_CONST(0x0505000500030201), ABC_CONST(0x0505000005030201), ABC_CONST(0x0505000000030201), ABC_CONST(0x0500050505030201), ABC_CONST(0x0500050500030201), ABC_CONST(0x0500050005030201), ABC_CONST(0x0500050000030201), ABC_CONST(0x0500000505030201), ABC_CONST(0x0500000500030201), ABC_CONST(0x0500000005030201), ABC_CONST(0x0500000000030201) }, + { ABC_CONST(0x0606060606040302), ABC_CONST(0x0606060600040302), ABC_CONST(0x0606060006040302), ABC_CONST(0x0606060000040302), ABC_CONST(0x0606000606040302), ABC_CONST(0x0606000600040302), ABC_CONST(0x0606000006040302), ABC_CONST(0x0606000000040302), ABC_CONST(0x0600060606040302), ABC_CONST(0x0600060600040302), ABC_CONST(0x0600060006040302), ABC_CONST(0x0600060000040302), ABC_CONST(0x0600000606040302), ABC_CONST(0x0600000600040302), ABC_CONST(0x0600000006040302), ABC_CONST(0x0600000000040302), ABC_CONST(0x0606060606040302), ABC_CONST(0x0606060600040302), ABC_CONST(0x0606060006040302), ABC_CONST(0x0606060000040302), ABC_CONST(0x0606000606040302), ABC_CONST(0x0606000600040302), ABC_CONST(0x0606000006040302), ABC_CONST(0x0606000000040302), ABC_CONST(0x0600060606040302), ABC_CONST(0x0600060600040302), ABC_CONST(0x0600060006040302), ABC_CONST(0x0600060000040302), ABC_CONST(0x0600000606040302), ABC_CONST(0x0600000600040302), ABC_CONST(0x0600000006040302), ABC_CONST(0x0600000000040302) }, + { ABC_CONST(0x0303030303000201), ABC_CONST(0x0303030300000201), ABC_CONST(0x0303030003000201), ABC_CONST(0x0303030000000201), ABC_CONST(0x0303000303000201), ABC_CONST(0x0303000300000201), ABC_CONST(0x0303000003000201), ABC_CONST(0x0303000000000201), ABC_CONST(0x0300030303000201), ABC_CONST(0x0300030300000201), ABC_CONST(0x0300030003000201), ABC_CONST(0x0300030000000201), ABC_CONST(0x0300000303000201), ABC_CONST(0x0300000300000201), ABC_CONST(0x0300000003000201), ABC_CONST(0x0300000000000201), ABC_CONST(0x0303030303000201), ABC_CONST(0x0303030300000201), ABC_CONST(0x0303030003000201), ABC_CONST(0x0303030000000201), ABC_CONST(0x0303000303000201), ABC_CONST(0x0303000300000201), ABC_CONST(0x0303000003000201), ABC_CONST(0x0303000000000201), ABC_CONST(0x0300030303000201), ABC_CONST(0x0300030300000201), ABC_CONST(0x0300030003000201), ABC_CONST(0x0300030000000201), ABC_CONST(0x0300000303000201), ABC_CONST(0x0300000300000201), ABC_CONST(0x0300000003000201), ABC_CONST(0x0300000000000201) }, + { ABC_CONST(0x0404040404010302), ABC_CONST(0x0404040400010302), ABC_CONST(0x0404040004010302), ABC_CONST(0x0404040000010302), ABC_CONST(0x0404000404010302), ABC_CONST(0x0404000400010302), ABC_CONST(0x0404000004010302), ABC_CONST(0x0404000000010302), ABC_CONST(0x0400040404010302), ABC_CONST(0x0400040400010302), ABC_CONST(0x0400040004010302), ABC_CONST(0x0400040000010302), ABC_CONST(0x0400000404010302), ABC_CONST(0x0400000400010302), ABC_CONST(0x0400000004010302), ABC_CONST(0x0400000000010302), ABC_CONST(0x0404040404010302), ABC_CONST(0x0404040400010302), ABC_CONST(0x0404040004010302), ABC_CONST(0x0404040000010302), ABC_CONST(0x0404000404010302), ABC_CONST(0x0404000400010302), ABC_CONST(0x0404000004010302), ABC_CONST(0x0404000000010302), ABC_CONST(0x0400040404010302), ABC_CONST(0x0400040400010302), ABC_CONST(0x0400040004010302), ABC_CONST(0x0400040000010302), ABC_CONST(0x0400000404010302), ABC_CONST(0x0400000400010302), ABC_CONST(0x0400000004010302), ABC_CONST(0x0400000000010302) }, + { ABC_CONST(0x0404040404010301), ABC_CONST(0x0404040400010301), ABC_CONST(0x0404040004010301), ABC_CONST(0x0404040000010301), ABC_CONST(0x0404000404010301), ABC_CONST(0x0404000400010301), ABC_CONST(0x0404000004010301), ABC_CONST(0x0404000000010301), ABC_CONST(0x0400040404010301), ABC_CONST(0x0400040400010301), ABC_CONST(0x0400040004010301), ABC_CONST(0x0400040000010301), ABC_CONST(0x0400000404010301), ABC_CONST(0x0400000400010301), ABC_CONST(0x0400000004010301), ABC_CONST(0x0400000000010301), ABC_CONST(0x0404040404010301), ABC_CONST(0x0404040400010301), ABC_CONST(0x0404040004010301), ABC_CONST(0x0404040000010301), ABC_CONST(0x0404000404010301), ABC_CONST(0x0404000400010301), ABC_CONST(0x0404000004010301), ABC_CONST(0x0404000000010301), ABC_CONST(0x0400040404010301), ABC_CONST(0x0400040400010301), ABC_CONST(0x0400040004010301), ABC_CONST(0x0400040000010301), ABC_CONST(0x0400000404010301), ABC_CONST(0x0400000400010301), ABC_CONST(0x0400000004010301), ABC_CONST(0x0400000000010301) }, + { ABC_CONST(0x0505050505020402), ABC_CONST(0x0505050500020402), ABC_CONST(0x0505050005020402), ABC_CONST(0x0505050000020402), ABC_CONST(0x0505000505020402), ABC_CONST(0x0505000500020402), ABC_CONST(0x0505000005020402), ABC_CONST(0x0505000000020402), ABC_CONST(0x0500050505020402), ABC_CONST(0x0500050500020402), ABC_CONST(0x0500050005020402), ABC_CONST(0x0500050000020402), ABC_CONST(0x0500000505020402), ABC_CONST(0x0500000500020402), ABC_CONST(0x0500000005020402), ABC_CONST(0x0500000000020402), ABC_CONST(0x0505050505020402), ABC_CONST(0x0505050500020402), ABC_CONST(0x0505050005020402), ABC_CONST(0x0505050000020402), ABC_CONST(0x0505000505020402), ABC_CONST(0x0505000500020402), ABC_CONST(0x0505000005020402), ABC_CONST(0x0505000000020402), ABC_CONST(0x0500050505020402), ABC_CONST(0x0500050500020402), ABC_CONST(0x0500050005020402), ABC_CONST(0x0500050000020402), ABC_CONST(0x0500000505020402), ABC_CONST(0x0500000500020402), ABC_CONST(0x0500000005020402), ABC_CONST(0x0500000000020402) }, + { ABC_CONST(0x0404040404010202), ABC_CONST(0x0404040400010202), ABC_CONST(0x0404040004010202), ABC_CONST(0x0404040000010202), ABC_CONST(0x0404000404010202), ABC_CONST(0x0404000400010202), ABC_CONST(0x0404000004010202), ABC_CONST(0x0404000000010202), ABC_CONST(0x0400040404010202), ABC_CONST(0x0400040400010202), ABC_CONST(0x0400040004010202), ABC_CONST(0x0400040000010202), ABC_CONST(0x0400000404010202), ABC_CONST(0x0400000400010202), ABC_CONST(0x0400000004010202), ABC_CONST(0x0400000000010202), ABC_CONST(0x0404040404010202), ABC_CONST(0x0404040400010202), ABC_CONST(0x0404040004010202), ABC_CONST(0x0404040000010202), ABC_CONST(0x0404000404010202), ABC_CONST(0x0404000400010202), ABC_CONST(0x0404000004010202), ABC_CONST(0x0404000000010202), ABC_CONST(0x0400040404010202), ABC_CONST(0x0400040400010202), ABC_CONST(0x0400040004010202), ABC_CONST(0x0400040000010202), ABC_CONST(0x0400000404010202), ABC_CONST(0x0400000400010202), ABC_CONST(0x0400000004010202), ABC_CONST(0x0400000000010202) }, + { ABC_CONST(0x0505050505020303), ABC_CONST(0x0505050500020303), ABC_CONST(0x0505050005020303), ABC_CONST(0x0505050000020303), ABC_CONST(0x0505000505020303), ABC_CONST(0x0505000500020303), ABC_CONST(0x0505000005020303), ABC_CONST(0x0505000000020303), ABC_CONST(0x0500050505020303), ABC_CONST(0x0500050500020303), ABC_CONST(0x0500050005020303), ABC_CONST(0x0500050000020303), ABC_CONST(0x0500000505020303), ABC_CONST(0x0500000500020303), ABC_CONST(0x0500000005020303), ABC_CONST(0x0500000000020303), ABC_CONST(0x0505050505020303), ABC_CONST(0x0505050500020303), ABC_CONST(0x0505050005020303), ABC_CONST(0x0505050000020303), ABC_CONST(0x0505000505020303), ABC_CONST(0x0505000500020303), ABC_CONST(0x0505000005020303), ABC_CONST(0x0505000000020303), ABC_CONST(0x0500050505020303), ABC_CONST(0x0500050500020303), ABC_CONST(0x0500050005020303), ABC_CONST(0x0500050000020303), ABC_CONST(0x0500000505020303), ABC_CONST(0x0500000500020303), ABC_CONST(0x0500000005020303), ABC_CONST(0x0500000000020303) }, + { ABC_CONST(0x0505050505020302), ABC_CONST(0x0505050500020302), ABC_CONST(0x0505050005020302), ABC_CONST(0x0505050000020302), ABC_CONST(0x0505000505020302), ABC_CONST(0x0505000500020302), ABC_CONST(0x0505000005020302), ABC_CONST(0x0505000000020302), ABC_CONST(0x0500050505020302), ABC_CONST(0x0500050500020302), ABC_CONST(0x0500050005020302), ABC_CONST(0x0500050000020302), ABC_CONST(0x0500000505020302), ABC_CONST(0x0500000500020302), ABC_CONST(0x0500000005020302), ABC_CONST(0x0500000000020302), ABC_CONST(0x0505050505020302), ABC_CONST(0x0505050500020302), ABC_CONST(0x0505050005020302), ABC_CONST(0x0505050000020302), ABC_CONST(0x0505000505020302), ABC_CONST(0x0505000500020302), ABC_CONST(0x0505000005020302), ABC_CONST(0x0505000000020302), ABC_CONST(0x0500050505020302), ABC_CONST(0x0500050500020302), ABC_CONST(0x0500050005020302), ABC_CONST(0x0500050000020302), ABC_CONST(0x0500000505020302), ABC_CONST(0x0500000500020302), ABC_CONST(0x0500000005020302), ABC_CONST(0x0500000000020302) }, + { ABC_CONST(0x0606060606030403), ABC_CONST(0x0606060600030403), ABC_CONST(0x0606060006030403), ABC_CONST(0x0606060000030403), ABC_CONST(0x0606000606030403), ABC_CONST(0x0606000600030403), ABC_CONST(0x0606000006030403), ABC_CONST(0x0606000000030403), ABC_CONST(0x0600060606030403), ABC_CONST(0x0600060600030403), ABC_CONST(0x0600060006030403), ABC_CONST(0x0600060000030403), ABC_CONST(0x0600000606030403), ABC_CONST(0x0600000600030403), ABC_CONST(0x0600000006030403), ABC_CONST(0x0600000000030403), ABC_CONST(0x0606060606030403), ABC_CONST(0x0606060600030403), ABC_CONST(0x0606060006030403), ABC_CONST(0x0606060000030403), ABC_CONST(0x0606000606030403), ABC_CONST(0x0606000600030403), ABC_CONST(0x0606000006030403), ABC_CONST(0x0606000000030403), ABC_CONST(0x0600060606030403), ABC_CONST(0x0600060600030403), ABC_CONST(0x0600060006030403), ABC_CONST(0x0600060000030403), ABC_CONST(0x0600000606030403), ABC_CONST(0x0600000600030403), ABC_CONST(0x0600000006030403), ABC_CONST(0x0600000000030403) }, + { ABC_CONST(0x0404040404010201), ABC_CONST(0x0404040400010201), ABC_CONST(0x0404040004010201), ABC_CONST(0x0404040000010201), ABC_CONST(0x0404000404010201), ABC_CONST(0x0404000400010201), ABC_CONST(0x0404000004010201), ABC_CONST(0x0404000000010201), ABC_CONST(0x0400040404010201), ABC_CONST(0x0400040400010201), ABC_CONST(0x0400040004010201), ABC_CONST(0x0400040000010201), ABC_CONST(0x0400000404010201), ABC_CONST(0x0400000400010201), ABC_CONST(0x0400000004010201), ABC_CONST(0x0400000000010201), ABC_CONST(0x0404040404010201), ABC_CONST(0x0404040400010201), ABC_CONST(0x0404040004010201), ABC_CONST(0x0404040000010201), ABC_CONST(0x0404000404010201), ABC_CONST(0x0404000400010201), ABC_CONST(0x0404000004010201), ABC_CONST(0x0404000000010201), ABC_CONST(0x0400040404010201), ABC_CONST(0x0400040400010201), ABC_CONST(0x0400040004010201), ABC_CONST(0x0400040000010201), ABC_CONST(0x0400000404010201), ABC_CONST(0x0400000400010201), ABC_CONST(0x0400000004010201), ABC_CONST(0x0400000000010201) }, + { ABC_CONST(0x0505050505020302), ABC_CONST(0x0505050500020302), ABC_CONST(0x0505050005020302), ABC_CONST(0x0505050000020302), ABC_CONST(0x0505000505020302), ABC_CONST(0x0505000500020302), ABC_CONST(0x0505000005020302), ABC_CONST(0x0505000000020302), ABC_CONST(0x0500050505020302), ABC_CONST(0x0500050500020302), ABC_CONST(0x0500050005020302), ABC_CONST(0x0500050000020302), ABC_CONST(0x0500000505020302), ABC_CONST(0x0500000500020302), ABC_CONST(0x0500000005020302), ABC_CONST(0x0500000000020302), ABC_CONST(0x0505050505020302), ABC_CONST(0x0505050500020302), ABC_CONST(0x0505050005020302), ABC_CONST(0x0505050000020302), ABC_CONST(0x0505000505020302), ABC_CONST(0x0505000500020302), ABC_CONST(0x0505000005020302), ABC_CONST(0x0505000000020302), ABC_CONST(0x0500050505020302), ABC_CONST(0x0500050500020302), ABC_CONST(0x0500050005020302), ABC_CONST(0x0500050000020302), ABC_CONST(0x0500000505020302), ABC_CONST(0x0500000500020302), ABC_CONST(0x0500000005020302), ABC_CONST(0x0500000000020302) }, + { ABC_CONST(0x0505050505020301), ABC_CONST(0x0505050500020301), ABC_CONST(0x0505050005020301), ABC_CONST(0x0505050000020301), ABC_CONST(0x0505000505020301), ABC_CONST(0x0505000500020301), ABC_CONST(0x0505000005020301), ABC_CONST(0x0505000000020301), ABC_CONST(0x0500050505020301), ABC_CONST(0x0500050500020301), ABC_CONST(0x0500050005020301), ABC_CONST(0x0500050000020301), ABC_CONST(0x0500000505020301), ABC_CONST(0x0500000500020301), ABC_CONST(0x0500000005020301), ABC_CONST(0x0500000000020301), ABC_CONST(0x0505050505020301), ABC_CONST(0x0505050500020301), ABC_CONST(0x0505050005020301), ABC_CONST(0x0505050000020301), ABC_CONST(0x0505000505020301), ABC_CONST(0x0505000500020301), ABC_CONST(0x0505000005020301), ABC_CONST(0x0505000000020301), ABC_CONST(0x0500050505020301), ABC_CONST(0x0500050500020301), ABC_CONST(0x0500050005020301), ABC_CONST(0x0500050000020301), ABC_CONST(0x0500000505020301), ABC_CONST(0x0500000500020301), ABC_CONST(0x0500000005020301), ABC_CONST(0x0500000000020301) }, + { ABC_CONST(0x0606060606030402), ABC_CONST(0x0606060600030402), ABC_CONST(0x0606060006030402), ABC_CONST(0x0606060000030402), ABC_CONST(0x0606000606030402), ABC_CONST(0x0606000600030402), ABC_CONST(0x0606000006030402), ABC_CONST(0x0606000000030402), ABC_CONST(0x0600060606030402), ABC_CONST(0x0600060600030402), ABC_CONST(0x0600060006030402), ABC_CONST(0x0600060000030402), ABC_CONST(0x0600000606030402), ABC_CONST(0x0600000600030402), ABC_CONST(0x0600000006030402), ABC_CONST(0x0600000000030402), ABC_CONST(0x0606060606030402), ABC_CONST(0x0606060600030402), ABC_CONST(0x0606060006030402), ABC_CONST(0x0606060000030402), ABC_CONST(0x0606000606030402), ABC_CONST(0x0606000600030402), ABC_CONST(0x0606000006030402), ABC_CONST(0x0606000000030402), ABC_CONST(0x0600060606030402), ABC_CONST(0x0600060600030402), ABC_CONST(0x0600060006030402), ABC_CONST(0x0600060000030402), ABC_CONST(0x0600000606030402), ABC_CONST(0x0600000600030402), ABC_CONST(0x0600000006030402), ABC_CONST(0x0600000000030402) }, + { ABC_CONST(0x0505050505020202), ABC_CONST(0x0505050500020202), ABC_CONST(0x0505050005020202), ABC_CONST(0x0505050000020202), ABC_CONST(0x0505000505020202), ABC_CONST(0x0505000500020202), ABC_CONST(0x0505000005020202), ABC_CONST(0x0505000000020202), ABC_CONST(0x0500050505020202), ABC_CONST(0x0500050500020202), ABC_CONST(0x0500050005020202), ABC_CONST(0x0500050000020202), ABC_CONST(0x0500000505020202), ABC_CONST(0x0500000500020202), ABC_CONST(0x0500000005020202), ABC_CONST(0x0500000000020202), ABC_CONST(0x0505050505020202), ABC_CONST(0x0505050500020202), ABC_CONST(0x0505050005020202), ABC_CONST(0x0505050000020202), ABC_CONST(0x0505000505020202), ABC_CONST(0x0505000500020202), ABC_CONST(0x0505000005020202), ABC_CONST(0x0505000000020202), ABC_CONST(0x0500050505020202), ABC_CONST(0x0500050500020202), ABC_CONST(0x0500050005020202), ABC_CONST(0x0500050000020202), ABC_CONST(0x0500000505020202), ABC_CONST(0x0500000500020202), ABC_CONST(0x0500000005020202), ABC_CONST(0x0500000000020202) }, + { ABC_CONST(0x0606060606030303), ABC_CONST(0x0606060600030303), ABC_CONST(0x0606060006030303), ABC_CONST(0x0606060000030303), ABC_CONST(0x0606000606030303), ABC_CONST(0x0606000600030303), ABC_CONST(0x0606000006030303), ABC_CONST(0x0606000000030303), ABC_CONST(0x0600060606030303), ABC_CONST(0x0600060600030303), ABC_CONST(0x0600060006030303), ABC_CONST(0x0600060000030303), ABC_CONST(0x0600000606030303), ABC_CONST(0x0600000600030303), ABC_CONST(0x0600000006030303), ABC_CONST(0x0600000000030303), ABC_CONST(0x0606060606030303), ABC_CONST(0x0606060600030303), ABC_CONST(0x0606060006030303), ABC_CONST(0x0606060000030303), ABC_CONST(0x0606000606030303), ABC_CONST(0x0606000600030303), ABC_CONST(0x0606000006030303), ABC_CONST(0x0606000000030303), ABC_CONST(0x0600060606030303), ABC_CONST(0x0600060600030303), ABC_CONST(0x0600060006030303), ABC_CONST(0x0600060000030303), ABC_CONST(0x0600000606030303), ABC_CONST(0x0600000600030303), ABC_CONST(0x0600000006030303), ABC_CONST(0x0600000000030303) }, + { ABC_CONST(0x0606060606030302), ABC_CONST(0x0606060600030302), ABC_CONST(0x0606060006030302), ABC_CONST(0x0606060000030302), ABC_CONST(0x0606000606030302), ABC_CONST(0x0606000600030302), ABC_CONST(0x0606000006030302), ABC_CONST(0x0606000000030302), ABC_CONST(0x0600060606030302), ABC_CONST(0x0600060600030302), ABC_CONST(0x0600060006030302), ABC_CONST(0x0600060000030302), ABC_CONST(0x0600000606030302), ABC_CONST(0x0600000600030302), ABC_CONST(0x0600000006030302), ABC_CONST(0x0600000000030302), ABC_CONST(0x0606060606030302), ABC_CONST(0x0606060600030302), ABC_CONST(0x0606060006030302), ABC_CONST(0x0606060000030302), ABC_CONST(0x0606000606030302), ABC_CONST(0x0606000600030302), ABC_CONST(0x0606000006030302), ABC_CONST(0x0606000000030302), ABC_CONST(0x0600060606030302), ABC_CONST(0x0600060600030302), ABC_CONST(0x0600060006030302), ABC_CONST(0x0600060000030302), ABC_CONST(0x0600000606030302), ABC_CONST(0x0600000600030302), ABC_CONST(0x0600000006030302), ABC_CONST(0x0600000000030302) }, + { ABC_CONST(0x0707070707040403), ABC_CONST(0x0707070700040403), ABC_CONST(0x0707070007040403), ABC_CONST(0x0707070000040403), ABC_CONST(0x0707000707040403), ABC_CONST(0x0707000700040403), ABC_CONST(0x0707000007040403), ABC_CONST(0x0707000000040403), ABC_CONST(0x0700070707040403), ABC_CONST(0x0700070700040403), ABC_CONST(0x0700070007040403), ABC_CONST(0x0700070000040403), ABC_CONST(0x0700000707040403), ABC_CONST(0x0700000700040403), ABC_CONST(0x0700000007040403), ABC_CONST(0x0700000000040403), ABC_CONST(0x0707070707040403), ABC_CONST(0x0707070700040403), ABC_CONST(0x0707070007040403), ABC_CONST(0x0707070000040403), ABC_CONST(0x0707000707040403), ABC_CONST(0x0707000700040403), ABC_CONST(0x0707000007040403), ABC_CONST(0x0707000000040403), ABC_CONST(0x0700070707040403), ABC_CONST(0x0700070700040403), ABC_CONST(0x0700070007040403), ABC_CONST(0x0700070000040403), ABC_CONST(0x0700000707040403), ABC_CONST(0x0700000700040403), ABC_CONST(0x0700000007040403), ABC_CONST(0x0700000000040403) }, + { ABC_CONST(0x0202020202000001), ABC_CONST(0x0202020200000001), ABC_CONST(0x0202020002000001), ABC_CONST(0x0202020000000001), ABC_CONST(0x0202000202000001), ABC_CONST(0x0202000200000001), ABC_CONST(0x0202000002000001), ABC_CONST(0x0202000000000001), ABC_CONST(0x0200020202000001), ABC_CONST(0x0200020200000001), ABC_CONST(0x0200020002000001), ABC_CONST(0x0200020000000001), ABC_CONST(0x0200000202000001), ABC_CONST(0x0200000200000001), ABC_CONST(0x0200000002000001), ABC_CONST(0x0200000000000001), ABC_CONST(0x0202020202000001), ABC_CONST(0x0202020200000001), ABC_CONST(0x0202020002000001), ABC_CONST(0x0202020000000001), ABC_CONST(0x0202000202000001), ABC_CONST(0x0202000200000001), ABC_CONST(0x0202000002000001), ABC_CONST(0x0202000000000001), ABC_CONST(0x0200020202000001), ABC_CONST(0x0200020200000001), ABC_CONST(0x0200020002000001), ABC_CONST(0x0200020000000001), ABC_CONST(0x0200000202000001), ABC_CONST(0x0200000200000001), ABC_CONST(0x0200000002000001), ABC_CONST(0x0200000000000001) }, + { ABC_CONST(0x0303030303010102), ABC_CONST(0x0303030300010102), ABC_CONST(0x0303030003010102), ABC_CONST(0x0303030000010102), ABC_CONST(0x0303000303010102), ABC_CONST(0x0303000300010102), ABC_CONST(0x0303000003010102), ABC_CONST(0x0303000000010102), ABC_CONST(0x0300030303010102), ABC_CONST(0x0300030300010102), ABC_CONST(0x0300030003010102), ABC_CONST(0x0300030000010102), ABC_CONST(0x0300000303010102), ABC_CONST(0x0300000300010102), ABC_CONST(0x0300000003010102), ABC_CONST(0x0300000000010102), ABC_CONST(0x0303030303010102), ABC_CONST(0x0303030300010102), ABC_CONST(0x0303030003010102), ABC_CONST(0x0303030000010102), ABC_CONST(0x0303000303010102), ABC_CONST(0x0303000300010102), ABC_CONST(0x0303000003010102), ABC_CONST(0x0303000000010102), ABC_CONST(0x0300030303010102), ABC_CONST(0x0300030300010102), ABC_CONST(0x0300030003010102), ABC_CONST(0x0300030000010102), ABC_CONST(0x0300000303010102), ABC_CONST(0x0300000300010102), ABC_CONST(0x0300000003010102), ABC_CONST(0x0300000000010102) }, + { ABC_CONST(0x0303030303010101), ABC_CONST(0x0303030300010101), ABC_CONST(0x0303030003010101), ABC_CONST(0x0303030000010101), ABC_CONST(0x0303000303010101), ABC_CONST(0x0303000300010101), ABC_CONST(0x0303000003010101), ABC_CONST(0x0303000000010101), ABC_CONST(0x0300030303010101), ABC_CONST(0x0300030300010101), ABC_CONST(0x0300030003010101), ABC_CONST(0x0300030000010101), ABC_CONST(0x0300000303010101), ABC_CONST(0x0300000300010101), ABC_CONST(0x0300000003010101), ABC_CONST(0x0300000000010101), ABC_CONST(0x0303030303010101), ABC_CONST(0x0303030300010101), ABC_CONST(0x0303030003010101), ABC_CONST(0x0303030000010101), ABC_CONST(0x0303000303010101), ABC_CONST(0x0303000300010101), ABC_CONST(0x0303000003010101), ABC_CONST(0x0303000000010101), ABC_CONST(0x0300030303010101), ABC_CONST(0x0300030300010101), ABC_CONST(0x0300030003010101), ABC_CONST(0x0300030000010101), ABC_CONST(0x0300000303010101), ABC_CONST(0x0300000300010101), ABC_CONST(0x0300000003010101), ABC_CONST(0x0300000000010101) }, + { ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202), ABC_CONST(0x0404040404020202), ABC_CONST(0x0404040400020202), ABC_CONST(0x0404040004020202), ABC_CONST(0x0404040000020202), ABC_CONST(0x0404000404020202), ABC_CONST(0x0404000400020202), ABC_CONST(0x0404000004020202), ABC_CONST(0x0404000000020202), ABC_CONST(0x0400040404020202), ABC_CONST(0x0400040400020202), ABC_CONST(0x0400040004020202), ABC_CONST(0x0400040000020202), ABC_CONST(0x0400000404020202), ABC_CONST(0x0400000400020202), ABC_CONST(0x0400000004020202), ABC_CONST(0x0400000000020202) }, + { ABC_CONST(0x0303030303010002), ABC_CONST(0x0303030300010002), ABC_CONST(0x0303030003010002), ABC_CONST(0x0303030000010002), ABC_CONST(0x0303000303010002), ABC_CONST(0x0303000300010002), ABC_CONST(0x0303000003010002), ABC_CONST(0x0303000000010002), ABC_CONST(0x0300030303010002), ABC_CONST(0x0300030300010002), ABC_CONST(0x0300030003010002), ABC_CONST(0x0300030000010002), ABC_CONST(0x0300000303010002), ABC_CONST(0x0300000300010002), ABC_CONST(0x0300000003010002), ABC_CONST(0x0300000000010002), ABC_CONST(0x0303030303010002), ABC_CONST(0x0303030300010002), ABC_CONST(0x0303030003010002), ABC_CONST(0x0303030000010002), ABC_CONST(0x0303000303010002), ABC_CONST(0x0303000300010002), ABC_CONST(0x0303000003010002), ABC_CONST(0x0303000000010002), ABC_CONST(0x0300030303010002), ABC_CONST(0x0300030300010002), ABC_CONST(0x0300030003010002), ABC_CONST(0x0300030000010002), ABC_CONST(0x0300000303010002), ABC_CONST(0x0300000300010002), ABC_CONST(0x0300000003010002), ABC_CONST(0x0300000000010002) }, + { ABC_CONST(0x0404040404020103), ABC_CONST(0x0404040400020103), ABC_CONST(0x0404040004020103), ABC_CONST(0x0404040000020103), ABC_CONST(0x0404000404020103), ABC_CONST(0x0404000400020103), ABC_CONST(0x0404000004020103), ABC_CONST(0x0404000000020103), ABC_CONST(0x0400040404020103), ABC_CONST(0x0400040400020103), ABC_CONST(0x0400040004020103), ABC_CONST(0x0400040000020103), ABC_CONST(0x0400000404020103), ABC_CONST(0x0400000400020103), ABC_CONST(0x0400000004020103), ABC_CONST(0x0400000000020103), ABC_CONST(0x0404040404020103), ABC_CONST(0x0404040400020103), ABC_CONST(0x0404040004020103), ABC_CONST(0x0404040000020103), ABC_CONST(0x0404000404020103), ABC_CONST(0x0404000400020103), ABC_CONST(0x0404000004020103), ABC_CONST(0x0404000000020103), ABC_CONST(0x0400040404020103), ABC_CONST(0x0400040400020103), ABC_CONST(0x0400040004020103), ABC_CONST(0x0400040000020103), ABC_CONST(0x0400000404020103), ABC_CONST(0x0400000400020103), ABC_CONST(0x0400000004020103), ABC_CONST(0x0400000000020103) }, + { ABC_CONST(0x0404040404020102), ABC_CONST(0x0404040400020102), ABC_CONST(0x0404040004020102), ABC_CONST(0x0404040000020102), ABC_CONST(0x0404000404020102), ABC_CONST(0x0404000400020102), ABC_CONST(0x0404000004020102), ABC_CONST(0x0404000000020102), ABC_CONST(0x0400040404020102), ABC_CONST(0x0400040400020102), ABC_CONST(0x0400040004020102), ABC_CONST(0x0400040000020102), ABC_CONST(0x0400000404020102), ABC_CONST(0x0400000400020102), ABC_CONST(0x0400000004020102), ABC_CONST(0x0400000000020102), ABC_CONST(0x0404040404020102), ABC_CONST(0x0404040400020102), ABC_CONST(0x0404040004020102), ABC_CONST(0x0404040000020102), ABC_CONST(0x0404000404020102), ABC_CONST(0x0404000400020102), ABC_CONST(0x0404000004020102), ABC_CONST(0x0404000000020102), ABC_CONST(0x0400040404020102), ABC_CONST(0x0400040400020102), ABC_CONST(0x0400040004020102), ABC_CONST(0x0400040000020102), ABC_CONST(0x0400000404020102), ABC_CONST(0x0400000400020102), ABC_CONST(0x0400000004020102), ABC_CONST(0x0400000000020102) }, + { ABC_CONST(0x0505050505030203), ABC_CONST(0x0505050500030203), ABC_CONST(0x0505050005030203), ABC_CONST(0x0505050000030203), ABC_CONST(0x0505000505030203), ABC_CONST(0x0505000500030203), ABC_CONST(0x0505000005030203), ABC_CONST(0x0505000000030203), ABC_CONST(0x0500050505030203), ABC_CONST(0x0500050500030203), ABC_CONST(0x0500050005030203), ABC_CONST(0x0500050000030203), ABC_CONST(0x0500000505030203), ABC_CONST(0x0500000500030203), ABC_CONST(0x0500000005030203), ABC_CONST(0x0500000000030203), ABC_CONST(0x0505050505030203), ABC_CONST(0x0505050500030203), ABC_CONST(0x0505050005030203), ABC_CONST(0x0505050000030203), ABC_CONST(0x0505000505030203), ABC_CONST(0x0505000500030203), ABC_CONST(0x0505000005030203), ABC_CONST(0x0505000000030203), ABC_CONST(0x0500050505030203), ABC_CONST(0x0500050500030203), ABC_CONST(0x0500050005030203), ABC_CONST(0x0500050000030203), ABC_CONST(0x0500000505030203), ABC_CONST(0x0500000500030203), ABC_CONST(0x0500000005030203), ABC_CONST(0x0500000000030203) }, + { ABC_CONST(0x0303030303010001), ABC_CONST(0x0303030300010001), ABC_CONST(0x0303030003010001), ABC_CONST(0x0303030000010001), ABC_CONST(0x0303000303010001), ABC_CONST(0x0303000300010001), ABC_CONST(0x0303000003010001), ABC_CONST(0x0303000000010001), ABC_CONST(0x0300030303010001), ABC_CONST(0x0300030300010001), ABC_CONST(0x0300030003010001), ABC_CONST(0x0300030000010001), ABC_CONST(0x0300000303010001), ABC_CONST(0x0300000300010001), ABC_CONST(0x0300000003010001), ABC_CONST(0x0300000000010001), ABC_CONST(0x0303030303010001), ABC_CONST(0x0303030300010001), ABC_CONST(0x0303030003010001), ABC_CONST(0x0303030000010001), ABC_CONST(0x0303000303010001), ABC_CONST(0x0303000300010001), ABC_CONST(0x0303000003010001), ABC_CONST(0x0303000000010001), ABC_CONST(0x0300030303010001), ABC_CONST(0x0300030300010001), ABC_CONST(0x0300030003010001), ABC_CONST(0x0300030000010001), ABC_CONST(0x0300000303010001), ABC_CONST(0x0300000300010001), ABC_CONST(0x0300000003010001), ABC_CONST(0x0300000000010001) }, + { ABC_CONST(0x0404040404020102), ABC_CONST(0x0404040400020102), ABC_CONST(0x0404040004020102), ABC_CONST(0x0404040000020102), ABC_CONST(0x0404000404020102), ABC_CONST(0x0404000400020102), ABC_CONST(0x0404000004020102), ABC_CONST(0x0404000000020102), ABC_CONST(0x0400040404020102), ABC_CONST(0x0400040400020102), ABC_CONST(0x0400040004020102), ABC_CONST(0x0400040000020102), ABC_CONST(0x0400000404020102), ABC_CONST(0x0400000400020102), ABC_CONST(0x0400000004020102), ABC_CONST(0x0400000000020102), ABC_CONST(0x0404040404020102), ABC_CONST(0x0404040400020102), ABC_CONST(0x0404040004020102), ABC_CONST(0x0404040000020102), ABC_CONST(0x0404000404020102), ABC_CONST(0x0404000400020102), ABC_CONST(0x0404000004020102), ABC_CONST(0x0404000000020102), ABC_CONST(0x0400040404020102), ABC_CONST(0x0400040400020102), ABC_CONST(0x0400040004020102), ABC_CONST(0x0400040000020102), ABC_CONST(0x0400000404020102), ABC_CONST(0x0400000400020102), ABC_CONST(0x0400000004020102), ABC_CONST(0x0400000000020102) }, + { ABC_CONST(0x0404040404020101), ABC_CONST(0x0404040400020101), ABC_CONST(0x0404040004020101), ABC_CONST(0x0404040000020101), ABC_CONST(0x0404000404020101), ABC_CONST(0x0404000400020101), ABC_CONST(0x0404000004020101), ABC_CONST(0x0404000000020101), ABC_CONST(0x0400040404020101), ABC_CONST(0x0400040400020101), ABC_CONST(0x0400040004020101), ABC_CONST(0x0400040000020101), ABC_CONST(0x0400000404020101), ABC_CONST(0x0400000400020101), ABC_CONST(0x0400000004020101), ABC_CONST(0x0400000000020101), ABC_CONST(0x0404040404020101), ABC_CONST(0x0404040400020101), ABC_CONST(0x0404040004020101), ABC_CONST(0x0404040000020101), ABC_CONST(0x0404000404020101), ABC_CONST(0x0404000400020101), ABC_CONST(0x0404000004020101), ABC_CONST(0x0404000000020101), ABC_CONST(0x0400040404020101), ABC_CONST(0x0400040400020101), ABC_CONST(0x0400040004020101), ABC_CONST(0x0400040000020101), ABC_CONST(0x0400000404020101), ABC_CONST(0x0400000400020101), ABC_CONST(0x0400000004020101), ABC_CONST(0x0400000000020101) }, + { ABC_CONST(0x0505050505030202), ABC_CONST(0x0505050500030202), ABC_CONST(0x0505050005030202), ABC_CONST(0x0505050000030202), ABC_CONST(0x0505000505030202), ABC_CONST(0x0505000500030202), ABC_CONST(0x0505000005030202), ABC_CONST(0x0505000000030202), ABC_CONST(0x0500050505030202), ABC_CONST(0x0500050500030202), ABC_CONST(0x0500050005030202), ABC_CONST(0x0500050000030202), ABC_CONST(0x0500000505030202), ABC_CONST(0x0500000500030202), ABC_CONST(0x0500000005030202), ABC_CONST(0x0500000000030202), ABC_CONST(0x0505050505030202), ABC_CONST(0x0505050500030202), ABC_CONST(0x0505050005030202), ABC_CONST(0x0505050000030202), ABC_CONST(0x0505000505030202), ABC_CONST(0x0505000500030202), ABC_CONST(0x0505000005030202), ABC_CONST(0x0505000000030202), ABC_CONST(0x0500050505030202), ABC_CONST(0x0500050500030202), ABC_CONST(0x0500050005030202), ABC_CONST(0x0500050000030202), ABC_CONST(0x0500000505030202), ABC_CONST(0x0500000500030202), ABC_CONST(0x0500000005030202), ABC_CONST(0x0500000000030202) }, + { ABC_CONST(0x0404040404020002), ABC_CONST(0x0404040400020002), ABC_CONST(0x0404040004020002), ABC_CONST(0x0404040000020002), ABC_CONST(0x0404000404020002), ABC_CONST(0x0404000400020002), ABC_CONST(0x0404000004020002), ABC_CONST(0x0404000000020002), ABC_CONST(0x0400040404020002), ABC_CONST(0x0400040400020002), ABC_CONST(0x0400040004020002), ABC_CONST(0x0400040000020002), ABC_CONST(0x0400000404020002), ABC_CONST(0x0400000400020002), ABC_CONST(0x0400000004020002), ABC_CONST(0x0400000000020002), ABC_CONST(0x0404040404020002), ABC_CONST(0x0404040400020002), ABC_CONST(0x0404040004020002), ABC_CONST(0x0404040000020002), ABC_CONST(0x0404000404020002), ABC_CONST(0x0404000400020002), ABC_CONST(0x0404000004020002), ABC_CONST(0x0404000000020002), ABC_CONST(0x0400040404020002), ABC_CONST(0x0400040400020002), ABC_CONST(0x0400040004020002), ABC_CONST(0x0400040000020002), ABC_CONST(0x0400000404020002), ABC_CONST(0x0400000400020002), ABC_CONST(0x0400000004020002), ABC_CONST(0x0400000000020002) }, + { ABC_CONST(0x0505050505030103), ABC_CONST(0x0505050500030103), ABC_CONST(0x0505050005030103), ABC_CONST(0x0505050000030103), ABC_CONST(0x0505000505030103), ABC_CONST(0x0505000500030103), ABC_CONST(0x0505000005030103), ABC_CONST(0x0505000000030103), ABC_CONST(0x0500050505030103), ABC_CONST(0x0500050500030103), ABC_CONST(0x0500050005030103), ABC_CONST(0x0500050000030103), ABC_CONST(0x0500000505030103), ABC_CONST(0x0500000500030103), ABC_CONST(0x0500000005030103), ABC_CONST(0x0500000000030103), ABC_CONST(0x0505050505030103), ABC_CONST(0x0505050500030103), ABC_CONST(0x0505050005030103), ABC_CONST(0x0505050000030103), ABC_CONST(0x0505000505030103), ABC_CONST(0x0505000500030103), ABC_CONST(0x0505000005030103), ABC_CONST(0x0505000000030103), ABC_CONST(0x0500050505030103), ABC_CONST(0x0500050500030103), ABC_CONST(0x0500050005030103), ABC_CONST(0x0500050000030103), ABC_CONST(0x0500000505030103), ABC_CONST(0x0500000500030103), ABC_CONST(0x0500000005030103), ABC_CONST(0x0500000000030103) }, + { ABC_CONST(0x0505050505030102), ABC_CONST(0x0505050500030102), ABC_CONST(0x0505050005030102), ABC_CONST(0x0505050000030102), ABC_CONST(0x0505000505030102), ABC_CONST(0x0505000500030102), ABC_CONST(0x0505000005030102), ABC_CONST(0x0505000000030102), ABC_CONST(0x0500050505030102), ABC_CONST(0x0500050500030102), ABC_CONST(0x0500050005030102), ABC_CONST(0x0500050000030102), ABC_CONST(0x0500000505030102), ABC_CONST(0x0500000500030102), ABC_CONST(0x0500000005030102), ABC_CONST(0x0500000000030102), ABC_CONST(0x0505050505030102), ABC_CONST(0x0505050500030102), ABC_CONST(0x0505050005030102), ABC_CONST(0x0505050000030102), ABC_CONST(0x0505000505030102), ABC_CONST(0x0505000500030102), ABC_CONST(0x0505000005030102), ABC_CONST(0x0505000000030102), ABC_CONST(0x0500050505030102), ABC_CONST(0x0500050500030102), ABC_CONST(0x0500050005030102), ABC_CONST(0x0500050000030102), ABC_CONST(0x0500000505030102), ABC_CONST(0x0500000500030102), ABC_CONST(0x0500000005030102), ABC_CONST(0x0500000000030102) }, + { ABC_CONST(0x0606060606040203), ABC_CONST(0x0606060600040203), ABC_CONST(0x0606060006040203), ABC_CONST(0x0606060000040203), ABC_CONST(0x0606000606040203), ABC_CONST(0x0606000600040203), ABC_CONST(0x0606000006040203), ABC_CONST(0x0606000000040203), ABC_CONST(0x0600060606040203), ABC_CONST(0x0600060600040203), ABC_CONST(0x0600060006040203), ABC_CONST(0x0600060000040203), ABC_CONST(0x0600000606040203), ABC_CONST(0x0600000600040203), ABC_CONST(0x0600000006040203), ABC_CONST(0x0600000000040203), ABC_CONST(0x0606060606040203), ABC_CONST(0x0606060600040203), ABC_CONST(0x0606060006040203), ABC_CONST(0x0606060000040203), ABC_CONST(0x0606000606040203), ABC_CONST(0x0606000600040203), ABC_CONST(0x0606000006040203), ABC_CONST(0x0606000000040203), ABC_CONST(0x0600060606040203), ABC_CONST(0x0600060600040203), ABC_CONST(0x0600060006040203), ABC_CONST(0x0600060000040203), ABC_CONST(0x0600000606040203), ABC_CONST(0x0600000600040203), ABC_CONST(0x0600000006040203), ABC_CONST(0x0600000000040203) }, + { ABC_CONST(0x0303030303000102), ABC_CONST(0x0303030300000102), ABC_CONST(0x0303030003000102), ABC_CONST(0x0303030000000102), ABC_CONST(0x0303000303000102), ABC_CONST(0x0303000300000102), ABC_CONST(0x0303000003000102), ABC_CONST(0x0303000000000102), ABC_CONST(0x0300030303000102), ABC_CONST(0x0300030300000102), ABC_CONST(0x0300030003000102), ABC_CONST(0x0300030000000102), ABC_CONST(0x0300000303000102), ABC_CONST(0x0300000300000102), ABC_CONST(0x0300000003000102), ABC_CONST(0x0300000000000102), ABC_CONST(0x0303030303000102), ABC_CONST(0x0303030300000102), ABC_CONST(0x0303030003000102), ABC_CONST(0x0303030000000102), ABC_CONST(0x0303000303000102), ABC_CONST(0x0303000300000102), ABC_CONST(0x0303000003000102), ABC_CONST(0x0303000000000102), ABC_CONST(0x0300030303000102), ABC_CONST(0x0300030300000102), ABC_CONST(0x0300030003000102), ABC_CONST(0x0300030000000102), ABC_CONST(0x0300000303000102), ABC_CONST(0x0300000300000102), ABC_CONST(0x0300000003000102), ABC_CONST(0x0300000000000102) }, + { ABC_CONST(0x0404040404010203), ABC_CONST(0x0404040400010203), ABC_CONST(0x0404040004010203), ABC_CONST(0x0404040000010203), ABC_CONST(0x0404000404010203), ABC_CONST(0x0404000400010203), ABC_CONST(0x0404000004010203), ABC_CONST(0x0404000000010203), ABC_CONST(0x0400040404010203), ABC_CONST(0x0400040400010203), ABC_CONST(0x0400040004010203), ABC_CONST(0x0400040000010203), ABC_CONST(0x0400000404010203), ABC_CONST(0x0400000400010203), ABC_CONST(0x0400000004010203), ABC_CONST(0x0400000000010203), ABC_CONST(0x0404040404010203), ABC_CONST(0x0404040400010203), ABC_CONST(0x0404040004010203), ABC_CONST(0x0404040000010203), ABC_CONST(0x0404000404010203), ABC_CONST(0x0404000400010203), ABC_CONST(0x0404000004010203), ABC_CONST(0x0404000000010203), ABC_CONST(0x0400040404010203), ABC_CONST(0x0400040400010203), ABC_CONST(0x0400040004010203), ABC_CONST(0x0400040000010203), ABC_CONST(0x0400000404010203), ABC_CONST(0x0400000400010203), ABC_CONST(0x0400000004010203), ABC_CONST(0x0400000000010203) }, + { ABC_CONST(0x0404040404010202), ABC_CONST(0x0404040400010202), ABC_CONST(0x0404040004010202), ABC_CONST(0x0404040000010202), ABC_CONST(0x0404000404010202), ABC_CONST(0x0404000400010202), ABC_CONST(0x0404000004010202), ABC_CONST(0x0404000000010202), ABC_CONST(0x0400040404010202), ABC_CONST(0x0400040400010202), ABC_CONST(0x0400040004010202), ABC_CONST(0x0400040000010202), ABC_CONST(0x0400000404010202), ABC_CONST(0x0400000400010202), ABC_CONST(0x0400000004010202), ABC_CONST(0x0400000000010202), ABC_CONST(0x0404040404010202), ABC_CONST(0x0404040400010202), ABC_CONST(0x0404040004010202), ABC_CONST(0x0404040000010202), ABC_CONST(0x0404000404010202), ABC_CONST(0x0404000400010202), ABC_CONST(0x0404000004010202), ABC_CONST(0x0404000000010202), ABC_CONST(0x0400040404010202), ABC_CONST(0x0400040400010202), ABC_CONST(0x0400040004010202), ABC_CONST(0x0400040000010202), ABC_CONST(0x0400000404010202), ABC_CONST(0x0400000400010202), ABC_CONST(0x0400000004010202), ABC_CONST(0x0400000000010202) }, + { ABC_CONST(0x0505050505020303), ABC_CONST(0x0505050500020303), ABC_CONST(0x0505050005020303), ABC_CONST(0x0505050000020303), ABC_CONST(0x0505000505020303), ABC_CONST(0x0505000500020303), ABC_CONST(0x0505000005020303), ABC_CONST(0x0505000000020303), ABC_CONST(0x0500050505020303), ABC_CONST(0x0500050500020303), ABC_CONST(0x0500050005020303), ABC_CONST(0x0500050000020303), ABC_CONST(0x0500000505020303), ABC_CONST(0x0500000500020303), ABC_CONST(0x0500000005020303), ABC_CONST(0x0500000000020303), ABC_CONST(0x0505050505020303), ABC_CONST(0x0505050500020303), ABC_CONST(0x0505050005020303), ABC_CONST(0x0505050000020303), ABC_CONST(0x0505000505020303), ABC_CONST(0x0505000500020303), ABC_CONST(0x0505000005020303), ABC_CONST(0x0505000000020303), ABC_CONST(0x0500050505020303), ABC_CONST(0x0500050500020303), ABC_CONST(0x0500050005020303), ABC_CONST(0x0500050000020303), ABC_CONST(0x0500000505020303), ABC_CONST(0x0500000500020303), ABC_CONST(0x0500000005020303), ABC_CONST(0x0500000000020303) }, + { ABC_CONST(0x0404040404010103), ABC_CONST(0x0404040400010103), ABC_CONST(0x0404040004010103), ABC_CONST(0x0404040000010103), ABC_CONST(0x0404000404010103), ABC_CONST(0x0404000400010103), ABC_CONST(0x0404000004010103), ABC_CONST(0x0404000000010103), ABC_CONST(0x0400040404010103), ABC_CONST(0x0400040400010103), ABC_CONST(0x0400040004010103), ABC_CONST(0x0400040000010103), ABC_CONST(0x0400000404010103), ABC_CONST(0x0400000400010103), ABC_CONST(0x0400000004010103), ABC_CONST(0x0400000000010103), ABC_CONST(0x0404040404010103), ABC_CONST(0x0404040400010103), ABC_CONST(0x0404040004010103), ABC_CONST(0x0404040000010103), ABC_CONST(0x0404000404010103), ABC_CONST(0x0404000400010103), ABC_CONST(0x0404000004010103), ABC_CONST(0x0404000000010103), ABC_CONST(0x0400040404010103), ABC_CONST(0x0400040400010103), ABC_CONST(0x0400040004010103), ABC_CONST(0x0400040000010103), ABC_CONST(0x0400000404010103), ABC_CONST(0x0400000400010103), ABC_CONST(0x0400000004010103), ABC_CONST(0x0400000000010103) }, + { ABC_CONST(0x0505050505020204), ABC_CONST(0x0505050500020204), ABC_CONST(0x0505050005020204), ABC_CONST(0x0505050000020204), ABC_CONST(0x0505000505020204), ABC_CONST(0x0505000500020204), ABC_CONST(0x0505000005020204), ABC_CONST(0x0505000000020204), ABC_CONST(0x0500050505020204), ABC_CONST(0x0500050500020204), ABC_CONST(0x0500050005020204), ABC_CONST(0x0500050000020204), ABC_CONST(0x0500000505020204), ABC_CONST(0x0500000500020204), ABC_CONST(0x0500000005020204), ABC_CONST(0x0500000000020204), ABC_CONST(0x0505050505020204), ABC_CONST(0x0505050500020204), ABC_CONST(0x0505050005020204), ABC_CONST(0x0505050000020204), ABC_CONST(0x0505000505020204), ABC_CONST(0x0505000500020204), ABC_CONST(0x0505000005020204), ABC_CONST(0x0505000000020204), ABC_CONST(0x0500050505020204), ABC_CONST(0x0500050500020204), ABC_CONST(0x0500050005020204), ABC_CONST(0x0500050000020204), ABC_CONST(0x0500000505020204), ABC_CONST(0x0500000500020204), ABC_CONST(0x0500000005020204), ABC_CONST(0x0500000000020204) }, + { ABC_CONST(0x0505050505020203), ABC_CONST(0x0505050500020203), ABC_CONST(0x0505050005020203), ABC_CONST(0x0505050000020203), ABC_CONST(0x0505000505020203), ABC_CONST(0x0505000500020203), ABC_CONST(0x0505000005020203), ABC_CONST(0x0505000000020203), ABC_CONST(0x0500050505020203), ABC_CONST(0x0500050500020203), ABC_CONST(0x0500050005020203), ABC_CONST(0x0500050000020203), ABC_CONST(0x0500000505020203), ABC_CONST(0x0500000500020203), ABC_CONST(0x0500000005020203), ABC_CONST(0x0500000000020203), ABC_CONST(0x0505050505020203), ABC_CONST(0x0505050500020203), ABC_CONST(0x0505050005020203), ABC_CONST(0x0505050000020203), ABC_CONST(0x0505000505020203), ABC_CONST(0x0505000500020203), ABC_CONST(0x0505000005020203), ABC_CONST(0x0505000000020203), ABC_CONST(0x0500050505020203), ABC_CONST(0x0500050500020203), ABC_CONST(0x0500050005020203), ABC_CONST(0x0500050000020203), ABC_CONST(0x0500000505020203), ABC_CONST(0x0500000500020203), ABC_CONST(0x0500000005020203), ABC_CONST(0x0500000000020203) }, + { ABC_CONST(0x0606060606030304), ABC_CONST(0x0606060600030304), ABC_CONST(0x0606060006030304), ABC_CONST(0x0606060000030304), ABC_CONST(0x0606000606030304), ABC_CONST(0x0606000600030304), ABC_CONST(0x0606000006030304), ABC_CONST(0x0606000000030304), ABC_CONST(0x0600060606030304), ABC_CONST(0x0600060600030304), ABC_CONST(0x0600060006030304), ABC_CONST(0x0600060000030304), ABC_CONST(0x0600000606030304), ABC_CONST(0x0600000600030304), ABC_CONST(0x0600000006030304), ABC_CONST(0x0600000000030304), ABC_CONST(0x0606060606030304), ABC_CONST(0x0606060600030304), ABC_CONST(0x0606060006030304), ABC_CONST(0x0606060000030304), ABC_CONST(0x0606000606030304), ABC_CONST(0x0606000600030304), ABC_CONST(0x0606000006030304), ABC_CONST(0x0606000000030304), ABC_CONST(0x0600060606030304), ABC_CONST(0x0600060600030304), ABC_CONST(0x0600060006030304), ABC_CONST(0x0600060000030304), ABC_CONST(0x0600000606030304), ABC_CONST(0x0600000600030304), ABC_CONST(0x0600000006030304), ABC_CONST(0x0600000000030304) }, + { ABC_CONST(0x0404040404010102), ABC_CONST(0x0404040400010102), ABC_CONST(0x0404040004010102), ABC_CONST(0x0404040000010102), ABC_CONST(0x0404000404010102), ABC_CONST(0x0404000400010102), ABC_CONST(0x0404000004010102), ABC_CONST(0x0404000000010102), ABC_CONST(0x0400040404010102), ABC_CONST(0x0400040400010102), ABC_CONST(0x0400040004010102), ABC_CONST(0x0400040000010102), ABC_CONST(0x0400000404010102), ABC_CONST(0x0400000400010102), ABC_CONST(0x0400000004010102), ABC_CONST(0x0400000000010102), ABC_CONST(0x0404040404010102), ABC_CONST(0x0404040400010102), ABC_CONST(0x0404040004010102), ABC_CONST(0x0404040000010102), ABC_CONST(0x0404000404010102), ABC_CONST(0x0404000400010102), ABC_CONST(0x0404000004010102), ABC_CONST(0x0404000000010102), ABC_CONST(0x0400040404010102), ABC_CONST(0x0400040400010102), ABC_CONST(0x0400040004010102), ABC_CONST(0x0400040000010102), ABC_CONST(0x0400000404010102), ABC_CONST(0x0400000400010102), ABC_CONST(0x0400000004010102), ABC_CONST(0x0400000000010102) }, + { ABC_CONST(0x0505050505020203), ABC_CONST(0x0505050500020203), ABC_CONST(0x0505050005020203), ABC_CONST(0x0505050000020203), ABC_CONST(0x0505000505020203), ABC_CONST(0x0505000500020203), ABC_CONST(0x0505000005020203), ABC_CONST(0x0505000000020203), ABC_CONST(0x0500050505020203), ABC_CONST(0x0500050500020203), ABC_CONST(0x0500050005020203), ABC_CONST(0x0500050000020203), ABC_CONST(0x0500000505020203), ABC_CONST(0x0500000500020203), ABC_CONST(0x0500000005020203), ABC_CONST(0x0500000000020203), ABC_CONST(0x0505050505020203), ABC_CONST(0x0505050500020203), ABC_CONST(0x0505050005020203), ABC_CONST(0x0505050000020203), ABC_CONST(0x0505000505020203), ABC_CONST(0x0505000500020203), ABC_CONST(0x0505000005020203), ABC_CONST(0x0505000000020203), ABC_CONST(0x0500050505020203), ABC_CONST(0x0500050500020203), ABC_CONST(0x0500050005020203), ABC_CONST(0x0500050000020203), ABC_CONST(0x0500000505020203), ABC_CONST(0x0500000500020203), ABC_CONST(0x0500000005020203), ABC_CONST(0x0500000000020203) }, + { ABC_CONST(0x0505050505020202), ABC_CONST(0x0505050500020202), ABC_CONST(0x0505050005020202), ABC_CONST(0x0505050000020202), ABC_CONST(0x0505000505020202), ABC_CONST(0x0505000500020202), ABC_CONST(0x0505000005020202), ABC_CONST(0x0505000000020202), ABC_CONST(0x0500050505020202), ABC_CONST(0x0500050500020202), ABC_CONST(0x0500050005020202), ABC_CONST(0x0500050000020202), ABC_CONST(0x0500000505020202), ABC_CONST(0x0500000500020202), ABC_CONST(0x0500000005020202), ABC_CONST(0x0500000000020202), ABC_CONST(0x0505050505020202), ABC_CONST(0x0505050500020202), ABC_CONST(0x0505050005020202), ABC_CONST(0x0505050000020202), ABC_CONST(0x0505000505020202), ABC_CONST(0x0505000500020202), ABC_CONST(0x0505000005020202), ABC_CONST(0x0505000000020202), ABC_CONST(0x0500050505020202), ABC_CONST(0x0500050500020202), ABC_CONST(0x0500050005020202), ABC_CONST(0x0500050000020202), ABC_CONST(0x0500000505020202), ABC_CONST(0x0500000500020202), ABC_CONST(0x0500000005020202), ABC_CONST(0x0500000000020202) }, + { ABC_CONST(0x0606060606030303), ABC_CONST(0x0606060600030303), ABC_CONST(0x0606060006030303), ABC_CONST(0x0606060000030303), ABC_CONST(0x0606000606030303), ABC_CONST(0x0606000600030303), ABC_CONST(0x0606000006030303), ABC_CONST(0x0606000000030303), ABC_CONST(0x0600060606030303), ABC_CONST(0x0600060600030303), ABC_CONST(0x0600060006030303), ABC_CONST(0x0600060000030303), ABC_CONST(0x0600000606030303), ABC_CONST(0x0600000600030303), ABC_CONST(0x0600000006030303), ABC_CONST(0x0600000000030303), ABC_CONST(0x0606060606030303), ABC_CONST(0x0606060600030303), ABC_CONST(0x0606060006030303), ABC_CONST(0x0606060000030303), ABC_CONST(0x0606000606030303), ABC_CONST(0x0606000600030303), ABC_CONST(0x0606000006030303), ABC_CONST(0x0606000000030303), ABC_CONST(0x0600060606030303), ABC_CONST(0x0600060600030303), ABC_CONST(0x0600060006030303), ABC_CONST(0x0600060000030303), ABC_CONST(0x0600000606030303), ABC_CONST(0x0600000600030303), ABC_CONST(0x0600000006030303), ABC_CONST(0x0600000000030303) }, + { ABC_CONST(0x0505050505020103), ABC_CONST(0x0505050500020103), ABC_CONST(0x0505050005020103), ABC_CONST(0x0505050000020103), ABC_CONST(0x0505000505020103), ABC_CONST(0x0505000500020103), ABC_CONST(0x0505000005020103), ABC_CONST(0x0505000000020103), ABC_CONST(0x0500050505020103), ABC_CONST(0x0500050500020103), ABC_CONST(0x0500050005020103), ABC_CONST(0x0500050000020103), ABC_CONST(0x0500000505020103), ABC_CONST(0x0500000500020103), ABC_CONST(0x0500000005020103), ABC_CONST(0x0500000000020103), ABC_CONST(0x0505050505020103), ABC_CONST(0x0505050500020103), ABC_CONST(0x0505050005020103), ABC_CONST(0x0505050000020103), ABC_CONST(0x0505000505020103), ABC_CONST(0x0505000500020103), ABC_CONST(0x0505000005020103), ABC_CONST(0x0505000000020103), ABC_CONST(0x0500050505020103), ABC_CONST(0x0500050500020103), ABC_CONST(0x0500050005020103), ABC_CONST(0x0500050000020103), ABC_CONST(0x0500000505020103), ABC_CONST(0x0500000500020103), ABC_CONST(0x0500000005020103), ABC_CONST(0x0500000000020103) }, + { ABC_CONST(0x0606060606030204), ABC_CONST(0x0606060600030204), ABC_CONST(0x0606060006030204), ABC_CONST(0x0606060000030204), ABC_CONST(0x0606000606030204), ABC_CONST(0x0606000600030204), ABC_CONST(0x0606000006030204), ABC_CONST(0x0606000000030204), ABC_CONST(0x0600060606030204), ABC_CONST(0x0600060600030204), ABC_CONST(0x0600060006030204), ABC_CONST(0x0600060000030204), ABC_CONST(0x0600000606030204), ABC_CONST(0x0600000600030204), ABC_CONST(0x0600000006030204), ABC_CONST(0x0600000000030204), ABC_CONST(0x0606060606030204), ABC_CONST(0x0606060600030204), ABC_CONST(0x0606060006030204), ABC_CONST(0x0606060000030204), ABC_CONST(0x0606000606030204), ABC_CONST(0x0606000600030204), ABC_CONST(0x0606000006030204), ABC_CONST(0x0606000000030204), ABC_CONST(0x0600060606030204), ABC_CONST(0x0600060600030204), ABC_CONST(0x0600060006030204), ABC_CONST(0x0600060000030204), ABC_CONST(0x0600000606030204), ABC_CONST(0x0600000600030204), ABC_CONST(0x0600000006030204), ABC_CONST(0x0600000000030204) }, + { ABC_CONST(0x0606060606030203), ABC_CONST(0x0606060600030203), ABC_CONST(0x0606060006030203), ABC_CONST(0x0606060000030203), ABC_CONST(0x0606000606030203), ABC_CONST(0x0606000600030203), ABC_CONST(0x0606000006030203), ABC_CONST(0x0606000000030203), ABC_CONST(0x0600060606030203), ABC_CONST(0x0600060600030203), ABC_CONST(0x0600060006030203), ABC_CONST(0x0600060000030203), ABC_CONST(0x0600000606030203), ABC_CONST(0x0600000600030203), ABC_CONST(0x0600000006030203), ABC_CONST(0x0600000000030203), ABC_CONST(0x0606060606030203), ABC_CONST(0x0606060600030203), ABC_CONST(0x0606060006030203), ABC_CONST(0x0606060000030203), ABC_CONST(0x0606000606030203), ABC_CONST(0x0606000600030203), ABC_CONST(0x0606000006030203), ABC_CONST(0x0606000000030203), ABC_CONST(0x0600060606030203), ABC_CONST(0x0600060600030203), ABC_CONST(0x0600060006030203), ABC_CONST(0x0600060000030203), ABC_CONST(0x0600000606030203), ABC_CONST(0x0600000600030203), ABC_CONST(0x0600000006030203), ABC_CONST(0x0600000000030203) }, + { ABC_CONST(0x0707070707040304), ABC_CONST(0x0707070700040304), ABC_CONST(0x0707070007040304), ABC_CONST(0x0707070000040304), ABC_CONST(0x0707000707040304), ABC_CONST(0x0707000700040304), ABC_CONST(0x0707000007040304), ABC_CONST(0x0707000000040304), ABC_CONST(0x0700070707040304), ABC_CONST(0x0700070700040304), ABC_CONST(0x0700070007040304), ABC_CONST(0x0700070000040304), ABC_CONST(0x0700000707040304), ABC_CONST(0x0700000700040304), ABC_CONST(0x0700000007040304), ABC_CONST(0x0700000000040304), ABC_CONST(0x0707070707040304), ABC_CONST(0x0707070700040304), ABC_CONST(0x0707070007040304), ABC_CONST(0x0707070000040304), ABC_CONST(0x0707000707040304), ABC_CONST(0x0707000700040304), ABC_CONST(0x0707000007040304), ABC_CONST(0x0707000000040304), ABC_CONST(0x0700070707040304), ABC_CONST(0x0700070700040304), ABC_CONST(0x0700070007040304), ABC_CONST(0x0700070000040304), ABC_CONST(0x0700000707040304), ABC_CONST(0x0700000700040304), ABC_CONST(0x0700000007040304), ABC_CONST(0x0700000000040304) }, + { ABC_CONST(0x0303030303000101), ABC_CONST(0x0303030300000101), ABC_CONST(0x0303030003000101), ABC_CONST(0x0303030000000101), ABC_CONST(0x0303000303000101), ABC_CONST(0x0303000300000101), ABC_CONST(0x0303000003000101), ABC_CONST(0x0303000000000101), ABC_CONST(0x0300030303000101), ABC_CONST(0x0300030300000101), ABC_CONST(0x0300030003000101), ABC_CONST(0x0300030000000101), ABC_CONST(0x0300000303000101), ABC_CONST(0x0300000300000101), ABC_CONST(0x0300000003000101), ABC_CONST(0x0300000000000101), ABC_CONST(0x0303030303000101), ABC_CONST(0x0303030300000101), ABC_CONST(0x0303030003000101), ABC_CONST(0x0303030000000101), ABC_CONST(0x0303000303000101), ABC_CONST(0x0303000300000101), ABC_CONST(0x0303000003000101), ABC_CONST(0x0303000000000101), ABC_CONST(0x0300030303000101), ABC_CONST(0x0300030300000101), ABC_CONST(0x0300030003000101), ABC_CONST(0x0300030000000101), ABC_CONST(0x0300000303000101), ABC_CONST(0x0300000300000101), ABC_CONST(0x0300000003000101), ABC_CONST(0x0300000000000101) }, + { ABC_CONST(0x0404040404010202), ABC_CONST(0x0404040400010202), ABC_CONST(0x0404040004010202), ABC_CONST(0x0404040000010202), ABC_CONST(0x0404000404010202), ABC_CONST(0x0404000400010202), ABC_CONST(0x0404000004010202), ABC_CONST(0x0404000000010202), ABC_CONST(0x0400040404010202), ABC_CONST(0x0400040400010202), ABC_CONST(0x0400040004010202), ABC_CONST(0x0400040000010202), ABC_CONST(0x0400000404010202), ABC_CONST(0x0400000400010202), ABC_CONST(0x0400000004010202), ABC_CONST(0x0400000000010202), ABC_CONST(0x0404040404010202), ABC_CONST(0x0404040400010202), ABC_CONST(0x0404040004010202), ABC_CONST(0x0404040000010202), ABC_CONST(0x0404000404010202), ABC_CONST(0x0404000400010202), ABC_CONST(0x0404000004010202), ABC_CONST(0x0404000000010202), ABC_CONST(0x0400040404010202), ABC_CONST(0x0400040400010202), ABC_CONST(0x0400040004010202), ABC_CONST(0x0400040000010202), ABC_CONST(0x0400000404010202), ABC_CONST(0x0400000400010202), ABC_CONST(0x0400000004010202), ABC_CONST(0x0400000000010202) }, + { ABC_CONST(0x0404040404010201), ABC_CONST(0x0404040400010201), ABC_CONST(0x0404040004010201), ABC_CONST(0x0404040000010201), ABC_CONST(0x0404000404010201), ABC_CONST(0x0404000400010201), ABC_CONST(0x0404000004010201), ABC_CONST(0x0404000000010201), ABC_CONST(0x0400040404010201), ABC_CONST(0x0400040400010201), ABC_CONST(0x0400040004010201), ABC_CONST(0x0400040000010201), ABC_CONST(0x0400000404010201), ABC_CONST(0x0400000400010201), ABC_CONST(0x0400000004010201), ABC_CONST(0x0400000000010201), ABC_CONST(0x0404040404010201), ABC_CONST(0x0404040400010201), ABC_CONST(0x0404040004010201), ABC_CONST(0x0404040000010201), ABC_CONST(0x0404000404010201), ABC_CONST(0x0404000400010201), ABC_CONST(0x0404000004010201), ABC_CONST(0x0404000000010201), ABC_CONST(0x0400040404010201), ABC_CONST(0x0400040400010201), ABC_CONST(0x0400040004010201), ABC_CONST(0x0400040000010201), ABC_CONST(0x0400000404010201), ABC_CONST(0x0400000400010201), ABC_CONST(0x0400000004010201), ABC_CONST(0x0400000000010201) }, + { ABC_CONST(0x0505050505020302), ABC_CONST(0x0505050500020302), ABC_CONST(0x0505050005020302), ABC_CONST(0x0505050000020302), ABC_CONST(0x0505000505020302), ABC_CONST(0x0505000500020302), ABC_CONST(0x0505000005020302), ABC_CONST(0x0505000000020302), ABC_CONST(0x0500050505020302), ABC_CONST(0x0500050500020302), ABC_CONST(0x0500050005020302), ABC_CONST(0x0500050000020302), ABC_CONST(0x0500000505020302), ABC_CONST(0x0500000500020302), ABC_CONST(0x0500000005020302), ABC_CONST(0x0500000000020302), ABC_CONST(0x0505050505020302), ABC_CONST(0x0505050500020302), ABC_CONST(0x0505050005020302), ABC_CONST(0x0505050000020302), ABC_CONST(0x0505000505020302), ABC_CONST(0x0505000500020302), ABC_CONST(0x0505000005020302), ABC_CONST(0x0505000000020302), ABC_CONST(0x0500050505020302), ABC_CONST(0x0500050500020302), ABC_CONST(0x0500050005020302), ABC_CONST(0x0500050000020302), ABC_CONST(0x0500000505020302), ABC_CONST(0x0500000500020302), ABC_CONST(0x0500000005020302), ABC_CONST(0x0500000000020302) }, + { ABC_CONST(0x0404040404010102), ABC_CONST(0x0404040400010102), ABC_CONST(0x0404040004010102), ABC_CONST(0x0404040000010102), ABC_CONST(0x0404000404010102), ABC_CONST(0x0404000400010102), ABC_CONST(0x0404000004010102), ABC_CONST(0x0404000000010102), ABC_CONST(0x0400040404010102), ABC_CONST(0x0400040400010102), ABC_CONST(0x0400040004010102), ABC_CONST(0x0400040000010102), ABC_CONST(0x0400000404010102), ABC_CONST(0x0400000400010102), ABC_CONST(0x0400000004010102), ABC_CONST(0x0400000000010102), ABC_CONST(0x0404040404010102), ABC_CONST(0x0404040400010102), ABC_CONST(0x0404040004010102), ABC_CONST(0x0404040000010102), ABC_CONST(0x0404000404010102), ABC_CONST(0x0404000400010102), ABC_CONST(0x0404000004010102), ABC_CONST(0x0404000000010102), ABC_CONST(0x0400040404010102), ABC_CONST(0x0400040400010102), ABC_CONST(0x0400040004010102), ABC_CONST(0x0400040000010102), ABC_CONST(0x0400000404010102), ABC_CONST(0x0400000400010102), ABC_CONST(0x0400000004010102), ABC_CONST(0x0400000000010102) }, + { ABC_CONST(0x0505050505020203), ABC_CONST(0x0505050500020203), ABC_CONST(0x0505050005020203), ABC_CONST(0x0505050000020203), ABC_CONST(0x0505000505020203), ABC_CONST(0x0505000500020203), ABC_CONST(0x0505000005020203), ABC_CONST(0x0505000000020203), ABC_CONST(0x0500050505020203), ABC_CONST(0x0500050500020203), ABC_CONST(0x0500050005020203), ABC_CONST(0x0500050000020203), ABC_CONST(0x0500000505020203), ABC_CONST(0x0500000500020203), ABC_CONST(0x0500000005020203), ABC_CONST(0x0500000000020203), ABC_CONST(0x0505050505020203), ABC_CONST(0x0505050500020203), ABC_CONST(0x0505050005020203), ABC_CONST(0x0505050000020203), ABC_CONST(0x0505000505020203), ABC_CONST(0x0505000500020203), ABC_CONST(0x0505000005020203), ABC_CONST(0x0505000000020203), ABC_CONST(0x0500050505020203), ABC_CONST(0x0500050500020203), ABC_CONST(0x0500050005020203), ABC_CONST(0x0500050000020203), ABC_CONST(0x0500000505020203), ABC_CONST(0x0500000500020203), ABC_CONST(0x0500000005020203), ABC_CONST(0x0500000000020203) }, + { ABC_CONST(0x0505050505020202), ABC_CONST(0x0505050500020202), ABC_CONST(0x0505050005020202), ABC_CONST(0x0505050000020202), ABC_CONST(0x0505000505020202), ABC_CONST(0x0505000500020202), ABC_CONST(0x0505000005020202), ABC_CONST(0x0505000000020202), ABC_CONST(0x0500050505020202), ABC_CONST(0x0500050500020202), ABC_CONST(0x0500050005020202), ABC_CONST(0x0500050000020202), ABC_CONST(0x0500000505020202), ABC_CONST(0x0500000500020202), ABC_CONST(0x0500000005020202), ABC_CONST(0x0500000000020202), ABC_CONST(0x0505050505020202), ABC_CONST(0x0505050500020202), ABC_CONST(0x0505050005020202), ABC_CONST(0x0505050000020202), ABC_CONST(0x0505000505020202), ABC_CONST(0x0505000500020202), ABC_CONST(0x0505000005020202), ABC_CONST(0x0505000000020202), ABC_CONST(0x0500050505020202), ABC_CONST(0x0500050500020202), ABC_CONST(0x0500050005020202), ABC_CONST(0x0500050000020202), ABC_CONST(0x0500000505020202), ABC_CONST(0x0500000500020202), ABC_CONST(0x0500000005020202), ABC_CONST(0x0500000000020202) }, + { ABC_CONST(0x0606060606030303), ABC_CONST(0x0606060600030303), ABC_CONST(0x0606060006030303), ABC_CONST(0x0606060000030303), ABC_CONST(0x0606000606030303), ABC_CONST(0x0606000600030303), ABC_CONST(0x0606000006030303), ABC_CONST(0x0606000000030303), ABC_CONST(0x0600060606030303), ABC_CONST(0x0600060600030303), ABC_CONST(0x0600060006030303), ABC_CONST(0x0600060000030303), ABC_CONST(0x0600000606030303), ABC_CONST(0x0600000600030303), ABC_CONST(0x0600000006030303), ABC_CONST(0x0600000000030303), ABC_CONST(0x0606060606030303), ABC_CONST(0x0606060600030303), ABC_CONST(0x0606060006030303), ABC_CONST(0x0606060000030303), ABC_CONST(0x0606000606030303), ABC_CONST(0x0606000600030303), ABC_CONST(0x0606000006030303), ABC_CONST(0x0606000000030303), ABC_CONST(0x0600060606030303), ABC_CONST(0x0600060600030303), ABC_CONST(0x0600060006030303), ABC_CONST(0x0600060000030303), ABC_CONST(0x0600000606030303), ABC_CONST(0x0600000600030303), ABC_CONST(0x0600000006030303), ABC_CONST(0x0600000000030303) }, + { ABC_CONST(0x0404040404010101), ABC_CONST(0x0404040400010101), ABC_CONST(0x0404040004010101), ABC_CONST(0x0404040000010101), ABC_CONST(0x0404000404010101), ABC_CONST(0x0404000400010101), ABC_CONST(0x0404000004010101), ABC_CONST(0x0404000000010101), ABC_CONST(0x0400040404010101), ABC_CONST(0x0400040400010101), ABC_CONST(0x0400040004010101), ABC_CONST(0x0400040000010101), ABC_CONST(0x0400000404010101), ABC_CONST(0x0400000400010101), ABC_CONST(0x0400000004010101), ABC_CONST(0x0400000000010101), ABC_CONST(0x0404040404010101), ABC_CONST(0x0404040400010101), ABC_CONST(0x0404040004010101), ABC_CONST(0x0404040000010101), ABC_CONST(0x0404000404010101), ABC_CONST(0x0404000400010101), ABC_CONST(0x0404000004010101), ABC_CONST(0x0404000000010101), ABC_CONST(0x0400040404010101), ABC_CONST(0x0400040400010101), ABC_CONST(0x0400040004010101), ABC_CONST(0x0400040000010101), ABC_CONST(0x0400000404010101), ABC_CONST(0x0400000400010101), ABC_CONST(0x0400000004010101), ABC_CONST(0x0400000000010101) }, + { ABC_CONST(0x0505050505020202), ABC_CONST(0x0505050500020202), ABC_CONST(0x0505050005020202), ABC_CONST(0x0505050000020202), ABC_CONST(0x0505000505020202), ABC_CONST(0x0505000500020202), ABC_CONST(0x0505000005020202), ABC_CONST(0x0505000000020202), ABC_CONST(0x0500050505020202), ABC_CONST(0x0500050500020202), ABC_CONST(0x0500050005020202), ABC_CONST(0x0500050000020202), ABC_CONST(0x0500000505020202), ABC_CONST(0x0500000500020202), ABC_CONST(0x0500000005020202), ABC_CONST(0x0500000000020202), ABC_CONST(0x0505050505020202), ABC_CONST(0x0505050500020202), ABC_CONST(0x0505050005020202), ABC_CONST(0x0505050000020202), ABC_CONST(0x0505000505020202), ABC_CONST(0x0505000500020202), ABC_CONST(0x0505000005020202), ABC_CONST(0x0505000000020202), ABC_CONST(0x0500050505020202), ABC_CONST(0x0500050500020202), ABC_CONST(0x0500050005020202), ABC_CONST(0x0500050000020202), ABC_CONST(0x0500000505020202), ABC_CONST(0x0500000500020202), ABC_CONST(0x0500000005020202), ABC_CONST(0x0500000000020202) }, + { ABC_CONST(0x0505050505020201), ABC_CONST(0x0505050500020201), ABC_CONST(0x0505050005020201), ABC_CONST(0x0505050000020201), ABC_CONST(0x0505000505020201), ABC_CONST(0x0505000500020201), ABC_CONST(0x0505000005020201), ABC_CONST(0x0505000000020201), ABC_CONST(0x0500050505020201), ABC_CONST(0x0500050500020201), ABC_CONST(0x0500050005020201), ABC_CONST(0x0500050000020201), ABC_CONST(0x0500000505020201), ABC_CONST(0x0500000500020201), ABC_CONST(0x0500000005020201), ABC_CONST(0x0500000000020201), ABC_CONST(0x0505050505020201), ABC_CONST(0x0505050500020201), ABC_CONST(0x0505050005020201), ABC_CONST(0x0505050000020201), ABC_CONST(0x0505000505020201), ABC_CONST(0x0505000500020201), ABC_CONST(0x0505000005020201), ABC_CONST(0x0505000000020201), ABC_CONST(0x0500050505020201), ABC_CONST(0x0500050500020201), ABC_CONST(0x0500050005020201), ABC_CONST(0x0500050000020201), ABC_CONST(0x0500000505020201), ABC_CONST(0x0500000500020201), ABC_CONST(0x0500000005020201), ABC_CONST(0x0500000000020201) }, + { ABC_CONST(0x0606060606030302), ABC_CONST(0x0606060600030302), ABC_CONST(0x0606060006030302), ABC_CONST(0x0606060000030302), ABC_CONST(0x0606000606030302), ABC_CONST(0x0606000600030302), ABC_CONST(0x0606000006030302), ABC_CONST(0x0606000000030302), ABC_CONST(0x0600060606030302), ABC_CONST(0x0600060600030302), ABC_CONST(0x0600060006030302), ABC_CONST(0x0600060000030302), ABC_CONST(0x0600000606030302), ABC_CONST(0x0600000600030302), ABC_CONST(0x0600000006030302), ABC_CONST(0x0600000000030302), ABC_CONST(0x0606060606030302), ABC_CONST(0x0606060600030302), ABC_CONST(0x0606060006030302), ABC_CONST(0x0606060000030302), ABC_CONST(0x0606000606030302), ABC_CONST(0x0606000600030302), ABC_CONST(0x0606000006030302), ABC_CONST(0x0606000000030302), ABC_CONST(0x0600060606030302), ABC_CONST(0x0600060600030302), ABC_CONST(0x0600060006030302), ABC_CONST(0x0600060000030302), ABC_CONST(0x0600000606030302), ABC_CONST(0x0600000600030302), ABC_CONST(0x0600000006030302), ABC_CONST(0x0600000000030302) }, + { ABC_CONST(0x0505050505020102), ABC_CONST(0x0505050500020102), ABC_CONST(0x0505050005020102), ABC_CONST(0x0505050000020102), ABC_CONST(0x0505000505020102), ABC_CONST(0x0505000500020102), ABC_CONST(0x0505000005020102), ABC_CONST(0x0505000000020102), ABC_CONST(0x0500050505020102), ABC_CONST(0x0500050500020102), ABC_CONST(0x0500050005020102), ABC_CONST(0x0500050000020102), ABC_CONST(0x0500000505020102), ABC_CONST(0x0500000500020102), ABC_CONST(0x0500000005020102), ABC_CONST(0x0500000000020102), ABC_CONST(0x0505050505020102), ABC_CONST(0x0505050500020102), ABC_CONST(0x0505050005020102), ABC_CONST(0x0505050000020102), ABC_CONST(0x0505000505020102), ABC_CONST(0x0505000500020102), ABC_CONST(0x0505000005020102), ABC_CONST(0x0505000000020102), ABC_CONST(0x0500050505020102), ABC_CONST(0x0500050500020102), ABC_CONST(0x0500050005020102), ABC_CONST(0x0500050000020102), ABC_CONST(0x0500000505020102), ABC_CONST(0x0500000500020102), ABC_CONST(0x0500000005020102), ABC_CONST(0x0500000000020102) }, + { ABC_CONST(0x0606060606030203), ABC_CONST(0x0606060600030203), ABC_CONST(0x0606060006030203), ABC_CONST(0x0606060000030203), ABC_CONST(0x0606000606030203), ABC_CONST(0x0606000600030203), ABC_CONST(0x0606000006030203), ABC_CONST(0x0606000000030203), ABC_CONST(0x0600060606030203), ABC_CONST(0x0600060600030203), ABC_CONST(0x0600060006030203), ABC_CONST(0x0600060000030203), ABC_CONST(0x0600000606030203), ABC_CONST(0x0600000600030203), ABC_CONST(0x0600000006030203), ABC_CONST(0x0600000000030203), ABC_CONST(0x0606060606030203), ABC_CONST(0x0606060600030203), ABC_CONST(0x0606060006030203), ABC_CONST(0x0606060000030203), ABC_CONST(0x0606000606030203), ABC_CONST(0x0606000600030203), ABC_CONST(0x0606000006030203), ABC_CONST(0x0606000000030203), ABC_CONST(0x0600060606030203), ABC_CONST(0x0600060600030203), ABC_CONST(0x0600060006030203), ABC_CONST(0x0600060000030203), ABC_CONST(0x0600000606030203), ABC_CONST(0x0600000600030203), ABC_CONST(0x0600000006030203), ABC_CONST(0x0600000000030203) }, + { ABC_CONST(0x0606060606030202), ABC_CONST(0x0606060600030202), ABC_CONST(0x0606060006030202), ABC_CONST(0x0606060000030202), ABC_CONST(0x0606000606030202), ABC_CONST(0x0606000600030202), ABC_CONST(0x0606000006030202), ABC_CONST(0x0606000000030202), ABC_CONST(0x0600060606030202), ABC_CONST(0x0600060600030202), ABC_CONST(0x0600060006030202), ABC_CONST(0x0600060000030202), ABC_CONST(0x0600000606030202), ABC_CONST(0x0600000600030202), ABC_CONST(0x0600000006030202), ABC_CONST(0x0600000000030202), ABC_CONST(0x0606060606030202), ABC_CONST(0x0606060600030202), ABC_CONST(0x0606060006030202), ABC_CONST(0x0606060000030202), ABC_CONST(0x0606000606030202), ABC_CONST(0x0606000600030202), ABC_CONST(0x0606000006030202), ABC_CONST(0x0606000000030202), ABC_CONST(0x0600060606030202), ABC_CONST(0x0600060600030202), ABC_CONST(0x0600060006030202), ABC_CONST(0x0600060000030202), ABC_CONST(0x0600000606030202), ABC_CONST(0x0600000600030202), ABC_CONST(0x0600000006030202), ABC_CONST(0x0600000000030202) }, + { ABC_CONST(0x0707070707040303), ABC_CONST(0x0707070700040303), ABC_CONST(0x0707070007040303), ABC_CONST(0x0707070000040303), ABC_CONST(0x0707000707040303), ABC_CONST(0x0707000700040303), ABC_CONST(0x0707000007040303), ABC_CONST(0x0707000000040303), ABC_CONST(0x0700070707040303), ABC_CONST(0x0700070700040303), ABC_CONST(0x0700070007040303), ABC_CONST(0x0700070000040303), ABC_CONST(0x0700000707040303), ABC_CONST(0x0700000700040303), ABC_CONST(0x0700000007040303), ABC_CONST(0x0700000000040303), ABC_CONST(0x0707070707040303), ABC_CONST(0x0707070700040303), ABC_CONST(0x0707070007040303), ABC_CONST(0x0707070000040303), ABC_CONST(0x0707000707040303), ABC_CONST(0x0707000700040303), ABC_CONST(0x0707000007040303), ABC_CONST(0x0707000000040303), ABC_CONST(0x0700070707040303), ABC_CONST(0x0700070700040303), ABC_CONST(0x0700070007040303), ABC_CONST(0x0700070000040303), ABC_CONST(0x0700000707040303), ABC_CONST(0x0700000700040303), ABC_CONST(0x0700000007040303), ABC_CONST(0x0700000000040303) }, + { ABC_CONST(0x0404040404000202), ABC_CONST(0x0404040400000202), ABC_CONST(0x0404040004000202), ABC_CONST(0x0404040000000202), ABC_CONST(0x0404000404000202), ABC_CONST(0x0404000400000202), ABC_CONST(0x0404000004000202), ABC_CONST(0x0404000000000202), ABC_CONST(0x0400040404000202), ABC_CONST(0x0400040400000202), ABC_CONST(0x0400040004000202), ABC_CONST(0x0400040000000202), ABC_CONST(0x0400000404000202), ABC_CONST(0x0400000400000202), ABC_CONST(0x0400000004000202), ABC_CONST(0x0400000000000202), ABC_CONST(0x0404040404000202), ABC_CONST(0x0404040400000202), ABC_CONST(0x0404040004000202), ABC_CONST(0x0404040000000202), ABC_CONST(0x0404000404000202), ABC_CONST(0x0404000400000202), ABC_CONST(0x0404000004000202), ABC_CONST(0x0404000000000202), ABC_CONST(0x0400040404000202), ABC_CONST(0x0400040400000202), ABC_CONST(0x0400040004000202), ABC_CONST(0x0400040000000202), ABC_CONST(0x0400000404000202), ABC_CONST(0x0400000400000202), ABC_CONST(0x0400000004000202), ABC_CONST(0x0400000000000202) }, + { ABC_CONST(0x0505050505010303), ABC_CONST(0x0505050500010303), ABC_CONST(0x0505050005010303), ABC_CONST(0x0505050000010303), ABC_CONST(0x0505000505010303), ABC_CONST(0x0505000500010303), ABC_CONST(0x0505000005010303), ABC_CONST(0x0505000000010303), ABC_CONST(0x0500050505010303), ABC_CONST(0x0500050500010303), ABC_CONST(0x0500050005010303), ABC_CONST(0x0500050000010303), ABC_CONST(0x0500000505010303), ABC_CONST(0x0500000500010303), ABC_CONST(0x0500000005010303), ABC_CONST(0x0500000000010303), ABC_CONST(0x0505050505010303), ABC_CONST(0x0505050500010303), ABC_CONST(0x0505050005010303), ABC_CONST(0x0505050000010303), ABC_CONST(0x0505000505010303), ABC_CONST(0x0505000500010303), ABC_CONST(0x0505000005010303), ABC_CONST(0x0505000000010303), ABC_CONST(0x0500050505010303), ABC_CONST(0x0500050500010303), ABC_CONST(0x0500050005010303), ABC_CONST(0x0500050000010303), ABC_CONST(0x0500000505010303), ABC_CONST(0x0500000500010303), ABC_CONST(0x0500000005010303), ABC_CONST(0x0500000000010303) }, + { ABC_CONST(0x0505050505010302), ABC_CONST(0x0505050500010302), ABC_CONST(0x0505050005010302), ABC_CONST(0x0505050000010302), ABC_CONST(0x0505000505010302), ABC_CONST(0x0505000500010302), ABC_CONST(0x0505000005010302), ABC_CONST(0x0505000000010302), ABC_CONST(0x0500050505010302), ABC_CONST(0x0500050500010302), ABC_CONST(0x0500050005010302), ABC_CONST(0x0500050000010302), ABC_CONST(0x0500000505010302), ABC_CONST(0x0500000500010302), ABC_CONST(0x0500000005010302), ABC_CONST(0x0500000000010302), ABC_CONST(0x0505050505010302), ABC_CONST(0x0505050500010302), ABC_CONST(0x0505050005010302), ABC_CONST(0x0505050000010302), ABC_CONST(0x0505000505010302), ABC_CONST(0x0505000500010302), ABC_CONST(0x0505000005010302), ABC_CONST(0x0505000000010302), ABC_CONST(0x0500050505010302), ABC_CONST(0x0500050500010302), ABC_CONST(0x0500050005010302), ABC_CONST(0x0500050000010302), ABC_CONST(0x0500000505010302), ABC_CONST(0x0500000500010302), ABC_CONST(0x0500000005010302), ABC_CONST(0x0500000000010302) }, + { ABC_CONST(0x0606060606020403), ABC_CONST(0x0606060600020403), ABC_CONST(0x0606060006020403), ABC_CONST(0x0606060000020403), ABC_CONST(0x0606000606020403), ABC_CONST(0x0606000600020403), ABC_CONST(0x0606000006020403), ABC_CONST(0x0606000000020403), ABC_CONST(0x0600060606020403), ABC_CONST(0x0600060600020403), ABC_CONST(0x0600060006020403), ABC_CONST(0x0600060000020403), ABC_CONST(0x0600000606020403), ABC_CONST(0x0600000600020403), ABC_CONST(0x0600000006020403), ABC_CONST(0x0600000000020403), ABC_CONST(0x0606060606020403), ABC_CONST(0x0606060600020403), ABC_CONST(0x0606060006020403), ABC_CONST(0x0606060000020403), ABC_CONST(0x0606000606020403), ABC_CONST(0x0606000600020403), ABC_CONST(0x0606000006020403), ABC_CONST(0x0606000000020403), ABC_CONST(0x0600060606020403), ABC_CONST(0x0600060600020403), ABC_CONST(0x0600060006020403), ABC_CONST(0x0600060000020403), ABC_CONST(0x0600000606020403), ABC_CONST(0x0600000600020403), ABC_CONST(0x0600000006020403), ABC_CONST(0x0600000000020403) }, + { ABC_CONST(0x0505050505010203), ABC_CONST(0x0505050500010203), ABC_CONST(0x0505050005010203), ABC_CONST(0x0505050000010203), ABC_CONST(0x0505000505010203), ABC_CONST(0x0505000500010203), ABC_CONST(0x0505000005010203), ABC_CONST(0x0505000000010203), ABC_CONST(0x0500050505010203), ABC_CONST(0x0500050500010203), ABC_CONST(0x0500050005010203), ABC_CONST(0x0500050000010203), ABC_CONST(0x0500000505010203), ABC_CONST(0x0500000500010203), ABC_CONST(0x0500000005010203), ABC_CONST(0x0500000000010203), ABC_CONST(0x0505050505010203), ABC_CONST(0x0505050500010203), ABC_CONST(0x0505050005010203), ABC_CONST(0x0505050000010203), ABC_CONST(0x0505000505010203), ABC_CONST(0x0505000500010203), ABC_CONST(0x0505000005010203), ABC_CONST(0x0505000000010203), ABC_CONST(0x0500050505010203), ABC_CONST(0x0500050500010203), ABC_CONST(0x0500050005010203), ABC_CONST(0x0500050000010203), ABC_CONST(0x0500000505010203), ABC_CONST(0x0500000500010203), ABC_CONST(0x0500000005010203), ABC_CONST(0x0500000000010203) }, + { ABC_CONST(0x0606060606020304), ABC_CONST(0x0606060600020304), ABC_CONST(0x0606060006020304), ABC_CONST(0x0606060000020304), ABC_CONST(0x0606000606020304), ABC_CONST(0x0606000600020304), ABC_CONST(0x0606000006020304), ABC_CONST(0x0606000000020304), ABC_CONST(0x0600060606020304), ABC_CONST(0x0600060600020304), ABC_CONST(0x0600060006020304), ABC_CONST(0x0600060000020304), ABC_CONST(0x0600000606020304), ABC_CONST(0x0600000600020304), ABC_CONST(0x0600000006020304), ABC_CONST(0x0600000000020304), ABC_CONST(0x0606060606020304), ABC_CONST(0x0606060600020304), ABC_CONST(0x0606060006020304), ABC_CONST(0x0606060000020304), ABC_CONST(0x0606000606020304), ABC_CONST(0x0606000600020304), ABC_CONST(0x0606000006020304), ABC_CONST(0x0606000000020304), ABC_CONST(0x0600060606020304), ABC_CONST(0x0600060600020304), ABC_CONST(0x0600060006020304), ABC_CONST(0x0600060000020304), ABC_CONST(0x0600000606020304), ABC_CONST(0x0600000600020304), ABC_CONST(0x0600000006020304), ABC_CONST(0x0600000000020304) }, + { ABC_CONST(0x0606060606020303), ABC_CONST(0x0606060600020303), ABC_CONST(0x0606060006020303), ABC_CONST(0x0606060000020303), ABC_CONST(0x0606000606020303), ABC_CONST(0x0606000600020303), ABC_CONST(0x0606000006020303), ABC_CONST(0x0606000000020303), ABC_CONST(0x0600060606020303), ABC_CONST(0x0600060600020303), ABC_CONST(0x0600060006020303), ABC_CONST(0x0600060000020303), ABC_CONST(0x0600000606020303), ABC_CONST(0x0600000600020303), ABC_CONST(0x0600000006020303), ABC_CONST(0x0600000000020303), ABC_CONST(0x0606060606020303), ABC_CONST(0x0606060600020303), ABC_CONST(0x0606060006020303), ABC_CONST(0x0606060000020303), ABC_CONST(0x0606000606020303), ABC_CONST(0x0606000600020303), ABC_CONST(0x0606000006020303), ABC_CONST(0x0606000000020303), ABC_CONST(0x0600060606020303), ABC_CONST(0x0600060600020303), ABC_CONST(0x0600060006020303), ABC_CONST(0x0600060000020303), ABC_CONST(0x0600000606020303), ABC_CONST(0x0600000600020303), ABC_CONST(0x0600000006020303), ABC_CONST(0x0600000000020303) }, + { ABC_CONST(0x0707070707030404), ABC_CONST(0x0707070700030404), ABC_CONST(0x0707070007030404), ABC_CONST(0x0707070000030404), ABC_CONST(0x0707000707030404), ABC_CONST(0x0707000700030404), ABC_CONST(0x0707000007030404), ABC_CONST(0x0707000000030404), ABC_CONST(0x0700070707030404), ABC_CONST(0x0700070700030404), ABC_CONST(0x0700070007030404), ABC_CONST(0x0700070000030404), ABC_CONST(0x0700000707030404), ABC_CONST(0x0700000700030404), ABC_CONST(0x0700000007030404), ABC_CONST(0x0700000000030404), ABC_CONST(0x0707070707030404), ABC_CONST(0x0707070700030404), ABC_CONST(0x0707070007030404), ABC_CONST(0x0707070000030404), ABC_CONST(0x0707000707030404), ABC_CONST(0x0707000700030404), ABC_CONST(0x0707000007030404), ABC_CONST(0x0707000000030404), ABC_CONST(0x0700070707030404), ABC_CONST(0x0700070700030404), ABC_CONST(0x0700070007030404), ABC_CONST(0x0700070000030404), ABC_CONST(0x0700000707030404), ABC_CONST(0x0700000700030404), ABC_CONST(0x0700000007030404), ABC_CONST(0x0700000000030404) }, + { ABC_CONST(0x0505050505010202), ABC_CONST(0x0505050500010202), ABC_CONST(0x0505050005010202), ABC_CONST(0x0505050000010202), ABC_CONST(0x0505000505010202), ABC_CONST(0x0505000500010202), ABC_CONST(0x0505000005010202), ABC_CONST(0x0505000000010202), ABC_CONST(0x0500050505010202), ABC_CONST(0x0500050500010202), ABC_CONST(0x0500050005010202), ABC_CONST(0x0500050000010202), ABC_CONST(0x0500000505010202), ABC_CONST(0x0500000500010202), ABC_CONST(0x0500000005010202), ABC_CONST(0x0500000000010202), ABC_CONST(0x0505050505010202), ABC_CONST(0x0505050500010202), ABC_CONST(0x0505050005010202), ABC_CONST(0x0505050000010202), ABC_CONST(0x0505000505010202), ABC_CONST(0x0505000500010202), ABC_CONST(0x0505000005010202), ABC_CONST(0x0505000000010202), ABC_CONST(0x0500050505010202), ABC_CONST(0x0500050500010202), ABC_CONST(0x0500050005010202), ABC_CONST(0x0500050000010202), ABC_CONST(0x0500000505010202), ABC_CONST(0x0500000500010202), ABC_CONST(0x0500000005010202), ABC_CONST(0x0500000000010202) }, + { ABC_CONST(0x0606060606020303), ABC_CONST(0x0606060600020303), ABC_CONST(0x0606060006020303), ABC_CONST(0x0606060000020303), ABC_CONST(0x0606000606020303), ABC_CONST(0x0606000600020303), ABC_CONST(0x0606000006020303), ABC_CONST(0x0606000000020303), ABC_CONST(0x0600060606020303), ABC_CONST(0x0600060600020303), ABC_CONST(0x0600060006020303), ABC_CONST(0x0600060000020303), ABC_CONST(0x0600000606020303), ABC_CONST(0x0600000600020303), ABC_CONST(0x0600000006020303), ABC_CONST(0x0600000000020303), ABC_CONST(0x0606060606020303), ABC_CONST(0x0606060600020303), ABC_CONST(0x0606060006020303), ABC_CONST(0x0606060000020303), ABC_CONST(0x0606000606020303), ABC_CONST(0x0606000600020303), ABC_CONST(0x0606000006020303), ABC_CONST(0x0606000000020303), ABC_CONST(0x0600060606020303), ABC_CONST(0x0600060600020303), ABC_CONST(0x0600060006020303), ABC_CONST(0x0600060000020303), ABC_CONST(0x0600000606020303), ABC_CONST(0x0600000600020303), ABC_CONST(0x0600000006020303), ABC_CONST(0x0600000000020303) }, + { ABC_CONST(0x0606060606020302), ABC_CONST(0x0606060600020302), ABC_CONST(0x0606060006020302), ABC_CONST(0x0606060000020302), ABC_CONST(0x0606000606020302), ABC_CONST(0x0606000600020302), ABC_CONST(0x0606000006020302), ABC_CONST(0x0606000000020302), ABC_CONST(0x0600060606020302), ABC_CONST(0x0600060600020302), ABC_CONST(0x0600060006020302), ABC_CONST(0x0600060000020302), ABC_CONST(0x0600000606020302), ABC_CONST(0x0600000600020302), ABC_CONST(0x0600000006020302), ABC_CONST(0x0600000000020302), ABC_CONST(0x0606060606020302), ABC_CONST(0x0606060600020302), ABC_CONST(0x0606060006020302), ABC_CONST(0x0606060000020302), ABC_CONST(0x0606000606020302), ABC_CONST(0x0606000600020302), ABC_CONST(0x0606000006020302), ABC_CONST(0x0606000000020302), ABC_CONST(0x0600060606020302), ABC_CONST(0x0600060600020302), ABC_CONST(0x0600060006020302), ABC_CONST(0x0600060000020302), ABC_CONST(0x0600000606020302), ABC_CONST(0x0600000600020302), ABC_CONST(0x0600000006020302), ABC_CONST(0x0600000000020302) }, + { ABC_CONST(0x0707070707030403), ABC_CONST(0x0707070700030403), ABC_CONST(0x0707070007030403), ABC_CONST(0x0707070000030403), ABC_CONST(0x0707000707030403), ABC_CONST(0x0707000700030403), ABC_CONST(0x0707000007030403), ABC_CONST(0x0707000000030403), ABC_CONST(0x0700070707030403), ABC_CONST(0x0700070700030403), ABC_CONST(0x0700070007030403), ABC_CONST(0x0700070000030403), ABC_CONST(0x0700000707030403), ABC_CONST(0x0700000700030403), ABC_CONST(0x0700000007030403), ABC_CONST(0x0700000000030403), ABC_CONST(0x0707070707030403), ABC_CONST(0x0707070700030403), ABC_CONST(0x0707070007030403), ABC_CONST(0x0707070000030403), ABC_CONST(0x0707000707030403), ABC_CONST(0x0707000700030403), ABC_CONST(0x0707000007030403), ABC_CONST(0x0707000000030403), ABC_CONST(0x0700070707030403), ABC_CONST(0x0700070700030403), ABC_CONST(0x0700070007030403), ABC_CONST(0x0700070000030403), ABC_CONST(0x0700000707030403), ABC_CONST(0x0700000700030403), ABC_CONST(0x0700000007030403), ABC_CONST(0x0700000000030403) }, + { ABC_CONST(0x0606060606020203), ABC_CONST(0x0606060600020203), ABC_CONST(0x0606060006020203), ABC_CONST(0x0606060000020203), ABC_CONST(0x0606000606020203), ABC_CONST(0x0606000600020203), ABC_CONST(0x0606000006020203), ABC_CONST(0x0606000000020203), ABC_CONST(0x0600060606020203), ABC_CONST(0x0600060600020203), ABC_CONST(0x0600060006020203), ABC_CONST(0x0600060000020203), ABC_CONST(0x0600000606020203), ABC_CONST(0x0600000600020203), ABC_CONST(0x0600000006020203), ABC_CONST(0x0600000000020203), ABC_CONST(0x0606060606020203), ABC_CONST(0x0606060600020203), ABC_CONST(0x0606060006020203), ABC_CONST(0x0606060000020203), ABC_CONST(0x0606000606020203), ABC_CONST(0x0606000600020203), ABC_CONST(0x0606000006020203), ABC_CONST(0x0606000000020203), ABC_CONST(0x0600060606020203), ABC_CONST(0x0600060600020203), ABC_CONST(0x0600060006020203), ABC_CONST(0x0600060000020203), ABC_CONST(0x0600000606020203), ABC_CONST(0x0600000600020203), ABC_CONST(0x0600000006020203), ABC_CONST(0x0600000000020203) }, + { ABC_CONST(0x0707070707030304), ABC_CONST(0x0707070700030304), ABC_CONST(0x0707070007030304), ABC_CONST(0x0707070000030304), ABC_CONST(0x0707000707030304), ABC_CONST(0x0707000700030304), ABC_CONST(0x0707000007030304), ABC_CONST(0x0707000000030304), ABC_CONST(0x0700070707030304), ABC_CONST(0x0700070700030304), ABC_CONST(0x0700070007030304), ABC_CONST(0x0700070000030304), ABC_CONST(0x0700000707030304), ABC_CONST(0x0700000700030304), ABC_CONST(0x0700000007030304), ABC_CONST(0x0700000000030304), ABC_CONST(0x0707070707030304), ABC_CONST(0x0707070700030304), ABC_CONST(0x0707070007030304), ABC_CONST(0x0707070000030304), ABC_CONST(0x0707000707030304), ABC_CONST(0x0707000700030304), ABC_CONST(0x0707000007030304), ABC_CONST(0x0707000000030304), ABC_CONST(0x0700070707030304), ABC_CONST(0x0700070700030304), ABC_CONST(0x0700070007030304), ABC_CONST(0x0700070000030304), ABC_CONST(0x0700000707030304), ABC_CONST(0x0700000700030304), ABC_CONST(0x0700000007030304), ABC_CONST(0x0700000000030304) }, + { ABC_CONST(0x0707070707030303), ABC_CONST(0x0707070700030303), ABC_CONST(0x0707070007030303), ABC_CONST(0x0707070000030303), ABC_CONST(0x0707000707030303), ABC_CONST(0x0707000700030303), ABC_CONST(0x0707000007030303), ABC_CONST(0x0707000000030303), ABC_CONST(0x0700070707030303), ABC_CONST(0x0700070700030303), ABC_CONST(0x0700070007030303), ABC_CONST(0x0700070000030303), ABC_CONST(0x0700000707030303), ABC_CONST(0x0700000700030303), ABC_CONST(0x0700000007030303), ABC_CONST(0x0700000000030303), ABC_CONST(0x0707070707030303), ABC_CONST(0x0707070700030303), ABC_CONST(0x0707070007030303), ABC_CONST(0x0707070000030303), ABC_CONST(0x0707000707030303), ABC_CONST(0x0707000700030303), ABC_CONST(0x0707000007030303), ABC_CONST(0x0707000000030303), ABC_CONST(0x0700070707030303), ABC_CONST(0x0700070700030303), ABC_CONST(0x0700070007030303), ABC_CONST(0x0700070000030303), ABC_CONST(0x0700000707030303), ABC_CONST(0x0700000700030303), ABC_CONST(0x0700000007030303), ABC_CONST(0x0700000000030303) }, + { ABC_CONST(0x0808080808040404), ABC_CONST(0x0808080800040404), ABC_CONST(0x0808080008040404), ABC_CONST(0x0808080000040404), ABC_CONST(0x0808000808040404), ABC_CONST(0x0808000800040404), ABC_CONST(0x0808000008040404), ABC_CONST(0x0808000000040404), ABC_CONST(0x0800080808040404), ABC_CONST(0x0800080800040404), ABC_CONST(0x0800080008040404), ABC_CONST(0x0800080000040404), ABC_CONST(0x0800000808040404), ABC_CONST(0x0800000800040404), ABC_CONST(0x0800000008040404), ABC_CONST(0x0800000000040404), ABC_CONST(0x0808080808040404), ABC_CONST(0x0808080800040404), ABC_CONST(0x0808080008040404), ABC_CONST(0x0808080000040404), ABC_CONST(0x0808000808040404), ABC_CONST(0x0808000800040404), ABC_CONST(0x0808000008040404), ABC_CONST(0x0808000000040404), ABC_CONST(0x0800080808040404), ABC_CONST(0x0800080800040404), ABC_CONST(0x0800080008040404), ABC_CONST(0x0800080000040404), ABC_CONST(0x0800000808040404), ABC_CONST(0x0800000800040404), ABC_CONST(0x0800000008040404), ABC_CONST(0x0800000000040404) } +}; + + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Abc_TtCountGenerate() +{ + static word s_CMasks6[3] = { + ABC_CONST(0x5555555555555555), + ABC_CONST(0x3333333333333333), + ABC_CONST(0x0F0F0F0F0F0F0F0F) + }; + 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, c; + printf("{ "); + for ( i = 0; i < 256; i++, printf(" },\n{ ") ) + for ( k = 0; k < 32; k++ ) + { + printf( "ABC_CONST(0x0%d", bit_count[i] ); + for ( c = 3; c >= 0; c-- ) + printf( "0%d", (((k >> c) & 1) == 0) * bit_count[i] ); + for ( c = 2; c >= 0; c-- ) + printf( "0%d", bit_count[s_CMasks6[c] & i] ); + printf( ")%s", k == 31 ? "":", " ); + } +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Abc_TtCountOnesInCofsQuick_rec( word * pTruth, int nVars, int * pStore ) +{ + if ( nVars <= 8 ) + { + word Res = 0; + unsigned char * pResC = (unsigned char *)&Res; + unsigned char * pTruthC = (unsigned char *)pTruth; + int i, nBytes = nVars <= 6 ? 4 : 1 << (nVars-4), nBytes2 = nBytes << 1; + assert( nVars >= 1 && nVars <= 8 ); + for ( i = 0; i < nBytes; i++ ) + Res += Table[pTruthC[i]][i]; + if ( nVars == 8 ) + pStore[7] += pResC[7]; + for ( ; i < nBytes2; i++ ) + Res += Table[pTruthC[i]][i]; + for ( i = 0; i < nVars-1; i++ ) + pStore[i] += pResC[i]; + if ( nVars < 8 ) + pStore[nVars-1] += pResC[nVars-1]; + return (int)pResC[7]; + } + else + { + int Res1 = Abc_TtCountOnesInCofsQuick_rec( pTruth, nVars-1, pStore ); + int Res2 = Abc_TtCountOnesInCofsQuick_rec( pTruth + (1 << (nVars-7)), nVars-1, pStore ); + pStore[nVars-1] = Res1; + return Res1 + Res2; + } +} +int Abc_TtCountOnesInCofsQuick( word * pTruth, int nVars, int * pStore ) +{ + if ( nVars == 0 ) + return (int)(pTruth[0] & 1); + memset( pStore, 0, sizeof(int)*nVars ); + return Abc_TtCountOnesInCofsQuick_rec( pTruth, nVars, pStore ); +} + + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Abc_TtCountOnesInCofsTest2() +{ + word Truth = ABC_CONST(0x5555555555555555) & ABC_CONST(0x3333333333333333); + + int Store1[8] = {0}, Store2[8] = {0}; + int i, Res1, Res2; + + Res1 = Abc_TtCountOnesInCofsSimple( &Truth, 2, Store1 ); + Res2 = Abc_TtCountOnesInCofsQuick( &Truth, 2, Store2 ); + assert( Res1 == Res2 ); + for ( i = 0; i < 8; i++ ) + assert( Store1[i] == Store2[i] ); + +} +void Abc_TtCountOnesInCofsTest() +{ + word Truth[4] = {0}; + int Store1[8] = {0}, Store2[8] = {0}; + int n, i, k, Res1, Res2; + srand( time(NULL) ); + for ( n = 0; n < 1000000; n++ ) + { + for ( i = 0; i < 4; i++ ) + for ( k = 0; k < 8; k++ ) + Truth[i] ^= (word)(rand() & 0xFF) << (k << 3); + Res1 = Abc_TtCountOnesInCofsSimple( Truth, 8, Store1 ); + Res2 = Abc_TtCountOnesInCofsQuick( Truth, 8, Store2 ); + assert( Res1 == Res2 ); + for ( i = 0; i < 8; i++ ) + assert( Store1[i] == Store2[i] ); + } +} + + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + diff --git a/src/opt/dau/dauGia.c b/src/opt/dau/dauGia.c index 424ec53f..eebfa9a8 100644 --- a/src/opt/dau/dauGia.c +++ b/src/opt/dau/dauGia.c @@ -449,6 +449,10 @@ int Dsm_ManTruthToGia( void * p, word * pTruth, Vec_Int_t * vLeaves, Vec_Int_t * Abc_TtCopy( pTruthCopy, pTruth, Abc_TtWordNum(Vec_IntSize(vLeaves)), 0 ); m_Calls++; assert( Vec_IntSize(vLeaves) <= DAU_DSD_MAX_VAR ); + if ( Vec_IntSize(vLeaves) == 0 ) + return (int)(pTruth[0] & 1); + if ( Vec_IntSize(vLeaves) == 1 ) + return Abc_LitNotCond( Vec_IntEntry(vLeaves, 0), (int)(pTruth[0] & 1) ); // collect delay information if ( fDelayBalance && fUseMuxes ) { diff --git a/src/opt/dau/dauNpn.c b/src/opt/dau/dauNpn.c new file mode 100644 index 00000000..b57ade67 --- /dev/null +++ b/src/opt/dau/dauNpn.c @@ -0,0 +1,816 @@ +/**CFile**************************************************************** + + FileName [dau.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [DAG-aware unmapping.] + + Synopsis [] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - June 20, 2005.] + + Revision [$Id: dau.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "dauInt.h" +#include "misc/util/utilTruth.h" +#include "misc/extra/extra.h" +#include "bool/lucky/lucky.h" + +ABC_NAMESPACE_IMPL_START + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//#define USE4VARS 1 + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Dau_TruthEnum() +{ + int fUseTable = 1; + abctime clk = Abc_Clock(); +#ifdef USE4VARS + int nVars = 4; + int nSizeW = 1 << 14; + char * pFileName = "tableW14.data"; +#else + int nVars = 5; + int nSizeW = 1 << 30; + char * pFileName = "tableW30.data"; +#endif + int nPerms = Extra_Factorial( nVars ); + int nMints = 1 << nVars; + int * pPerm = Extra_PermSchedule( nVars ); + int * pComp = Extra_GreyCodeSchedule( nVars ); + word nFuncs = ((word)1 << (((word)1 << nVars)-1)); + word * pPres = ABC_CALLOC( word, 1 << ((1<<nVars)-7) ); + unsigned * pTable = fUseTable ? (unsigned *)ABC_CALLOC(word, nSizeW) : NULL; + Vec_Int_t * vNpns = Vec_IntAlloc( 1000 ); + word tMask = Abc_Tt6Mask( 1 << nVars ); + word tTemp, tCur; + int i, k; + if ( pPres == NULL ) + { + printf( "Cannot alloc memory for marks.\n" ); + return; + } + if ( pTable == NULL ) + printf( "Cannot alloc memory for table.\n" ); + for ( tCur = 0; tCur < nFuncs; tCur++ ) + { + if ( (tCur & 0x3FFFF) == 0 ) + { + printf( "Finished %08x. Classes = %6d. ", (int)tCur, Vec_IntSize(vNpns) ); + Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); + fflush(stdout); + } + if ( Abc_TtGetBit(pPres, (int)tCur) ) + continue; + //Extra_PrintBinary( stdout, (unsigned *)&tCur, 16 ); printf( " %04x\n", (int)tCur ); + //Dau_DsdPrintFromTruth( &tCur, 4 ); printf( "\n" ); + Vec_IntPush( vNpns, (int)tCur ); + tTemp = tCur; + for ( i = 0; i < nPerms; i++ ) + { + for ( k = 0; k < nMints; k++ ) + { + if ( tCur < nFuncs ) + { + if ( pTable ) pTable[(int)tCur] = tTemp; + Abc_TtSetBit( pPres, (int)tCur ); + } + if ( (tMask & ~tCur) < nFuncs ) + { + if ( pTable ) pTable[(int)(tMask & ~tCur)] = tTemp; + Abc_TtSetBit( pPres, (int)(tMask & ~tCur) ); + } + tCur = Abc_Tt6Flip( tCur, pComp[k] ); + } + tCur = Abc_Tt6SwapAdjacent( tCur, pPerm[i] ); + } + assert( tTemp == tCur ); + } + printf( "Computed %d NPN classes of %d variables. ", Vec_IntSize(vNpns), nVars ); + Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); + fflush(stdout); + Vec_IntFree( vNpns ); + ABC_FREE( pPres ); + ABC_FREE( pPerm ); + ABC_FREE( pComp ); + // write into file + if ( pTable ) + { + FILE * pFile = fopen( pFileName, "wb" ); + int RetValue = fwrite( pTable, 8, nSizeW, pFile ); + RetValue = 0; + fclose( pFile ); + ABC_FREE( pTable ); + } +} + + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +unsigned * Dau_ReadFile( char * pFileName, int nSizeW ) +{ + abctime clk = Abc_Clock(); + FILE * pFile = fopen( pFileName, "rb" ); + unsigned * p = (unsigned *)ABC_CALLOC(word, nSizeW); + int RetValue = pFile ? fread( p, sizeof(word), nSizeW, pFile ) : 0; + RetValue = 0; + if ( pFile ) + { + printf( "Finished reading file \"%s\".\n", pFileName ); + fclose( pFile ); + } + else + printf( "Cannot open input file \"%s\".\n", pFileName ); + Abc_PrintTime( 1, "File reading", Abc_Clock() - clk ); + return p; +} +int Dau_AddFunction( word tCur, int nVars, unsigned * pTable, Vec_Int_t * vNpns, Vec_Int_t * vNpns_ ) +{ + int Digit = (1 << nVars)-1; + word tMask = Abc_Tt6Mask( 1 << nVars ); + word tNorm = (tCur >> Digit) & 1 ? ~tCur : tCur; + unsigned t = (unsigned)(tNorm & tMask); + unsigned tRep = pTable[t] & 0x7FFFFFFF; + unsigned tRep2 = pTable[tRep]; + assert( ((tNorm >> Digit) & 1) == 0 ); + if ( (tRep2 >> 31) == 0 ) // first time + { + Vec_IntPush( vNpns, tRep2 ); + if ( Abc_TtSupportSize(&tCur, nVars) < nVars ) + Vec_IntPush( vNpns_, tRep2 ); + pTable[tRep] = tRep2 | (1 << 31); + return tRep2; + } + return 0; +} +void Dau_NetworkEnum() +{ + abctime clk = Abc_Clock(); + int Limit = 2; + int UseTwo = 0; +#ifdef USE4VARS + int nVars = 4; + int nSizeW = 1 << 14; + char * pFileName = "tableW14.data"; +#else + int nVars = 5; + int nSizeW = 1 << 30; + char * pFileName = "tableW30.data"; +#endif + unsigned * pTable = Dau_ReadFile( pFileName, nSizeW ); + Vec_Wec_t * vNpns = Vec_WecStart( 32 ); + Vec_Wec_t * vNpns_ = Vec_WecStart( 32 ); + int i, v, u, g, k, m, n, Res, Entry; + unsigned Inv = (unsigned)Abc_Tt6Mask(1 << (nVars-1)); + // create constant function and buffer/inverter function + pTable[0] |= (1 << 31); + pTable[Inv] |= (1 << 31); + Vec_IntPushTwo( Vec_WecEntry(vNpns, 0), 0, Inv ); + Vec_IntPushTwo( Vec_WecEntry(vNpns_, 0), 0, Inv ); + printf("Nodes = %2d. New = %6d. Total = %6d. New = %6d. Total = %6d. ", + 0, Vec_IntSize(Vec_WecEntry(vNpns, 0)), Vec_WecSizeSize(vNpns), + Vec_IntSize(Vec_WecEntry(vNpns_, 0)), Vec_WecSizeSize(vNpns_) ); + Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); + // numerate other functions based on how many nodes they have + for ( n = 1; n < 32; n++ ) + { + Vec_Int_t * vFuncsN2 = n > 1 ? Vec_WecEntry( vNpns, n-2 ) : NULL; + Vec_Int_t * vFuncsN1 = Vec_WecEntry( vNpns, n-1 ); + Vec_Int_t * vFuncsN = Vec_WecEntry( vNpns, n ); + Vec_Int_t * vFuncsN_ = Vec_WecEntry( vNpns_,n ); + Vec_IntForEachEntry( vFuncsN1, Entry, i ) + { + word uTruth = (((word)Entry) << 32) | (word)Entry; + int nSupp = Abc_TtSupportSize( &uTruth, nVars ); + assert( nSupp == 6 || !Abc_Tt6HasVar(uTruth, nVars-1-nSupp) ); + //printf( "Exploring function %4d with %d vars: ", i, nSupp ); + //printf( " %04x\n", (int)uTruth ); + //Dau_DsdPrintFromTruth( &uTruth, 4 ); + for ( v = 0; v < nSupp; v++ ) + { + word tGate, tCur; + word Cof0 = Abc_Tt6Cofactor0( uTruth, nVars-1-v ); + word Cof1 = Abc_Tt6Cofactor1( uTruth, nVars-1-v ); + for ( g = 0; g < Limit; g++ ) + { + if ( nSupp < nVars ) + { + if ( g == 0 ) + { + tGate = s_Truths6[nVars-1-v] & s_Truths6[nVars-1-nSupp]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + } + else + { + tGate = s_Truths6[nVars-1-v] ^ s_Truths6[nVars-1-nSupp]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + } + } + } + for ( g = 0; g < Limit; g++ ) + { + // add one cross bar + for ( k = 0; k < nSupp; k++ ) if ( k != v ) + { + if ( g == 0 ) + { + tGate = s_Truths6[nVars-1-v] & s_Truths6[nVars-1-k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + + tGate = s_Truths6[nVars-1-v] & ~s_Truths6[nVars-1-k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + } + else + { + tGate = s_Truths6[nVars-1-v] ^ s_Truths6[nVars-1-k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + } + } + } + for ( g = 0; g < Limit; g++ ) + { + // add two cross bars + for ( k = 0; k < nSupp; k++ ) if ( k != v ) + for ( m = k+1; m < nSupp; m++ ) if ( m != v ) + { + if ( g == 0 ) + { + tGate = s_Truths6[nVars-1-m] & s_Truths6[nVars-1-k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + + tGate = s_Truths6[nVars-1-m] & ~s_Truths6[nVars-1-k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + + tGate = ~s_Truths6[nVars-1-m] & s_Truths6[nVars-1-k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + + tGate = ~s_Truths6[nVars-1-m] & ~s_Truths6[nVars-1-k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + } + else + { + tGate = s_Truths6[nVars-1-m] ^ s_Truths6[nVars-1-k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + } + } + } + } + } + if ( UseTwo && vFuncsN2 ) + Vec_IntForEachEntry( vFuncsN2, Entry, i ) + { + word uTruth = (((word)Entry) << 32) | (word)Entry; + int nSupp = Abc_TtSupportSize( &uTruth, nVars ); + assert( nSupp == 6 || !Abc_Tt6HasVar(uTruth, nVars-1-nSupp) ); + //printf( "Exploring function %4d with %d vars: ", i, nSupp ); + //printf( " %04x\n", (int)uTruth ); + //Dau_DsdPrintFromTruth( &uTruth, 4 ); + for ( v = 0; v < nSupp; v++ ) +// for ( u = v+1; u < nSupp; u++ ) if ( u != v ) + for ( u = 0; u < nSupp; u++ ) if ( u != v ) + { + word tGate1, tGate2, tCur; + word Cof0 = Abc_Tt6Cofactor0( uTruth, nVars-1-v ); + word Cof1 = Abc_Tt6Cofactor1( uTruth, nVars-1-v ); + + word Cof00 = Abc_Tt6Cofactor0( Cof0, nVars-1-u ); + word Cof01 = Abc_Tt6Cofactor1( Cof0, nVars-1-u ); + word Cof10 = Abc_Tt6Cofactor0( Cof1, nVars-1-u ); + word Cof11 = Abc_Tt6Cofactor1( Cof1, nVars-1-u ); + + tGate1 = s_Truths6[nVars-1-v] & s_Truths6[nVars-1-u]; + tGate2 = s_Truths6[nVars-1-v] ^ s_Truths6[nVars-1-u]; + + Cof0 = (tGate2 & Cof00) | (~tGate2 & Cof01); + Cof1 = (tGate2 & Cof10) | (~tGate2 & Cof11); + + tCur = (tGate1 & Cof1) | (~tGate1 & Cof0); + Res = Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + if ( Res ) + printf( "Found function %d\n", Res ); + + tCur = (tGate1 & Cof0) | (~tGate1 & Cof1); + Res = Dau_AddFunction( tCur, nVars, pTable, vFuncsN, vFuncsN_ ); + if ( Res ) + printf( "Found function %d\n", Res ); + } + } + printf("Nodes = %2d. New = %6d. Total = %6d. New = %6d. Total = %6d. ", + n, Vec_IntSize(vFuncsN), Vec_WecSizeSize(vNpns), Vec_IntSize(vFuncsN_), Vec_WecSizeSize(vNpns_) ); + Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); + fflush(stdout); + if ( Vec_IntSize(vFuncsN) == 0 ) + break; + } +// printf( "Functions with 7 nodes:\n" ); +// Vec_IntForEachEntry( Vec_WecEntry(vNpns_,7), Entry, i ) +// printf( "%04x ", Entry ); +// printf( "\n" ); + + Vec_WecFree( vNpns ); + Vec_WecFree( vNpns_ ); + ABC_FREE( pTable ); + Abc_PrintTime( 1, "Total time", Abc_Clock() - clk ); + fflush(stdout); +} +void Dau_NetworkEnumTest() +{ + //Dau_TruthEnum(); + Dau_NetworkEnum(); +} + + + +/**Function************************************************************* + + Synopsis [Count the number of symmetric pairs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Dau_CountSymms( word t, int nVars ) +{ + word Cof0, Cof1; + int i, j, nPairs = 0; + for ( i = 0; i < nVars; i++ ) + for ( j = i+1; j < nVars; j++ ) + nPairs += Abc_TtVarsAreSymmetric(&t, nVars, i, j, &Cof0, &Cof1); + return nPairs; +} +int Dau_CountSymms2( word t, int nVars ) +{ + word Cof0, Cof1; + int i, j, SymVars = 0; + for ( i = 0; i < nVars; i++ ) + for ( j = i+1; j < nVars; j++ ) + if ( Abc_TtVarsAreSymmetric(&t, nVars, i, j, &Cof0, &Cof1) ) + SymVars |= (1 << j); + return SymVars; +} +int Dau_CountCompl1( word t, int v, int nVars ) +{ + word tNew = Abc_Tt6Flip(t, v); + int k; + if ( tNew == ~t ) + return 1; + for ( k = 0; k < nVars; k++ ) if ( k != v ) + if ( tNew == Abc_Tt6Flip(t, k) ) + return 1; + return 0; +} +int Dau_CountCompl( word t, int nVars ) +{ + int i, nPairs = 0; + for ( i = 0; i < nVars; i++ ) + nPairs += Dau_CountCompl1(t, i, nVars); + return nPairs; +} + +/**Function************************************************************* + + Synopsis [Performs exact canonicization of semi-canonical classes.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Vec_Wrd_t * Dau_ExactNpnForClasses( Vec_Mem_t * vTtMem, Vec_Int_t * vNodSup, int nVars, int nInputs ) +{ + Vec_Wrd_t * vCanons = Vec_WrdStart( Vec_IntSize(vNodSup) ); + word pAuxWord[1024], pAuxWord1[1024]; + word uTruth; int i, Entry; + permInfo * pi = setPermInfoPtr(nVars); + Vec_IntForEachEntry( vNodSup, Entry, i ) + { + if ( (Entry & 0xF) > nVars ) + continue; + uTruth = *Vec_MemReadEntry( vTtMem, i ); + simpleMinimal(&uTruth, pAuxWord, pAuxWord1, pi, nVars); + Vec_WrdWriteEntry( vCanons, i, uTruth ); + } + freePermInfoPtr(pi); + return vCanons; +} +void Dau_ExactNpnPrint( Vec_Mem_t * vTtMem, Vec_Int_t * vNodSup, int nVars, int nInputs, int nNodesMax ) +{ + abctime clk = Abc_Clock(); int n, nTotal = 0; + Vec_Wrd_t * vCanons = Dau_ExactNpnForClasses( vTtMem, vNodSup, nVars, nInputs ); + Vec_Mem_t * vTtMem2 = Vec_MemAlloc( Vec_MemEntrySize(vTtMem), 10 ); + Vec_MemHashAlloc( vTtMem2, 1<<10 ); + Abc_PrintTime( 1, "Exact NPN computation time", Abc_Clock() - clk ); + printf( "Final results:\n" ); + for ( n = 0; n <= nNodesMax; n++ ) + { + int i, Entry, Entry2, nEntries2, Counter = 0, Counter2 = 0; + Vec_IntForEachEntry( vNodSup, Entry, i ) + { + if ( (Entry & 0xF) > nVars || (Entry >> 16) != n ) + continue; + Counter++; + nEntries2 = Vec_MemEntryNum(vTtMem2); + Entry2 = Vec_MemHashInsert( vTtMem2, Vec_WrdEntryP(vCanons, i) ); + if ( nEntries2 == Vec_MemEntryNum(vTtMem2) ) // found in the table - not new + continue; + Counter2++; + } + nTotal += Counter2; + printf( "Nodes = %2d. ", n ); + printf( "Semi-canonical = %8d. ", Counter ); + printf( "Canonical = %8d. ", Counter2 ); + printf( "Total = %8d.", nTotal ); + printf( "\n" ); + } + Vec_MemHashFree( vTtMem2 ); + Vec_MemFreeP( &vTtMem2 ); + Vec_WrdFree( vCanons ); + fflush(stdout); +} + +/**Function************************************************************* + + Synopsis [Saving hash tables.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Dau_TablesSave( int nInputs, int nVars, Vec_Mem_t * vTtMem, Vec_Int_t * vNodSup, int nFronts, abctime clk ) +{ + FILE * pFile; + char FileName[100]; + int i, nWords = Abc_TtWordNum(nInputs); + // NPN classes + sprintf( FileName, "npn%d%d.ttd", nInputs, nVars ); + pFile = fopen( FileName, "wb" ); + for ( i = 0; i < Vec_MemEntryNum(vTtMem); i++ ) + fwrite( Vec_MemReadEntry(vTtMem, i), 8, nWords, pFile ); + fwrite( Vec_IntArray(vNodSup), 4, Vec_IntSize(vNodSup), pFile ); + fclose( pFile ); +// printf( "Dumped files with %10d classes after exploring %10d frontiers.\n", +// Vec_IntSize(vNodSup), nFronts ); + printf( "Dumped file \"%s\" with %10d classes after exploring %10d frontiers. ", + FileName, Vec_IntSize(vNodSup), nFronts ); + Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); + fflush(stdout); +} + +/**Function************************************************************* + + Synopsis [Dump functions by the number of nodes.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Dau_DumpFuncs( Vec_Mem_t * vTtMem, Vec_Int_t * vNodSup, int nVars, int nMax ) +{ + FILE * pFile[20]; + int Counters[20] = {0}; + int n, i; + assert( nVars == 4 || nVars == 5 ); + for ( n = 0; n <= nMax; n++ ) + { + char FileName[100]; + sprintf( FileName, "func%d_min%d.tt", nVars, n ); + pFile[n] = fopen( FileName, "wb" ); + } + for ( i = 0; i < Vec_MemEntryNum(vTtMem); i++ ) + { + word * pTruth = Vec_MemReadEntry( vTtMem, i ); + int NodSup = Vec_IntEntry( vNodSup, i ); + if ( (NodSup & 0xF) != nVars ) + continue; + Counters[NodSup >> 16]++; + if ( nVars == 4 ) + fprintf( pFile[NodSup >> 16], "%04x\n", (int)(0xFFFF & pTruth[0]) ); + else if ( nVars == 5 ) + fprintf( pFile[NodSup >> 16], "%08x\n", (int)(0xFFFFFFFF & pTruth[0]) ); + } + for ( n = 0; n <= nMax; n++ ) + { + printf( "Dumped %8d %d-node %d-input functions into file.\n", Counters[n], n, nVars ); + fclose( pFile[n] ); + } +} + +/**Function************************************************************* + + Synopsis [Function enumeration.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Dau_CountFuncs( Vec_Int_t * vNodSup, int iStart, int iStop, int nVars ) +{ + int i, Entry, Count = 0; + Vec_IntForEachEntryStartStop( vNodSup, Entry, i, iStart, iStop ) + Count += ((Entry & 0xF) <= nVars); + return Count; +} +int Dau_PrintStats( int nNodes, int nInputs, int nVars, Vec_Int_t * vNodSup, int iStart, int iStop, word nSteps, int Count2, abctime clk ) +{ + int nNew; + printf("N =%2d | ", nNodes ); + printf("C =%12.0f ", (double)(iword)nSteps ); + printf("New%d =%10d ", nInputs, iStop-iStart ); + printf("All%d =%10d | ", nInputs, iStop ); + printf("New%d =%8d ", nVars, nNew = Dau_CountFuncs(vNodSup, iStart, iStop, nVars) ); + printf("All%d =%8d ", nVars, Dau_CountFuncs(vNodSup, 0, iStop, nVars) ); + printf("Two =%6d ", Count2 ); + //Abc_PrintTime( 1, "T", Abc_Clock() - clk ); + Abc_Print(1, "%9.2f sec\n", 1.0*(Abc_Clock() - clk)/(CLOCKS_PER_SEC)); + fflush(stdout); + return nNew; +} + + +int Dau_InsertFunction( Abc_TtHieMan_t * pMan, word * pCur, int nNodes, int nInputs, int nVars0, int nVars, + Vec_Mem_t * vTtMem, Vec_Int_t * vNodSup, int nFronts, abctime clk ) +{ + int DumpDelta = 1000000; + char Perm[16] = {0}; + int nVarsNew = Abc_TtMinBase( pCur, NULL, nVars, nInputs ); + //unsigned Phase = Abc_TtCanonicizeHie( pMan, pCur, nVarsNew, Perm, 1 ); + unsigned Phase = Abc_TtCanonicizeWrap( Abc_TtCanonicizeAda, pMan, pCur, nVarsNew, Perm, 99 ); + int nEntries = Vec_MemEntryNum(vTtMem); + int Entry = Vec_MemHashInsert( vTtMem, pCur ); + if ( nEntries == Vec_MemEntryNum(vTtMem) ) // found in the table - not new + return 0; + Entry = 0; + Phase = 0; + // this is a new class + Vec_IntPush( vNodSup, (nNodes << 16) | nVarsNew ); + assert( Vec_MemEntryNum(vTtMem) == Vec_IntSize(vNodSup) ); + if ( Vec_IntSize(vNodSup) % DumpDelta == 0 ) + Dau_TablesSave( nInputs, nVars0, vTtMem, vNodSup, nFronts, clk ); + return 1; +} +void Dau_FunctionEnum( int nInputs, int nVars, int nNodeMax, int fUseTwo, int fReduce, int fVerbose ) +{ + abctime clk = Abc_Clock(); + int nWords = Abc_TtWordNum(nInputs); word nSteps = 0; + Abc_TtHieMan_t * pMan = Abc_TtHieManStart( nInputs, 5 ); + Vec_Mem_t * vTtMem = Vec_MemAlloc( nWords, 16 ); + Vec_Int_t * vNodSup = Vec_IntAlloc( 1 << 16 ); + int v, u, k, m, n, Entry, nNew, Limit[32] = {1, 2}; + word Truth[4] = {0}; + assert( nVars >= 3 && nVars <= nInputs && nInputs <= 6 ); + Vec_MemHashAlloc( vTtMem, 1<<16 ); + // add constant 0 + Vec_MemHashInsert( vTtMem, Truth ); + Vec_IntPush( vNodSup, 0 ); // nodes=0, supp=0 + // add buffer/inverter + Abc_TtIthVar( Truth, 0, nInputs ); + Abc_TtNot( Truth, nWords ); + Vec_MemHashInsert( vTtMem, Truth ); + Vec_IntPush( vNodSup, 1 ); // nodes=0, supp=1 + Dau_PrintStats( 0, nInputs, nVars, vNodSup, 0, 2, nSteps, 0, clk ); + // numerate other functions based on how many nodes they have + for ( n = 1; n <= nNodeMax; n++ ) + { + int Count2 = 0; + int fExpand = !(fReduce && n == nNodeMax); + for ( Entry = Limit[n-1]; Entry < Limit[n]; Entry++ ) + { + word * pTruth = Vec_MemReadEntry( vTtMem, Entry ); + int NodSup = Vec_IntEntry(vNodSup, Entry); + int nSupp = 0xF & NodSup; + int SymVars = Dau_CountSymms2( pTruth[0], nSupp ); + assert( n-1 == (NodSup >> 16) ); + assert( !Abc_Tt6HasVar(*pTruth, nSupp) ); + //printf( "Exploring function %4d with %d vars: ", i, nSupp ); + //printf( " %04x\n", (int)uTruth ); + //Dau_DsdPrintFromTruth( &uTruth, 4 ); + for ( v = 0; v < nSupp; v++ ) if ( (SymVars & (1 << v)) == 0 ) + { + word tGate, tCur; + word Cof0 = Abc_Tt6Cofactor0( *pTruth, v ); + word Cof1 = Abc_Tt6Cofactor1( *pTruth, v ); + // add one extra variable to support + if ( nSupp < nInputs && fExpand ) + { + tGate = s_Truths6[v] & s_Truths6[nSupp]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp+1, vTtMem, vNodSup, Entry, clk ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp+1, vTtMem, vNodSup, Entry, clk ); + + + tGate = s_Truths6[v] ^ s_Truths6[nSupp]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp+1, vTtMem, vNodSup, Entry, clk ); + + nSteps += 3; + } + // add one cross bar + if ( fExpand ) + for ( k = 0; k < nSupp; k++ ) if ( k != v && ((SymVars & (1 << k)) == 0 || k == v+1) ) + { + tGate = s_Truths6[v] & s_Truths6[k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + tGate = s_Truths6[v] & ~s_Truths6[k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + + tGate = s_Truths6[v] ^ s_Truths6[k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + nSteps += 5; + } + // add two cross bars + for ( k = 0; k < nSupp; k++ ) if ( k != v )//&& ((SymVars & (1 << k)) == 0) ) + for ( m = k+1; m < nSupp; m++ ) if ( m != v )//&& ((SymVars & (1 << m)) == 0 || m == k+1) ) + { + tGate = s_Truths6[m] & s_Truths6[k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + tGate = s_Truths6[m] & ~s_Truths6[k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + tGate = ~s_Truths6[m] & s_Truths6[k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + tGate = ~s_Truths6[m] & ~s_Truths6[k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + + tGate = s_Truths6[m] ^ s_Truths6[k]; + tCur = (tGate & Cof1) | (~tGate & Cof0); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + tGate = s_Truths6[m] ^ s_Truths6[k]; + tCur = (tGate & Cof0) | (~tGate & Cof1); + Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + + nSteps += 10; + } + } + } + if ( fUseTwo && n > 2 && fExpand ) + for ( Entry = Limit[n-2]; Entry < Limit[n-1]; Entry++ ) + { + word * pTruth = Vec_MemReadEntry( vTtMem, Entry ); + int NodSup = Vec_IntEntry(vNodSup, Entry); + int nSupp = 0xF & NodSup; int g1, g2; + assert( n-2 == (NodSup >> 16) ); + assert( !Abc_Tt6HasVar(*pTruth, nSupp) ); + for ( v = 0; v < nSupp; v++ ) + for ( u = 0; u < nSupp; u++ ) if ( u != v ) + { + word Cof0 = Abc_Tt6Cofactor0( *pTruth, v ); + word Cof1 = Abc_Tt6Cofactor1( *pTruth, v ); + + word Cof00 = Abc_Tt6Cofactor0( Cof0, u ); + word Cof01 = Abc_Tt6Cofactor1( Cof0, u ); + word Cof10 = Abc_Tt6Cofactor0( Cof1, u ); + word Cof11 = Abc_Tt6Cofactor1( Cof1, u ); + + word tGates[5], tCur; + tGates[0] = s_Truths6[v] & s_Truths6[u]; + tGates[1] = s_Truths6[v] & ~s_Truths6[u]; + tGates[2] = ~s_Truths6[v] & s_Truths6[u]; + tGates[3] = s_Truths6[v] | s_Truths6[u]; + tGates[4] = s_Truths6[v] ^ s_Truths6[u]; + + for ( g1 = 0; g1 < 5; g1++ ) + for ( g2 = g1+1; g2 < 5; g2++ ) + { + Cof0 = (tGates[g1] & Cof01) | (~tGates[g1] & Cof00); + Cof1 = (tGates[g1] & Cof11) | (~tGates[g1] & Cof10); + + tCur = (tGates[g2] & Cof1) | (~tGates[g2] & Cof0); + Count2 += Dau_InsertFunction( pMan, &tCur, n, nInputs, nVars, nSupp, vTtMem, vNodSup, Entry, clk ); + } + } + } + Limit[n+1] = Vec_IntSize(vNodSup); + nNew = Dau_PrintStats( n, nInputs, nVars, vNodSup, Limit[n], Limit[n+1], nSteps, Count2, clk ); + if ( nNew == 0 ) + break; + } + Dau_TablesSave( nInputs, nVars, vTtMem, vNodSup, Vec_IntSize(vNodSup), clk ); + Abc_PrintTime( 1, "Total time", Abc_Clock() - clk ); + //Dau_DumpFuncs( vTtMem, vNodSup, nVars, nNodeMax ); + //Dau_ExactNpnPrint( vTtMem, vNodSup, nVars, nInputs, n ); + Abc_TtHieManStop( pMan ); + Vec_MemHashFree( vTtMem ); + Vec_MemFreeP( &vTtMem ); + Vec_IntFree( vNodSup ); + fflush(stdout); +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + +ABC_NAMESPACE_IMPL_END + diff --git a/src/opt/dau/dauNpn2.c b/src/opt/dau/dauNpn2.c new file mode 100644 index 00000000..bca65ad0 --- /dev/null +++ b/src/opt/dau/dauNpn2.c @@ -0,0 +1,507 @@ +/**CFile**************************************************************** + + FileName [dau.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [DAG-aware unmapping.] + + Synopsis [] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - June 20, 2005.] + + Revision [$Id: dau.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "dauInt.h" +#include "misc/util/utilTruth.h" +#include "misc/extra/extra.h" + +ABC_NAMESPACE_IMPL_START + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +typedef struct Dtt_Man_t_ Dtt_Man_t; +struct Dtt_Man_t_ +{ + int nVars; // variable number + int nPerms; // number of permutations + int nComps; // number of complementations + int * pPerms; // permutations + int * pComps; // complementations + word * pPres; // function marks + Vec_Int_t * vFanins; // node fanins + Vec_Int_t * vTruths; // node truth tables + Vec_Int_t * vConfigs; // configurations + Vec_Int_t * vClasses; // node NPN classes + Vec_Int_t * vTruthNpns; // truth tables of the classes + Vec_Wec_t * vFunNodes; // nodes by NPN class + Vec_Int_t * vTemp; // temporary + Vec_Int_t * vTemp2; // temporary + unsigned FunMask; // function mask + unsigned CmpMask; // function mask + unsigned BinMask; // hash mask + unsigned * pBins; // hash bins + Vec_Int_t * vUsedBins; // used bins + int Counts[32]; // node counts + int nClasses; // count of classes + unsigned * pTable; // mapping of funcs into their classes + int * pNodes; // the number of nodes in min-node network + int * pTimes; // the number of different min-node networks + char * pVisited; // visited classes + Vec_Int_t * vVisited; // the number of visited classes +}; + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +unsigned * Dau_ReadFile2( char * pFileName, int nSizeW ) +{ + abctime clk = Abc_Clock(); + FILE * pFile = fopen( pFileName, "rb" ); + unsigned * p = (unsigned *)ABC_CALLOC(word, nSizeW); + int RetValue = pFile ? fread( p, sizeof(word), nSizeW, pFile ) : 0; + RetValue = 0; + if ( pFile ) + { + printf( "Finished reading file \"%s\".\n", pFileName ); + fclose( pFile ); + } + else + printf( "Cannot open input file \"%s\".\n", pFileName ); + Abc_PrintTime( 1, "File reading", Abc_Clock() - clk ); + return p; +} +void Dtt_ManRenum( int nVars, unsigned * pTable, int * pnClasses ) +{ + unsigned i, Limit = 1 << ((1 << nVars)-1), Count = 0; + for ( i = 0; i < Limit; i++ ) + if ( pTable[i] == i ) + pTable[i] = Count++; + else + { + assert( pTable[i] < i ); + pTable[i] = pTable[pTable[i]]; + } + printf( "The total number of NPN classes = %d.\n", Count ); + *pnClasses = Count; +} +unsigned * Dtt_ManLoadClasses( int nVars, int * pnClasses ) +{ + unsigned * pTable = NULL; + if ( nVars == 4 ) + pTable = Dau_ReadFile2( "tableW14.data", 1 << 14 ); + else if ( nVars == 5 ) + pTable = Dau_ReadFile2( "tableW30.data", 1 << 30 ); + else assert( 0 ); + Dtt_ManRenum( nVars, pTable, pnClasses ); + return pTable; +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Dtt_ManAddVisited( Dtt_Man_t * p, unsigned Truth2, int n ) +{ + unsigned Truth = Truth2 & p->CmpMask ? ~Truth2 : Truth2; + unsigned Class = p->pTable[Truth & p->FunMask]; + assert( Class < (unsigned)p->nClasses ); + if ( p->pNodes[Class] < n ) + return; + assert( p->pNodes[Class] == n ); + if ( p->pVisited[Class] ) + return; + p->pVisited[Class] = 1; + Vec_IntPush( p->vVisited, Class ); +} +void Dtt_ManProcessVisited( Dtt_Man_t * p ) +{ + int i, Class; + Vec_IntForEachEntry( p->vVisited, Class, i ) + { + assert( p->pVisited[Class] ); + p->pVisited[Class] = 0; + p->pTimes[Class]++; + } + Vec_IntClear( p->vVisited ); +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Dtt_Man_t * Dtt_ManAlloc( int nVars, int fMulti ) +{ + Dtt_Man_t * p = ABC_CALLOC( Dtt_Man_t, 1 ); + p->nVars = nVars; + p->nPerms = Extra_Factorial( nVars ); + p->nComps = 1 << nVars; + p->pPerms = Extra_PermSchedule( nVars ); + p->pComps = Extra_GreyCodeSchedule( nVars ); + p->pPres = ABC_CALLOC( word, 1 << (p->nComps - 7) ); + p->vFanins = Vec_IntAlloc( 2*617000 ); + p->vTruths = Vec_IntAlloc( 617000 ); + p->vConfigs = Vec_IntAlloc( 617000 ); + p->vClasses = Vec_IntAlloc( 617000 ); + p->vTruthNpns = Vec_IntAlloc( 617000 ); + p->vFunNodes = Vec_WecStart( 16 ); + p->vTemp = Vec_IntAlloc( 4000 ); + p->vTemp2 = Vec_IntAlloc( 4000 ); + p->FunMask = nVars == 5 ? ~0 : (nVars == 4 ? 0xFFFF : 0xFF); + p->CmpMask = nVars == 5 ? 1 << 31 : (nVars == 4 ? 1 << 15 : 1 << 7); + p->BinMask = 0x3FFF; + p->pBins = ABC_FALLOC( unsigned, p->BinMask + 1 ); + p->vUsedBins = Vec_IntAlloc( 4000 ); + if ( !fMulti ) return p; + p->pTable = Dtt_ManLoadClasses( p->nVars, &p->nClasses ); + p->pNodes = ABC_CALLOC( int, p->nClasses ); + p->pTimes = ABC_CALLOC( int, p->nClasses ); + p->pVisited = ABC_CALLOC( char, p->nClasses ); + p->vVisited = Vec_IntAlloc( 1000 ); + return p; +} +void Dtt_ManFree( Dtt_Man_t * p ) +{ + Vec_IntFreeP( &p->vVisited ); + ABC_FREE( p->pTable ); + ABC_FREE( p->pNodes ); + ABC_FREE( p->pTimes ); + ABC_FREE( p->pVisited ); + Vec_IntFreeP( &p->vFanins ); + Vec_IntFreeP( &p->vTruths ); + Vec_IntFreeP( &p->vConfigs ); + Vec_IntFreeP( &p->vClasses ); + Vec_IntFreeP( &p->vTruthNpns ); + Vec_WecFreeP( &p->vFunNodes ); + Vec_IntFreeP( &p->vTemp ); + Vec_IntFreeP( &p->vTemp2 ); + Vec_IntFreeP( &p->vUsedBins ); + ABC_FREE( p->pPerms ); + ABC_FREE( p->pComps ); + ABC_FREE( p->pPres ); + ABC_FREE( p->pBins ); + ABC_FREE( p ); +} + +/**Function************************************************************* + + Synopsis [Collect representatives of the same class.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline unsigned Dtt_ManHashKey( Dtt_Man_t * p, unsigned Truth ) +{ + static unsigned s_P[4] = { 1699, 5147, 7103, 8147 }; + unsigned char * pD = (unsigned char*)&Truth; + return pD[0] * s_P[0] + pD[1] * s_P[1] + pD[2] * s_P[2] + pD[3] * s_P[3]; +} +int Dtt_ManCheckHash( Dtt_Man_t * p, unsigned Truth ) +{ + unsigned Hash = Dtt_ManHashKey(p, Truth); + unsigned * pSpot = p->pBins + (Hash & p->BinMask); + for ( ; ~*pSpot; Hash++, pSpot = p->pBins + (Hash & p->BinMask) ) + if ( *pSpot == Truth ) // equal + return 0; + Vec_IntPush( p->vUsedBins, pSpot - p->pBins ); + *pSpot = Truth; + return 1; +} +Vec_Int_t * Dtt_ManCollect( Dtt_Man_t * p, unsigned Truth, Vec_Int_t * vFuns ) +{ + int i, k, Entry; + word tCur = ((word)Truth << 32) | (word)Truth; + Vec_IntClear( vFuns ); + for ( i = 0; i < p->nPerms; i++ ) + { + for ( k = 0; k < p->nComps; k++ ) + { +// unsigned tTemp = (unsigned)(tCur & 1 ? ~tCur : tCur); + unsigned tTemp = (unsigned)(tCur & p->CmpMask ? ~tCur : tCur); + if ( Dtt_ManCheckHash( p, tTemp ) ) + Vec_IntPush( vFuns, tTemp ); + tCur = Abc_Tt6Flip( tCur, p->pComps[k] ); + } + tCur = Abc_Tt6SwapAdjacent( tCur, p->pPerms[i] ); + } + assert( tCur == (((word)Truth << 32) | (word)Truth) ); + // clean hash table + Vec_IntForEachEntry( p->vUsedBins, Entry, i ) + p->pBins[Entry] = ~0; + Vec_IntClear( p->vUsedBins ); + //printf( "%d ", Vec_IntSize(vFuns) ); + return vFuns; +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline int Dtt_ManGetFun( Dtt_Man_t * p, unsigned tFun ) +{ + tFun = tFun & p->CmpMask ? ~tFun : tFun; + return Abc_TtGetBit( p->pPres, tFun & p->FunMask ); +} +static inline void Dtt_ManSetFun( Dtt_Man_t * p, unsigned tFun ) +{ + tFun = tFun & p->CmpMask ? ~tFun : tFun; + //assert( !Dtt_ManGetFun(p, fFun & p->FunMask ); + Abc_TtSetBit( p->pPres, tFun & p->FunMask ); +} +void Dtt_ManAddFunction( Dtt_Man_t * p, int n, int FanI, int FanJ, int Type, unsigned Truth ) +{ + Vec_Int_t * vFuncs = Dtt_ManCollect( p, Truth, p->vTemp2 ); + unsigned Min = Vec_IntFindMin( vFuncs ); + int i, nObjs = Vec_IntSize(p->vFanins)/2; + int nNodesI = 0xF & (Vec_IntEntry(p->vConfigs, FanI) >> 3); + int nNodesJ = 0xF & (Vec_IntEntry(p->vConfigs, FanJ) >> 3); + int nNodes = nNodesI + nNodesJ + 1; + assert( nObjs == Vec_IntSize(p->vTruths) ); + assert( nObjs == Vec_IntSize(p->vConfigs) ); + assert( nObjs == Vec_IntSize(p->vClasses) ); + Vec_WecPush( p->vFunNodes, n, nObjs ); + Vec_IntPushTwo( p->vFanins, FanI, FanJ ); + Vec_IntPush( p->vTruths, Truth ); + Vec_IntPush( p->vConfigs, (nNodes << 3) | Type ); + Vec_IntPush( p->vClasses, Vec_IntSize(p->vTruthNpns) ); + Vec_IntPush( p->vTruthNpns, Min ); + Vec_IntForEachEntry( vFuncs, Min, i ) + Dtt_ManSetFun( p, Min ); + assert( nNodes < 32 ); + p->Counts[nNodes]++; + + if ( p->pTable == NULL ) + return; + Truth = Truth & p->CmpMask ? ~Truth : Truth; + Truth &= p->FunMask; + assert( p->pNodes[p->pTable[Truth]] == 0 ); + p->pNodes[p->pTable[Truth]] = n; +} + +int Dtt_PrintStats( int nNodes, int nVars, Vec_Wec_t * vFunNodes, word nSteps, abctime clk, int fDelay, word nMultis ) +{ + int nNew = Vec_IntSize(Vec_WecEntry(vFunNodes, nNodes)); + printf("%c =%2d | ", fDelay ? 'D':'N', nNodes ); + printf("C =%12.0f | ", (double)(iword)nSteps ); + printf("New%d =%10d ", nVars, nNew + (int)(nNodes==0) ); + printf("All%d =%10d | ", nVars, Vec_WecSizeSize(vFunNodes)+1 ); + printf("Multi =%10d | ", (int)nMultis ); + Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); + //Abc_Print(1, "%9.2f sec\n", 1.0*(Abc_Clock() - clk)/(CLOCKS_PER_SEC)); + fflush(stdout); + return nNew; +} +void Dtt_PrintDistrib( Dtt_Man_t * p ) +{ + int i; + printf( "NPN classes for each node count (N):\n" ); + for ( i = 0; i < 32; i++ ) + if ( p->Counts[i] ) + printf( "N = %2d : NPN = %6d\n", i, p->Counts[i] ); +} +void Dtt_PrintMulti2( Dtt_Man_t * p ) +{ + int i, n; + for ( n = 0; n <= 7; n++ ) + { + printf( "n=%d : ", n); + for ( i = 0; i < p->nClasses; i++ ) + if ( p->pNodes[i] == n ) + printf( "%d ", p->pTimes[i] ); + printf( "\n" ); + } +} +void Dtt_PrintMulti1( Dtt_Man_t * p ) +{ + int i, n, Entry, Count, Prev; + for ( n = 0; n < 16; n++ ) + { + Vec_Int_t * vTimes = Vec_IntAlloc( 100 ); + Vec_Int_t * vUsed = Vec_IntAlloc( 100 ); + for ( i = 0; i < p->nClasses; i++ ) + if ( p->pNodes[i] == n ) + Vec_IntPush( vTimes, p->pTimes[i] ); + if ( Vec_IntSize(vTimes) == 0 ) + { + Vec_IntFree(vTimes); + Vec_IntFree(vUsed); + break; + } + Vec_IntSort( vTimes, 0 ); + Count = 1; + Prev = Vec_IntEntry( vTimes, 0 ); + Vec_IntForEachEntryStart( vTimes, Entry, i, 1 ) + if ( Prev == Entry ) + Count++; + else + { + assert( Prev < Entry ); + Vec_IntPushTwo( vUsed, Prev, Count ); + Count = 1; + Prev = Entry; + } + if ( Count > 0 ) + Vec_IntPushTwo( vUsed, Prev, Count ); + printf( "n=%d : ", n); + Vec_IntForEachEntryDouble( vUsed, Prev, Entry, i ) + printf( "%d=%d ", Prev, Entry ); + printf( "\n" ); + Vec_IntFree( vTimes ); + Vec_IntFree( vUsed ); + } +} +void Dtt_PrintMulti( Dtt_Man_t * p ) +{ + int n, Counts[13][11] = {{0}}; + for ( n = 0; n < 13; n++ ) + { + int i, Total = 0, Count = 0; + for ( i = 0; i < p->nClasses; i++ ) + if ( p->pNodes[i] == n ) + { + int Log = Abc_Base2Log(p->pTimes[i]); + assert( Log < 11 ); + if ( p->pTimes[i] < 2 ) + Counts[n][0]++; + else + Counts[n][Log]++; + Total += p->pTimes[i]; + Count++; + } + if ( Count == 0 ) + break; + printf( "n=%2d : ", n ); + printf( "All = %7d ", Count ); + printf( "Ave = %6.2f ", 1.0*Total/Count ); + for ( i = 0; i < 11; i++ ) + if ( Counts[n][i] ) + printf( "%6d", Counts[n][i] ); + else + printf( "%6s", "" ); + printf( "\n" ); + } +} +void Dtt_EnumerateLf( int nVars, int nNodeMax, int fDelay, int fMulti, int fVerbose ) +{ + abctime clk = Abc_Clock(); word nSteps = 0, nMultis = 0; + Dtt_Man_t * p = Dtt_ManAlloc( nVars, fMulti ); int n, i, j; + // constant zero class + Vec_IntPushTwo( p->vFanins, 0, 0 ); + Vec_IntPush( p->vTruths, 0 ); + Vec_IntPush( p->vConfigs, 0 ); + Vec_IntPush( p->vClasses, Vec_IntSize(p->vTruthNpns) ); + Vec_IntPush( p->vTruthNpns, 0 ); + Dtt_ManSetFun( p, 0 ); + // buffer class + Vec_WecPush( p->vFunNodes, 0, Vec_IntSize(p->vFanins)/2 ); + Vec_IntPushTwo( p->vFanins, 0, 0 ); + Vec_IntPush( p->vTruths, (unsigned)s_Truths6[0] ); + Vec_IntPush( p->vConfigs, 0 ); + Vec_IntPush( p->vClasses, Vec_IntSize(p->vTruthNpns) ); + Vec_IntPush( p->vTruthNpns, (unsigned)s_Truths6[0] ); + for ( i = 0; i < nVars; i++ ) + Dtt_ManSetFun( p, (unsigned)s_Truths6[i] ); + p->Counts[0] = 2; + // enumerate + Dtt_PrintStats(0, nVars, p->vFunNodes, nSteps, clk, fDelay, 0); + for ( n = 1; n <= nNodeMax; n++ ) + { + for ( i = 0, j = n - 1; i < n; i++, j = j - 1 + fDelay ) if ( i <= j ) + { + Vec_Int_t * vFaninI = Vec_WecEntry( p->vFunNodes, i ); + Vec_Int_t * vFaninJ = Vec_WecEntry( p->vFunNodes, j ); + int k, i0, j0, EntryI, EntryJ; + Vec_IntForEachEntry( vFaninI, EntryI, i0 ) + { + unsigned TruthI = Vec_IntEntry(p->vTruths, EntryI); + Vec_Int_t * vFuns = Dtt_ManCollect( p, TruthI, p->vTemp ); + int Start = i == j ? i0 : 0; + Vec_IntForEachEntryStart( vFaninJ, EntryJ, j0, Start ) + { + unsigned Truth, TruthJ = Vec_IntEntry(p->vTruths, EntryJ); + Vec_IntForEachEntry( vFuns, Truth, k ) + { + if ( !Dtt_ManGetFun(p, TruthJ & Truth) ) + Dtt_ManAddFunction( p, n, EntryI, EntryJ, 0, TruthJ & Truth ); + if ( !Dtt_ManGetFun(p, TruthJ & ~Truth) ) + Dtt_ManAddFunction( p, n, EntryI, EntryJ, 1, TruthJ & ~Truth ); + if ( !Dtt_ManGetFun(p, ~TruthJ & Truth) ) + Dtt_ManAddFunction( p, n, EntryI, EntryJ, 2, ~TruthJ & Truth ); + if ( !Dtt_ManGetFun(p, TruthJ | Truth) ) + Dtt_ManAddFunction( p, n, EntryI, EntryJ, 3, TruthJ | Truth ); + if ( !Dtt_ManGetFun(p, TruthJ ^ Truth) ) + Dtt_ManAddFunction( p, n, EntryI, EntryJ, 4, TruthJ ^ Truth ); + nSteps += 5; + + if ( p->pTable ) Dtt_ManAddVisited( p, TruthJ & Truth, n ); + if ( p->pTable ) Dtt_ManAddVisited( p, TruthJ & ~Truth, n ); + if ( p->pTable ) Dtt_ManAddVisited( p, ~TruthJ & Truth, n ); + if ( p->pTable ) Dtt_ManAddVisited( p, TruthJ | Truth, n ); + if ( p->pTable ) Dtt_ManAddVisited( p, TruthJ ^ Truth, n ); + } + nMultis++; + if ( p->pTable ) Dtt_ManProcessVisited( p ); + } + } + } + if ( Dtt_PrintStats(n, nVars, p->vFunNodes, nSteps, clk, fDelay, nMultis) == 0 ) + break; + } + if ( fDelay ) + Dtt_PrintDistrib( p ); + if ( p->pTable ) + Dtt_PrintMulti( p ); + Dtt_ManFree( p ); +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + +ABC_NAMESPACE_IMPL_END + diff --git a/src/opt/dau/module.make b/src/opt/dau/module.make index 190e30e4..5feb1040 100644 --- a/src/opt/dau/module.make +++ b/src/opt/dau/module.make @@ -1,9 +1,12 @@ SRC += src/opt/dau/dauCanon.c \ src/opt/dau/dauCore.c \ + src/opt/dau/dauCount.c \ src/opt/dau/dauDivs.c \ src/opt/dau/dauDsd.c \ src/opt/dau/dauEnum.c \ src/opt/dau/dauGia.c \ src/opt/dau/dauMerge.c \ src/opt/dau/dauNonDsd.c \ + src/opt/dau/dauNpn.c \ + src/opt/dau/dauNpn2.c \ src/opt/dau/dauTree.c diff --git a/src/opt/lpk/lpkAbcUtil.c b/src/opt/lpk/lpkAbcUtil.c index b96614d2..24a42b5f 100644 --- a/src/opt/lpk/lpkAbcUtil.c +++ b/src/opt/lpk/lpkAbcUtil.c @@ -124,7 +124,7 @@ Lpk_Fun_t * Lpk_FunDup( Lpk_Fun_t * p, unsigned * pTruth ) pNew->uSupp = Kit_TruthSupport( pTruth, p->nVars ); Kit_TruthCopy( Lpk_FunTruth(pNew,0), pTruth, p->nVars ); memcpy( pNew->pFanins, p->pFanins, 16 ); - memcpy( pNew->pDelays, p->pDelays, 16 ); + memcpy( pNew->pDelays, p->pDelays, sizeof(int)*16 ); Vec_PtrPush( p->vNodes, pNew ); return pNew; } @@ -212,7 +212,7 @@ void Lpk_FunComputeCofSupps( Lpk_Fun_t * p ) SeeAlso [] ***********************************************************************/ -int Lpk_SuppDelay( unsigned uSupp, char * pDelays ) +int Lpk_SuppDelay( unsigned uSupp, int * pDelays ) { int Delay, Var; Delay = 0; diff --git a/src/opt/lpk/lpkCore.c b/src/opt/lpk/lpkCore.c index 6595b365..27912a9a 100644 --- a/src/opt/lpk/lpkCore.c +++ b/src/opt/lpk/lpkCore.c @@ -451,6 +451,7 @@ p->timeTruth3 += Abc_Clock() - clk; printf( "%c=%d ", 'a'+k, Abc_ObjLevel(pLeaf) ); printf( "\n" ); Kit_DsdPrintFromTruth( pTruth, pCut->nLeaves ); + printf( "\n" ); // pFileName = Kit_TruthDumpToFile( pTruth, pCut->nLeaves, Count++ ); // printf( "Saved truth table in file \"%s\".\n", pFileName ); } diff --git a/src/opt/lpk/lpkInt.h b/src/opt/lpk/lpkInt.h index 841572c7..02181001 100644 --- a/src/opt/lpk/lpkInt.h +++ b/src/opt/lpk/lpkInt.h @@ -147,13 +147,13 @@ struct Lpk_Fun_t_ unsigned Id : 7; // the ID of this node unsigned nVars : 5; // the number of variables unsigned nLutK : 4; // the number of LUT inputs - unsigned nAreaLim : 5; // the area limit (the largest allowed) - unsigned nDelayLim : 9; // the delay limit (the largest allowed) + unsigned nAreaLim : 14; // the area limit (the largest allowed) unsigned fSupports : 1; // supports of cofactors were precomputed unsigned fMark : 1; // marks the MUX-based dec unsigned uSupp; // the support of this component unsigned puSupps[32]; // the supports of the cofactors - char pDelays[16]; // the delays of the inputs + unsigned nDelayLim; // the delay limit (the largest allowed) + int pDelays[16]; // the delays of the inputs char pFanins[16]; // the fanins of this function unsigned pTruth[0]; // the truth table (contains room for three truth tables) }; @@ -215,7 +215,7 @@ extern Lpk_Fun_t * Lpk_FunCreate( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, unsi extern Lpk_Fun_t * Lpk_FunDup( Lpk_Fun_t * p, unsigned * pTruth ); extern int Lpk_FunSuppMinimize( Lpk_Fun_t * p ); extern void Lpk_FunComputeCofSupps( Lpk_Fun_t * p ); -extern int Lpk_SuppDelay( unsigned uSupp, char * pDelays ); +extern int Lpk_SuppDelay( unsigned uSupp, int * pDelays ); extern int Lpk_SuppToVars( unsigned uBoundSet, char * pVars ); diff --git a/src/opt/sim/simMan.c b/src/opt/sim/simMan.c index ecee0424..b3f99f89 100644 --- a/src/opt/sim/simMan.c +++ b/src/opt/sim/simMan.c @@ -80,7 +80,7 @@ Sym_Man_t * Sym_ManStart( Abc_Ntk_t * pNtk, int fVerbose ) for ( i = 0; i < p->nOutputs; i++ ) for ( v = 0; v < p->nInputs; v++ ) if ( Sim_SuppFunHasVar( p->vSuppFun, i, v ) ) - Vec_VecPush( p->vSupports, i, (void *)(ABC_PTRUINT_T)v ); + Vec_VecPushInt( p->vSupports, i, v ); return p; } |