27# define __builtin_popcount __popcnt
38static word PMasks[5][3] = {
46static word Truth6[6] = {
54static word Truth10[10][16] = {
55 {
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA),
ABC_CONST(0xAAAAAAAAAAAAAAAA)},
56 {
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC),
ABC_CONST(0xCCCCCCCCCCCCCCCC)},
57 {
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0),
ABC_CONST(0xF0F0F0F0F0F0F0F0)},
58 {
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00),
ABC_CONST(0xFF00FF00FF00FF00)},
59 {
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000),
ABC_CONST(0xFFFF0000FFFF0000)},
60 {
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000),
ABC_CONST(0xFFFFFFFF00000000)},
61 {
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF)},
62 {
ABC_CONST(0x0000000000000000),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0x0000000000000000),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0x0000000000000000),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0x0000000000000000),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF)},
63 {
ABC_CONST(0x0000000000000000),
ABC_CONST(0x0000000000000000),
ABC_CONST(0x0000000000000000),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0x0000000000000000),
ABC_CONST(0x0000000000000000),
ABC_CONST(0x0000000000000000),
ABC_CONST(0x0000000000000000),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF)},
64 {
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(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF),
ABC_CONST(0xFFFFFFFFFFFFFFFF)}
71static inline int If_Dec10WordNum(
int nVars )
73 return nVars <= 6 ? 1 : 1 << (nVars-6);
75static void If_Dec10PrintConfigOne(
unsigned z )
78 t = (z & 0xffff) | ((z & 0xffff) << 16);
83 printf(
" %d", (z >> 16) & 7 );
84 printf(
" %d", (z >> 20) & 7 );
85 printf(
" %d", (z >> 24) & 7 );
86 printf(
" %d", (z >> 28) & 7 );
92 If_Dec10PrintConfigOne( *pZ++ );
94static inline void If_Dec10ComposeLut4(
int t,
word ** pF,
word * pR,
int nVars )
99 nWords = If_Dec10WordNum( nVars );
100 for ( w = 0; w <
nWords; w++ )
102 for ( m = 0; m < 16; m++ )
104 if ( !((t >> m) & 1) )
106 for ( w = 0; w <
nWords; w++ )
108 for ( v = 0; v < 4; v++ )
109 for ( w = 0; w <
nWords; w++ )
110 pC[w] &= ((m >> v) & 1) ? pF[v][w] : ~pF[v][w];
111 for ( w = 0; w <
nWords; w++ )
117 word pN[16][16], * pG[4];
120 nWords = If_Dec10WordNum( nVars );
121 for ( k = 0; k < nVars; k++ )
122 for ( w = 0; w <
nWords; w++ )
123 pN[k][w] = Truth10[k][w];
124 for ( i = 0; (z = pZ[i]); i++, k++ )
126 for ( v = 0; v < 4; v++ )
127 pG[v] = pN[ (z >> (16+(v<<2))) & 7 ];
128 If_Dec10ComposeLut4( (
int)(z & 0xffff), pG, pN[k], nVars );
131 for ( w = 0; w <
nWords; w++ )
132 if ( pN[k][w] != pF[w] )
137 printf(
"Verification failed!\n" );
144static inline int If_Dec10CofCount2(
word * pF,
int nVars )
146 int nShift = (1 << (nVars - 4));
147 word Mask = (((
word)1) << nShift) - 1;
148 word iCof0 = pF[0] & Mask;
149 word iCof1 = iCof0, iCof;
151 assert( nVars > 6 && nVars <= 10 );
154 for ( i = 1; i < 16; i++ )
156 iCof = (pF[(i * nShift) / 64] >> ((i * nShift) & 63)) & Mask;
159 if ( iCof1 == iCof0 )
161 else if ( iCof != iCof1 )
166static inline int If_Dec10CofCount(
word * pF,
int nVars )
168 int nShift = (1 << (nVars - 4));
169 word Mask = (((
word)1) << nShift) - 1;
170 word iCofs[16], iCof;
174 iCofs[0] = pF[0] & Mask;
175 for ( i = 1; i < 16; i++ )
177 iCof = (pF[(i * nShift) / 64] >> ((i * nShift) & 63)) & Mask;
178 for ( c = 0; c < nCofs; c++ )
179 if ( iCof == iCofs[c] )
182 iCofs[nCofs++] = iCof;
189static inline void If_Dec10Copy(
word * pOut,
word * pIn,
int nVars )
191 int w,
nWords = If_Dec10WordNum( nVars );
192 for ( w = 0; w <
nWords; w++ )
195static inline void If_Dec10SwapAdjacent(
word * pOut,
word * pIn,
int iVar,
int nVars )
197 int i, k,
nWords = If_Dec10WordNum( nVars );
198 assert( iVar < nVars - 1 );
201 int Shift = (1 << iVar);
202 for ( i = 0; i <
nWords; i++ )
203 pOut[i] = (pIn[i] & PMasks[iVar][0]) | ((pIn[i] & PMasks[iVar][1]) << Shift) | ((pIn[i] & PMasks[iVar][2]) >> Shift);
207 int Step = (1 << (iVar - 6));
208 for ( k = 0; k <
nWords; k += 4*Step )
210 for ( i = 0; i < Step; i++ )
212 for ( i = 0; i < Step; i++ )
213 pOut[Step+i] = pIn[2*Step+i];
214 for ( i = 0; i < Step; i++ )
215 pOut[2*Step+i] = pIn[Step+i];
216 for ( i = 0; i < Step; i++ )
217 pOut[3*Step+i] = pIn[3*Step+i];
224 for ( i = 0; i <
nWords; i += 2 )
226 pOut[i] = (pIn[i] &
ABC_CONST(0x00000000FFFFFFFF)) | ((pIn[i+1] &
ABC_CONST(0x00000000FFFFFFFF)) << 32);
227 pOut[i+1] = (pIn[i+1] &
ABC_CONST(0xFFFFFFFF00000000)) | ((pIn[i] &
ABC_CONST(0xFFFFFFFF00000000)) >> 32);
231static inline void If_Dec10MoveTo(
word * pF,
int nVars,
int v,
int p,
int Pla2Var[],
int Var2Pla[] )
233 word pG[16], * pIn = pF, * pOut = pG, * pTemp;
234 int iPlace0, iPlace1, Count = 0;
236 while ( Var2Pla[v] !=
p )
238 iPlace0 = Var2Pla[v];
239 iPlace1 = Var2Pla[v]+1;
240 If_Dec10SwapAdjacent( pOut, pIn, iPlace0, nVars );
241 pTemp = pIn; pIn = pOut, pOut = pTemp;
242 Var2Pla[Pla2Var[iPlace0]]++;
243 Var2Pla[Pla2Var[iPlace1]]--;
244 Pla2Var[iPlace0] ^= Pla2Var[iPlace1];
245 Pla2Var[iPlace1] ^= Pla2Var[iPlace0];
246 Pla2Var[iPlace0] ^= Pla2Var[iPlace1];
250 If_Dec10Copy( pF, pIn, nVars );
295static inline int If_DecSuppIsMinBase(
int Supp )
297 return (Supp & (Supp+1)) == 0;
299static inline int If_Dec10HasVar(
word * t,
int nVars,
int iVar )
301 int nWords = If_Dec10WordNum( nVars );
305 int i, Shift = (1 << iVar);
306 for ( i = 0; i <
nWords; i++ )
307 if ( (t[i] & ~Truth6[iVar]) != ((t[i] & Truth6[iVar]) >> Shift) )
313 int i, k, Step = (1 << (iVar - 6));
314 for ( k = 0; k <
nWords; k += 2*Step )
316 for ( i = 0; i < Step; i++ )
317 if ( t[i] != t[Step+i] )
324static inline int If_Dec10Support(
word * t,
int nVars )
327 for ( v = 0; v < nVars; v++ )
328 if ( If_Dec10HasVar( t, nVars, v ) )
336 int nWords = If_Dec10WordNum( nVars );
340 int i, Shift = (1 << iVar);
341 for ( i = 0; i <
nWords; i++ )
343 pCof0[i] = (pF[i] & ~Truth6[iVar]) | ((pF[i] & ~Truth6[iVar]) << Shift);
344 pCof1[i] = (pF[i] & Truth6[iVar]) | ((pF[i] & Truth6[iVar]) >> Shift);
350 int i, k, Step = (1 << (iVar - 6));
351 for ( k = 0; k <
nWords; k += 2*Step )
353 for ( i = 0; i < Step; i++ )
355 pCof0[i] = pCof0[Step+i] = pF[i];
356 pCof1[i] = pCof1[Step+i] = pF[Step+i];
365static inline int If_Dec10Count16(
int Num16 )
367 assert( Num16 < (1<<16)-1 );
368 return __builtin_popcount( Num16 & 0xffff );
370static inline void If_DecVerifyPerm(
int Pla2Var[10],
int Var2Pla[10],
int nVars )
373 for ( i = 0; i < nVars; i++ )
374 assert( Pla2Var[Var2Pla[i]] == i );
379 word pCof0[16], pCof1[16];
380 int Pla2Var[10], Var2Pla[10], Count[210], Masks[210];
381 int i, i0,i1,i2,i3, v, x;
382 assert( nVars >= 6 && nVars <= 10 );
384 for ( i = 0; i < nVars; i++ )
386 assert( If_Dec10HasVar( pF, nVars, i ) );
387 Pla2Var[i] = Var2Pla[i] = i;
403 for ( i0 = 0; i0 < nVars; i0++ )
404 for ( i1 = i0+1; i1 < nVars; i1++ )
405 for ( i2 = i1+1; i2 < nVars; i2++ )
406 for ( i3 = i2+1; i3 < nVars; i3++, v++ )
408 If_Dec10MoveTo( pF, nVars, i0, nVars-1, Pla2Var, Var2Pla );
409 If_Dec10MoveTo( pF, nVars, i1, nVars-2, Pla2Var, Var2Pla );
410 If_Dec10MoveTo( pF, nVars, i2, nVars-3, Pla2Var, Var2Pla );
411 If_Dec10MoveTo( pF, nVars, i3, nVars-4, Pla2Var, Var2Pla );
412 If_DecVerifyPerm( Pla2Var, Var2Pla, nVars );
413 Count[v] = If_Dec10CofCount( pF, nVars );
414 Masks[v] = (1 << i0) | (1 << i1) | (1 << i2) | (1 << i3);
417 if ( Count[v] == 2 || Count[v] > 5 )
419 for ( x = 0; x < 4; x++ )
422 if ( If_Dec10CofCount2(pCof0, nVars) <= 2 && If_Dec10CofCount2(pCof1, nVars) <= 2 )
424 Count[v] = -Count[v];
432 for ( i0 = 0; i0 < v; i0++ )
433 for ( i1 = i0+1; i1 < v; i1++ )
435 if ( If_Dec10Count16(Masks[i0] & Masks[i1]) > 10 - nVars )
439 if ( Count[i0] == 2 && Count[i1] == 2 )
442 else if ( nVars == 9 )
444 if ( (Count[i0] == 2 && Count[i1] == 2) ||
445 (Count[i0] == 2 && Count[i1] < 0) ||
446 (Count[i0] < 0 && Count[i1] == 2) )
451 if ( (Count[i0] == 2 && Count[i1] == 2) ||
452 (Count[i0] == 2 && Count[i1] < 0) ||
453 (Count[i0] < 0 && Count[i1] == 2) ||
454 (Count[i0] < 0 && Count[i1] < 0) )
476 int nSupp, fDerive = 0;
480 If_Dec10Copy( pF, (
word *)pTruth, nVars );
481 nSupp = If_Dec10Support( pF, nLeaves );
482 if ( !nSupp || !If_DecSuppIsMinBase(nSupp) )
#define ABC_CONST(number)
PARAMETERS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Extra_PrintBinary(FILE *pFile, unsigned Sign[], int nBits)
void If_Dec10PrintConfig(unsigned *pZ)
int If_Dec10Perform(word *pF, int nVars, int fDerive)
int If_CutPerformCheck10(If_Man_t *p, unsigned *pTruth, int nVars, int nLeaves, char *pStr)
void If_Dec10Verify(word *pF, int nVars, unsigned *pZ)
void If_Dec10Cofactors(word *pF, int nVars, int iVar, word *pCof0, word *pCof1)
struct If_Man_t_ If_Man_t
BASIC TYPES ///.
unsigned __int64 word
DECLARATIONS ///.
void Kit_DsdPrintFromTruth(unsigned *pTruth, int nVars)