48 int nWidth, nSteps, i;
49 FILE * pFile = fopen(
"max4.v",
"wb" );
53 for ( nSteps = 0, nWidth = 1; nWidth < nBits; nWidth *= 3, nSteps++ );
55 fprintf( pFile,
"module max4 ( a, b, c, d, res, addr );\n\n" );
56 fprintf( pFile,
" input [%d:0] a, b, c, d;\n", nBits-1 );
57 fprintf( pFile,
" output [%d:0] res;\n", nBits-1 );
58 fprintf( pFile,
" output [1:0] addr;\n\n" );
60 fprintf( pFile,
" wire [%d:0] A = a;\n", nWidth-1 );
61 fprintf( pFile,
" wire [%d:0] B = b;\n", nWidth-1 );
62 fprintf( pFile,
" wire [%d:0] C = c;\n", nWidth-1 );
63 fprintf( pFile,
" wire [%d:0] D = d;\n\n", nWidth-1 );
65 fprintf( pFile,
" wire AB, AC, AD, BC, BD, CD;\n\n" );
67 fprintf( pFile,
" comp( A, B, AB );\n" );
68 fprintf( pFile,
" comp( A, C, AC );\n" );
69 fprintf( pFile,
" comp( A, D, AD );\n" );
70 fprintf( pFile,
" comp( B, C, BC );\n" );
71 fprintf( pFile,
" comp( B, D, BD );\n" );
72 fprintf( pFile,
" comp( C, D, CD );\n\n" );
74 fprintf( pFile,
" assign addr = AB ? (CD ? (AC ? 2\'b00 : 2\'b10) : (AD ? 2\'b00 : 2\'b11)) : (CD ? (BC ? 2\'b01 : 2\'b10) : (BD ? 2\'b01 : 2\'b11));\n\n" );
75 fprintf( pFile,
" assign res = addr[1] ? (addr[1] ? d : c) : (addr[0] ? b : a);\n\n" );
76 fprintf( pFile,
"endmodule\n\n\n" );
79 fprintf( pFile,
"module comp ( a, b, res );\n\n" );
80 fprintf( pFile,
" input [%d:0] a, b;\n", nWidth-1 );
81 fprintf( pFile,
" output res;\n" );
82 fprintf( pFile,
" wire res2;\n\n" );
84 fprintf( pFile,
" wire [%d:0] A = a & ~b;\n", nWidth-1 );
85 fprintf( pFile,
" wire [%d:0] B = ~a & b;\n\n", nWidth-1 );
87 fprintf( pFile,
" comp0( A, B, res, res2 );\n\n" );
89 fprintf( pFile,
"endmodule\n\n\n" );
92 for ( i = 0; i < nSteps; i++ )
94 fprintf( pFile,
"module comp%d ( a, b, yes, no );\n\n", i );
95 fprintf( pFile,
" input [%d:0] a, b;\n", nWidth-1 );
96 fprintf( pFile,
" output yes, no;\n\n", nWidth/3-1 );
98 fprintf( pFile,
" wire [2:0] y, n;\n\n" );
100 if ( i == nSteps - 1 )
102 fprintf( pFile,
" assign y = a;\n" );
103 fprintf( pFile,
" assign n = b;\n\n" );
107 fprintf( pFile,
" wire [%d:0] A0 = a[%d:%d];\n", nWidth/3-1, nWidth/3-1, 0 );
108 fprintf( pFile,
" wire [%d:0] A1 = a[%d:%d];\n", nWidth/3-1, 2*nWidth/3-1, nWidth/3 );
109 fprintf( pFile,
" wire [%d:0] A2 = a[%d:%d];\n\n", nWidth/3-1, nWidth-1, 2*nWidth/3 );
111 fprintf( pFile,
" wire [%d:0] B0 = b[%d:%d];\n", nWidth/3-1, nWidth/3-1, 0 );
112 fprintf( pFile,
" wire [%d:0] B1 = b[%d:%d];\n", nWidth/3-1, 2*nWidth/3-1, nWidth/3 );
113 fprintf( pFile,
" wire [%d:0] B2 = b[%d:%d];\n\n", nWidth/3-1, nWidth-1, 2*nWidth/3 );
115 fprintf( pFile,
" comp%d( A0, B0, y[0], n[0] );\n", i+1 );
116 fprintf( pFile,
" comp%d( A1, B1, y[1], n[1] );\n", i+1 );
117 fprintf( pFile,
" comp%d( A2, B2, y[2], n[2] );\n\n", i+1 );
120 fprintf( pFile,
" assign yes = y[0] | (~y[0] & ~n[0] & y[1]) | (~y[0] & ~n[0] & ~y[1] & ~n[1] & y[2]);\n" );
121 fprintf( pFile,
" assign no = n[0] | (~y[0] & ~n[0] & n[1]) | (~y[0] & ~n[0] & ~y[1] & ~n[1] & n[2]);\n\n" );
123 fprintf( pFile,
"endmodule\n\n\n" );
197 int * pRes, * pArgC, * pArgS, a, b, Carry = 0;
198 assert( nArgA > 0 && nArgB > 0 );
200 Vec_IntFill( vRes, nArgA + nArgB, 0 );
201 pRes = Vec_IntArray( vRes );
203 Vec_IntFill( vTemp, 2 * nArgA, 0 );
204 pArgC = Vec_IntArray( vTemp );
205 pArgS = pArgC + nArgA;
207 for ( b = 0; b < nArgB; b++ )
208 for ( a = 0; a < nArgA; a++ )
209 Wlc_BlastFullAdderCtrlCnf( pSat, pArgA[a], pArgB[b], pArgS[a], pArgC[a], &pArgC[a], a ? &pArgS[a-1] : &pRes[b], piVars );
212 for ( a = 0; a < nArgA; a++ )
217 Vec_Int_t * vRes1 = Vec_IntAlloc( 2*nBits );
218 Vec_Int_t * vRes2 = Vec_IntAlloc( 2*nBits );
219 Vec_Int_t * vTemp = Vec_IntAlloc( 2*nBits );
223 int i, Ent1, Ent2, nVars = 1 + 2*nBits;
224 int nVarsAll = 1 + 4*nBits + 4*nBits*(nBits + 1);
229 for ( i = 0; i < nBits; i++ )
230 pArgA[i] = 1 + i, pArgB[i] = 1 + nBits + i;
233 for ( i = 0; i < nBits; i++ )
234 pArgA[i] = 1 + nBits + i, pArgB[i] = 1 + i;
237 Vec_IntClear( vTemp );
240 Vec_IntPush( vTemp, Abc_Var2Lit(nVars, 0) );
243 assert( nVars == nVarsAll );
248 Vec_IntFree( vRes1 );
249 Vec_IntFree( vRes2 );
250 Vec_IntFree( vTemp );
291 Vec_Int_t * vRes, * vRes0, * vRes1, * vRes2;
int i, iCtrl;
297 vRes = Vec_IntAlloc( nLits + 1 );
298 Vec_IntAppend( vRes, vRes0 );
299 iCtrl = Vec_IntPop( vRes );
300 for ( i = 0; i <= nLits/2; i++ )
301 Vec_IntPush( vRes,
Gia_ManHashMux(
p, iCtrl, Vec_IntEntry(vRes2, i), Vec_IntEntry(vRes1, i)) );
302 assert( Vec_IntSize(vRes) == nLits + 1 );
303 Vec_IntFree( vRes0 );
304 Vec_IntFree( vRes1 );
305 Vec_IntFree( vRes2 );
337 Vec_Int_t * vRes, * vRes0, * vRes1, * vRes2, * vRes3, * vRes4;
int i, iCtrl;
346 vRes = Vec_IntAlloc( nLits + 1 );
347 Vec_IntAppend( vRes, vRes0 );
348 iCtrl = Vec_IntPop( vRes );
349 for ( i = 0; i <= nLits/3; i++ )
350 Vec_IntPush( vRes,
Gia_ManHashMux(
p, iCtrl, Vec_IntEntry(vRes2, i), Vec_IntEntry(vRes1, i)) );
351 iCtrl = Vec_IntPop( vRes );
352 for ( i = 0; i <= nLits/3; i++ )
353 Vec_IntPush( vRes,
Gia_ManHashMux(
p, iCtrl, Vec_IntEntry(vRes4, i), Vec_IntEntry(vRes3, i)) );
354 assert( Vec_IntSize(vRes) == nLits + 1 );
355 Vec_IntFree( vRes0 );
356 Vec_IntFree( vRes1 );
357 Vec_IntFree( vRes2 );
358 Vec_IntFree( vRes3 );
359 Vec_IntFree( vRes4 );
422 Vec_Wec_t * vBitsNew = Vec_WecStart( Vec_WecSize(vBits) );
423 int i, k, pLitsIn[16], pLitsOut[16], Count = 0, fSimple = Vec_WecMaxLevelSize(vBits) <= 3;
424 for ( i = 0; i < Vec_WecSize(vBits)-1; i++ )
426 Vec_Int_t * vBits0 = Vec_WecEntry(vBits, i);
427 Vec_Int_t * vBits1 = Vec_WecEntry(vBits, i+1);
430 assert( Vec_IntSize(vBits0) <= 3 );
431 for ( k = 0; Vec_IntSize(vBits0) > 0; k++ )
432 pLitsIn[k] = Vec_IntPop( vBits0 );
437 Vec_WecPush( vBitsNew, i+0, pLitsOut[0] );
438 Vec_WecPush( vBitsNew, i+1, pLitsOut[1] );
442 while ( Vec_IntSize(vBits0) >= 6 )
444 for ( k = 0; k < 6; k++ )
445 pLitsIn[k] = Vec_IntPop( vBits0 );
448 Vec_WecPush( vBitsNew, i+0, pLitsOut[0] );
449 Vec_WecPush( vBitsNew, i+1, pLitsOut[1] );
450 Vec_WecPush( vBitsNew, i+2, pLitsOut[2] );
453 if ( Vec_IntSize(vBits0) == 5 && Vec_IntSize(vBits1) > 0 )
455 for ( k = 0; Vec_IntSize(vBits0) > 0; k++ )
456 pLitsIn[k] = Vec_IntPop( vBits0 );
457 pLitsIn[k++] = Vec_IntPop( vBits1 );
460 Vec_WecPush( vBitsNew, i+0, pLitsOut[0] );
461 Vec_WecPush( vBitsNew, i+1, pLitsOut[1] );
462 Vec_WecPush( vBitsNew, i+2, pLitsOut[2] );
465 if ( Vec_IntSize(vBits0) == 5 && Vec_IntSize(vBits1) == 0 )
467 for ( k = 0; Vec_IntSize(vBits0) > 0; k++ )
468 pLitsIn[k] = Vec_IntPop( vBits0 );
472 Vec_WecPush( vBitsNew, i+0, pLitsOut[0] );
473 Vec_WecPush( vBitsNew, i+1, pLitsOut[1] );
474 Vec_WecPush( vBitsNew, i+2, pLitsOut[2] );
477 if ( Vec_IntSize(vBits0) == 4 && Vec_IntSize(vBits1) > 0 )
479 for ( k = 0; Vec_IntSize(vBits0) > 0; k++ )
480 pLitsIn[k] = Vec_IntPop( vBits0 );
482 pLitsIn[k++] = Vec_IntPop( vBits1 );
485 Vec_WecPush( vBitsNew, i+0, pLitsOut[0] );
486 Vec_WecPush( vBitsNew, i+1, pLitsOut[1] );
487 Vec_WecPush( vBitsNew, i+2, pLitsOut[2] );
490 if ( Vec_IntSize(vBits0) == 3 && Vec_IntSize(vBits1) >= 2 )
492 for ( k = 0; Vec_IntSize(vBits0) > 0; k++ )
493 pLitsIn[k] = Vec_IntPop( vBits0 );
494 pLitsIn[k++] = Vec_IntPop( vBits1 );
495 pLitsIn[k++] = Vec_IntPop( vBits1 );
498 Vec_WecPush( vBitsNew, i+0, pLitsOut[0] );
499 Vec_WecPush( vBitsNew, i+1, pLitsOut[1] );
500 Vec_WecPush( vBitsNew, i+2, pLitsOut[2] );
503 if ( Vec_IntSize(vBits0) >= 3 )
505 for ( k = 0; k < 3; k++ )
506 pLitsIn[k] = Vec_IntPop( vBits0 );
509 Vec_WecPush( vBitsNew, i+0, pLitsOut[0] );
510 Vec_WecPush( vBitsNew, i+1, pLitsOut[1] );
522 for ( k = 0; Vec_IntSize(vBits0) > 0; k++ )
523 Vec_WecPush( vBitsNew, i, Vec_IntPop(vBits0) );
533 Vec_Wec_t * vTemp, * vBits = Vec_WecDup( vBits0 );
534 Vec_Int_t * vOuts = Vec_IntAlloc( 1000 ), * vOuts2;
535 Vec_Int_t * vLits0 = Vec_IntAlloc( 1000 );
536 Vec_Int_t * vLits1 = Vec_IntAlloc( 1000 );
537 int i, iLit, nBitsAll = 0, CounterAll = 0, Counter = 1;
538 for ( i = 0; Counter && i < 1000; i++ )
540 if ( fVerbose ) printf(
"LEVEL %d\n", i );
541 if ( fVerbose ) Vec_WecPrint( vBits, 0 );
542 if ( Vec_WecMaxLevelSize(vBits) <= 2 )
545 Vec_WecFree( vTemp );
546 CounterAll += Counter;
548 printf(
"Total count = %d.\n", CounterAll );
577 if ( Vec_IntSize(vOuts2) == 0 )
579 assert( Vec_IntSize(vOuts2) == 1 || Vec_IntSize(vOuts2) == 2 );
580 Vec_IntPush( vLits0, Vec_IntPop(vOuts2) );
581 if ( Vec_IntSize(vOuts2) == 1 )
582 Vec_IntPush( vLits1, Vec_IntPop(vOuts2) );
584 Vec_IntPush( vLits1, 0 );
586 printf(
"The adder size is %d.\n", Vec_IntSize(vLits0) );
587 Vec_IntShrink( vLits0, 11 );
588 Vec_IntShrink( vLits1, 11 );
594 Carry =
Wlc_BlastAdder( pNew, Vec_IntArray(vLits0), Vec_IntArray(vLits1), 11, 0 );
595 Vec_IntAppend( vOuts, vLits0 );
596 Vec_IntPush( vOuts, Carry );
599 Gia_ManAppendCo( pNew, Vec_IntEntry(vOuts, 11) );
605 if ( Vec_IntSize(vOuts2) == 0 )
607 assert( Vec_IntSize(vOuts2) == 1 || Vec_IntSize(vOuts2) == 2 );
608 Vec_IntPush( vLits0, Vec_IntPop(vOuts2) );
609 if ( Vec_IntSize(vOuts2) == 1 )
610 Vec_IntPush( vLits1, Vec_IntPop(vOuts2) );
612 Vec_IntPush( vLits1, 0 );
614 printf(
"The adder size is %d.\n", Vec_IntSize(vLits0) );
615 Vec_IntShrink( vLits0, Gia_ManCiNum(pNew)+1 );
616 Vec_IntShrink( vLits1, Gia_ManCiNum(pNew)+1 );
618 for ( nBitsAll = 3; nBitsAll < Vec_IntSize(vLits0); nBitsAll *= 3 )
620 for ( i = Vec_IntSize(vLits0); i < nBitsAll; i++ )
622 Vec_IntPush( vLits0, 0 );
623 Vec_IntPush( vLits1, 0 );
625 assert( Vec_IntSize(vLits0) == nBitsAll );
626 assert( Vec_IntSize(vLits1) == nBitsAll );
628 vOuts2 =
Wlc_ManGenAdder_rec( pNew, nBitsAll, Vec_IntArray(vLits0), Vec_IntArray(vLits1), 0, 3 );
629 Vec_IntAppend( vOuts, vOuts2 );
630 Vec_IntFree( vOuts2 );
635 Vec_IntShrink( vOuts, Gia_ManCiNum(pNew) );
639 Gia_ManAppendCo( pNew, iLit );
642 Vec_IntFree( vOuts );
643 Vec_IntFree( vLits0 );
644 Vec_IntFree( vLits1 );
645 Vec_WecFree( vBits );
728 word Care[1<<10] = {0};
729 word Truth[8][1<<10] = {{0}};
730 int nIns = 0, pIns[16][2] = {{0}};
731 int i, k, x, Res, Mint, nMints = 1 << (n*n);
732 assert( n >= 2 && n <= 4 );
733 for ( x = 0; x < 2*n; x++ )
735 for ( i = 0; i < n; i++ )
736 for ( k = 0; k < n; k++ )
738 pIns[nIns][0] = i, pIns[nIns][1] = k, nIns++;
740 for ( x = 0; x < nIns; x++ )
741 printf(
"(%d, %d) ", pIns[x][0], pIns[x][1] );
743 for ( i = 0; i < (1<<n); i++ )
744 for ( k = 0; k < (1<<n); k++ )
747 for ( x = 0; x < nIns; x++ )
748 if ( ((i >> pIns[x][0]) & 1) && ((k >> pIns[x][1]) & 1) )
751 Abc_TtSetBit( Care, Mint );
754 for ( x = 0; x < 2*n; x++ )
755 if ( (Res >> x) & 1 )
756 Abc_TtSetBit( Truth[x], Mint );
760 Care[0] = Abc_Tt6Stretch( Care[0], n*n );
761 for ( i = 0; i < 2*n; i++ )
762 Truth[i][0] = Abc_Tt6Stretch( Truth[i][0], n*n );
765 for ( x = 0; x < nMints; x++ )
766 printf(
"%d", Abc_TtGetBit(Care, x) );
768 for ( i = 0; i < 2*n; i++, printf(
"\n" ) )
769 for ( x = 0; x < nMints; x++ )
770 printf(
"%d", Abc_TtGetBit(Truth[i], x) );
773 FILE * pFile = fopen(
"tadd.truth",
"wb" );
774 for ( i = 0; i < 2*n; i++ )