67 return (Rsb_DecTry4(c&f5, f1, f2, f3, f4) << 16) | Rsb_DecTry4(c&~f5, f1, f2, f3, f4);
127 int nWords = Abc_TtWordNum( nVars );
128 int w, k, iMint, iShift = ( 1 << nGs );
129 unsigned uMask = (~(unsigned)0) >> (32-iShift);
131 assert( nGs > 0 && nGs < 5 );
132 for ( w = 0; w <
nWords; w++ )
136 pPat[w] = Rsb_DecTry2( ~(
word)0, g[0][w], f[w] );
138 pPat[w] = Rsb_DecTry3( ~(
word)0, g[0][w], g[1][w], f[w] );
140 pPat[w] = Rsb_DecTry4( ~(
word)0, g[0][w], g[1][w], g[2][w], f[w] );
142 pPat[w] = Rsb_DecTry5( ~(
word)0, g[0][w], g[1][w], g[2][w], g[3][w], f[w] );
144 iMint = Abc_Tt6FirstBit( (pPat[w] >> iShift) & pPat[w] & uMask );
147 CofA = Rsb_DecCofactor( g, nGs, w, iMint );
148 assert( (~f[w] & CofA) && (f[w] & CofA) );
149 *pCexA = w * 64 + Abc_Tt6FirstBit( ~f[w] & CofA );
150 *pCexB = w * 64 + Abc_Tt6FirstBit( f[w] & CofA );
157 iMint = Abc_Tt6FirstBit( (uTotal >> iShift) & uTotal & uMask );
161 for ( k = 0; k < w; k++ )
163 iMint = Abc_Tt6FirstBit( ((pPat[k] | pPat[w]) >> iShift) & (pPat[k] | pPat[w]) & uMask );
166 CofA = Rsb_DecCofactor( g, nGs, k, iMint );
167 CofB = Rsb_DecCofactor( g, nGs, w, iMint );
168 if ( (~f[k] & CofA) && (f[w] & CofB) )
170 *pCexA = k * 64 + Abc_Tt6FirstBit( ~f[k] & CofA );
171 *pCexB = w * 64 + Abc_Tt6FirstBit( f[w] & CofB );
175 assert( (f[k] & CofA) && (~f[w] & CofB) );
176 *pCexA = k * 64 + Abc_Tt6FirstBit( f[k] & CofA );
177 *pCexB = w * 64 + Abc_Tt6FirstBit( ~f[w] & CofB );
198 int pCands[16], nCands;
199 int i, c, Cand, iStart = 0;
200 if ( Vec_IntSize(vTries) == 0 )
204 for ( i = 0; i < 4; i++ )
207 for ( i = 0; i < nGs; i++ )
208 printf(
"%d", (i % 100) / 10 );
210 for ( ; i < nGsAll; i++ )
211 printf(
"%d", (i % 100) / 10 );
214 for ( i = 0; i < 4; i++ )
217 for ( i = 0; i < nGs; i++ )
218 printf(
"%d", i % 10 );
220 for ( ; i < nGsAll; i++ )
221 printf(
"%d", i % 10 );
225 for ( c = 0; iStart < Vec_IntSize(vTries); c++ )
228 for ( i = 0; i < 4; i++ )
238 pCands[nCands++] = Cand;
241 for ( i = 0; i < 4; i++ )
242 if ( pCands[i] >= 0 )
243 printf(
"%4d", pCands[i] );
248 for ( i = 0; i < nGs; i++ )
249 printf(
"%c", Abc_TtGetBit( pCexes + i, c ) ?
'.' :
'+' );
251 for ( ; i < nGsAll; i++ )
252 printf(
"%c", Abc_TtGetBit( pCexes + i, c ) ?
'.' :
'+' );
253 printf(
" %3d\n", c );
258 for ( i = 0; i < 4; i++ )
261 for ( i = 0; i < nGs; i++ )
262 printf(
"%d", Abc_TtCountOnes(pCexes[i]) / 10 );
264 for ( ; i < nGsAll; i++ )
265 printf(
"%d", Abc_TtCountOnes(pCexes[i]) / 10 );
268 for ( i = 0; i < 4; i++ )
271 for ( i = 0; i < nGs; i++ )
272 printf(
"%d", Abc_TtCountOnes(pCexes[i]) % 10 );
274 for ( ; i < nGsAll; i++ )
275 printf(
"%d", Abc_TtCountOnes(pCexes[i]) % 10 );
294 int nWords = Abc_TtWordNum( nVars );
295 int ValueB = Abc_TtGetBit( f, 0 );
296 int ValueE = Abc_TtGetBit( f, 64*
nWords-1 );
297 int iCexT0, iCexT1, iCexF0, iCexF1;
299 iCexT0 = ValueB ? 0 : Abc_TtFindFirstBit( f, nVars );
300 iCexT1 = ValueE ? 64*
nWords-1 : Abc_TtFindLastBit( f, nVars );
302 iCexF0 = !ValueB ? 0 : Abc_TtFindFirstZero( f, nVars );
303 iCexF1 = !ValueE ? 64*
nWords-1 : Abc_TtFindLastZero( f, nVars );
305 assert( !Rsb_DecTryCex( f, iCexT0, iCexF0 ) );
306 assert( !Rsb_DecTryCex( f, iCexT0, iCexF1 ) );
307 assert( !Rsb_DecTryCex( f, iCexT1, iCexF0 ) );
308 assert( !Rsb_DecTryCex( f, iCexT1, iCexF1 ) );
310 Rsb_DecRecordCex( g, nGsAll, iCexT0, iCexF0, pCexes, 0 );
311 Rsb_DecRecordCex( g, nGsAll, iCexT0, iCexF1, pCexes, 1 );
312 Rsb_DecRecordCex( g, nGsAll, iCexT1, iCexF0, pCexes, 2 );
313 Rsb_DecRecordCex( g, nGsAll, iCexT1, iCexF1, pCexes, 3 );
317 Vec_IntPush( vTries, -1 );
318 Vec_IntPush( vTries, -1 );
319 Vec_IntPush( vTries, -1 );
320 Vec_IntPush( vTries, -1 );
339 word * pCexes = Vec_WrdArray(
p->vCexes);
340 unsigned * pPat = (
unsigned *)Vec_IntArray(
p->vDecPats);
354 int i, k, j, n, iCexA, iCexB, nCexes = 0;
356 Vec_IntClear(
p->vTries );
360 p->vFanins->nSize = 1;
361 for ( i = 0; i < nGs; i++ )
365 pDivs[0] = g[i];
p->vFanins->pArray[0] = i;
366 uTruth =
Rsb_DecCheck( nVars, f, pDivs, Vec_IntSize(
p->vFanins), pPat, &iCexA, &iCexB );
371 uTruth = (unsigned)Abc_Tt6Stretch( (
word)uTruth, 1 );
373 Vec_IntPrint(
p->vFanins);
381 Rsb_DecVerifyCex( f, pDivs, Vec_IntSize(
p->vFanins), iCexA, iCexB );
382 Rsb_DecRecordCex( g, nGsAll, iCexA, iCexB, pCexes, nCexes++ );
385 Vec_IntPush(
p->vTries, i );
386 Vec_IntPush(
p->vTries, -1 );
388 if (
p->nDecMax == 1 )
391 p->vFanins->nSize = 2;
392 for ( i = 1; i < nGs; i++ )
393 for ( k = 0; k < i; k++ )
395 if ( pCexes[i] & pCexes[k] )
397 pDivs[0] = g[i];
p->vFanins->pArray[0] = i;
398 pDivs[1] = g[k];
p->vFanins->pArray[1] = k;
399 uTruth =
Rsb_DecCheck( nVars, f, pDivs, Vec_IntSize(
p->vFanins), pPat, &iCexA, &iCexB );
404 uTruth = (unsigned)Abc_Tt6Stretch( (
word)uTruth, 2 );
406 Vec_IntPrint(
p->vFanins);
414 Rsb_DecVerifyCex( f, pDivs, Vec_IntSize(
p->vFanins), iCexA, iCexB );
415 Rsb_DecRecordCex( g, nGsAll, iCexA, iCexB, pCexes, nCexes++ );
418 Vec_IntPush(
p->vTries, i );
419 Vec_IntPush(
p->vTries, k );
420 Vec_IntPush(
p->vTries, -1 );
422 if (
p->nDecMax == 2 )
425 p->vFanins->nSize = 3;
426 for ( i = 2; i < nGs; i++ )
427 for ( k = 1; k < i; k++ )
428 for ( j = 0; j < k; j++ )
430 if ( pCexes[i] & pCexes[k] & pCexes[j] )
432 pDivs[0] = g[i];
p->vFanins->pArray[0] = i;
433 pDivs[1] = g[k];
p->vFanins->pArray[1] = k;
434 pDivs[2] = g[j];
p->vFanins->pArray[2] = j;
435 uTruth =
Rsb_DecCheck( nVars, f, pDivs, Vec_IntSize(
p->vFanins), pPat, &iCexA, &iCexB );
440 uTruth = (unsigned)Abc_Tt6Stretch( (
word)uTruth, 3 );
442 Vec_IntPrint(
p->vFanins);
450 Rsb_DecVerifyCex( f, pDivs, Vec_IntSize(
p->vFanins), iCexA, iCexB );
451 Rsb_DecRecordCex( g, nGsAll, iCexA, iCexB, pCexes, nCexes++ );
454 Vec_IntPush(
p->vTries, i );
455 Vec_IntPush(
p->vTries, k );
456 Vec_IntPush(
p->vTries, j );
457 Vec_IntPush(
p->vTries, -1 );
459 if (
p->nDecMax == 3 )
462 p->vFanins->nSize = 4;
463 for ( i = 3; i < nGs; i++ )
464 for ( k = 2; k < i; k++ )
465 for ( j = 1; j < k; j++ )
466 for ( n = 0; n < j; n++ )
468 if ( pCexes[i] & pCexes[k] & pCexes[j] & pCexes[n] )
470 pDivs[0] = g[i];
p->vFanins->pArray[0] = i;
471 pDivs[1] = g[k];
p->vFanins->pArray[1] = k;
472 pDivs[2] = g[j];
p->vFanins->pArray[2] = j;
473 pDivs[3] = g[n];
p->vFanins->pArray[3] = n;
474 uTruth =
Rsb_DecCheck( nVars, f, pDivs, Vec_IntSize(
p->vFanins), pPat, &iCexA, &iCexB );
479 uTruth = (unsigned)Abc_Tt6Stretch( (
word)uTruth, 4 );
481 Vec_IntPrint(
p->vFanins);
489 Rsb_DecVerifyCex( f, pDivs, Vec_IntSize(
p->vFanins), iCexA, iCexB );
490 Rsb_DecRecordCex( g, nGsAll, iCexA, iCexB, pCexes, nCexes++ );
493 Vec_IntPush(
p->vTries, i );
494 Vec_IntPush(
p->vTries, k );
495 Vec_IntPush(
p->vTries, j );
496 Vec_IntPush(
p->vTries, n );
497 Vec_IntPush(
p->vTries, -1 );
500 if (
p->nDecMax == 4 )
518 int nVars = Vec_IntSize(
p->vFanins);
520 word wOn = Abc_Tt6Stretch( Copy >> (1 << nVars), nVars );
521 word wOnDc = ~Abc_Tt6Stretch( Copy, nVars );
522 word wIsop = Abc_Tt6Isop( wOn, wOnDc, nVars, NULL );
525 printf(
"Offset : " );
526 Abc_TtPrintBinary( &Copy, nVars );
527 Copy >>= ((
word)1 << nVars);
528 printf(
"Onset : " );
529 Abc_TtPrintBinary( &Copy, nVars );
530 printf(
"Result : " );
531 Abc_TtPrintBinary( &wIsop, nVars );
536 Abc_TtPrintBinary( f, nVarsAll );
538 for ( i = 0; i < nGs; i++ )
540 printf(
"Div%3d : ", i );
543 printf(
"Solution : " );
544 for ( i = 0; i < Vec_IntSize(
p->vFanins); i++ )
545 printf(
"%d ", Vec_IntEntry(
p->vFanins, i) );
563 int b, m, Num, nSuppSize;
564 int nWords = Abc_TtWordNum(nVars);
565 Truth4 >>= (1 << Vec_IntSize(
p->vFanins));
566 Truth4 = (unsigned)Abc_Tt6Stretch( (
word)Truth4, Vec_IntSize(
p->vFanins) );
571 nSuppSize = Vec_IntSize(
p->vFanins);
579 Abc_TtClear( pTemp1,
nWords );
580 for ( m = 0; m < (1<<nSuppSize); m++ )
582 if ( ((Truth4 >> m) & 1) == 0 )
584 Abc_TtFill( pTemp2,
nWords );
585 for ( b = 0; b < nSuppSize; b++ )
587 Abc_TtAnd( pTemp2, pTemp2, pFanins[b],
nWords, 0 );
589 Abc_TtSharp( pTemp2, pTemp2, pFanins[b],
nWords );
590 Abc_TtOr( pTemp1, pTemp1, pTemp2,
nWords );
593 if ( !Abc_TtEqual( pTemp1, f,
nWords ) )
594 printf(
"Verification failed.\n" );
614 word * pCexes = Vec_WrdArray(
p->vCexes);
615 unsigned * pPat = (
unsigned *)Vec_IntArray(
p->vDecPats);
621 if ( Vec_IntSize(
p->vFaninsOld) && Vec_IntSize(
p->vFaninsOld) <= 4 )
624 int i, Entry, iCexA, iCexB;
627 uTruth =
Rsb_DecCheck( nVars, f, pDivs, Vec_IntSize(
p->vFaninsOld), pPat, &iCexA, &iCexB );
631 printf(
"Verified orig decomp with %d vars {", Vec_IntSize(
p->vFaninsOld) );
633 printf(
" %d", Entry );
643 printf(
"Verified orig decomp with %d vars {", Vec_IntSize(
p->vFaninsOld) );
645 printf(
" %d", Entry );
647 printf(
"Verification FAILED.\n" );
652vTries = Vec_IntAlloc( 100 );
661 printf(
"Found decomp with %d vars {", Vec_IntSize(
p->vFanins) );
663 printf(
" %d", Entry );
671 Vec_IntShrink(
p->vFanins, 0 );
673 printf(
"Did not find decomposition with 4 variables.\n" );
679Vec_IntFree( vTries );
698 int i, nVars, nGs = Vec_WrdSize(vDivTruths);
700 for ( i = 0; i < nGs; i++ )
701 pGs[i] = Vec_WrdEntryP(vDivTruths,i);
703 if ( uTruthRes == 0 )
711 nVars = Vec_IntSize(
p->vFanins);
712 *puTruth0 = Abc_Tt6Stretch( uTruthRes, nVars );
713 *puTruth1 = Abc_Tt6Stretch( uTruthRes >> (1 << nVars), nVars );
733 word a = s_Truths6[0];
734 word b = s_Truths6[1];
735 word c = s_Truths6[2];
736 word d = s_Truths6[3];
737 word e = s_Truths6[4];
738 word f = s_Truths6[5];
742 word F = ab | cd | ef;
743 word uTruth0, uTruth1;
745 vDivTruths = Vec_WrdAlloc( 100 );
746 Vec_WrdPush( vDivTruths, a );
747 Vec_WrdPush( vDivTruths, b );
748 Vec_WrdPush( vDivTruths, c );
749 Vec_WrdPush( vDivTruths, d );
750 Vec_WrdPush( vDivTruths, e );
751 Vec_WrdPush( vDivTruths, f );
752 Vec_WrdPush( vDivTruths, ab );
753 Vec_WrdPush( vDivTruths, cd );
754 Vec_WrdPush( vDivTruths, ef );
761 Vec_WrdFree( vDivTruths );