55static inline word * Maj_ManTruth(
Maj_Man_t *
p,
int v ) {
return Vec_WrdEntryP(
p->vInfo,
p->nWords * v ); }
75 for ( k = 0; k < nVars; k++ )
76 Count += (iMint >> k) & 1;
77 return (
int)(Count > nVars/2);
81 Vec_Wrd_t * vInfo =
p->vInfo = Vec_WrdStart(
p->nWords * (
p->nObjs + 1) );
82 int i, nMints = Abc_MaxInt( 64, 1 <<
p->nVars );
83 Abc_TtFill( Maj_ManTruth(
p, 1),
p->nWords );
84 for ( i = 0; i <
p->nVars; i++ )
85 Abc_TtIthVar( Maj_ManTruth(
p, i+2), i,
p->nVars );
86 for ( i = 0; i < nMints; i++ )
88 Abc_TtSetBit( Maj_ManTruth(
p,
p->nObjs), i );
92static void Maj_ManConnect(
int VarCons[
MAJ_NOBJS][3],
int nVars,
int nObjs,
int nRands,
int fVerbose )
96 for ( i = nObjs-2; i >= nVars + 2; i-- )
100 int Index = 1 + (rand() % (nObjs-1-i));
101 for ( v = 2; v >= 0; v-- )
103 if ( VarCons[i+Index][v] == 0 )
105 VarCons[i+Index][v] = i;
107 printf(
"%d -> %d ", i, i+Index );
114 for ( r = 0; r < nRands; r++ )
116 i = nVars+2 + (rand() % ((nObjs-1)-(nVars+2)));
117 for ( x = 0; x < 100; x++ )
119 int Index = 1 + (rand() % (nObjs-1-i));
120 for ( v = 2; v >= 0; v-- )
123 if ( VarCons[i+Index][v] == i )
128 if ( VarCons[i+Index][v] == 0 )
130 VarCons[i+Index][v] = i;
132 printf(
"+%d -> %d ", i, i+Index );
145static void Maj_ManConnect2(
int VarCons[
MAJ_NOBJS][3],
int nVars,
int nObjs,
int nRands )
147 VarCons[8+2][2] = 7+2;
148 VarCons[10+2][2] = 9+2;
149 VarCons[11+2][2] = 7+2;
150 VarCons[11+2][1] = 8+2;
151 VarCons[12+2][2] = 9+2;
152 VarCons[12+2][1] = 10+2;
153 VarCons[13+2][2] = 11+2;
154 VarCons[13+2][1] = 12+2;
164 Maj_ManConnect( VarCons,
p->nVars,
p->nObjs,
p->nRands,
p->fVerbose );
167 for ( k = 0; k < 3; k++ )
170 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
171 p->VarMarks[i][k][j] =
p->iVar++;
174 for ( i =
p->nVars + 3; i < p->nObjs; i++ )
176 for ( k = 0; k < 3; k++ )
178 if (
p->fUseLine && k == 0 )
181 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
182 p->VarMarks[i][k][j] =
p->iVar++;
185 if (
p->fUseRand && VarCons[i][k] > 0 )
188 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
189 p->VarMarks[i][k][j] =
p->iVar++;
193 for ( j = (
p->fUseConst && k == 2) ? 0 : 2; j < (
p->fUseRand ?
p->nVars+2-k : i-k); j++ )
195 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
196 p->VarMarks[i][k][j] =
p->iVar++;
200 printf(
"The number of parameter variables = %d.\n",
p->iVar );
205 for ( i =
p->nVars + 2; i < p->nObjs; i++ )
206 printf(
" Node %2d ", i );
208 for ( m = 0; m <
p->nObjs; m++ )
210 printf(
"%2d : ", m );
211 for ( i =
p->nVars + 2; i < p->nObjs; i++ )
213 for ( j = 0; j <
p->nObjs; j++ )
217 for ( k = 0; k < 3; k++ )
218 if (
p->VarMarks[i][k][j] )
219 printf(
"%3d ",
p->VarMarks[i][k][j] );
221 printf(
"%3c ",
'.' );
229static Maj_Man_t *
Maj_ManAlloc(
int nVars,
int nNodes,
int fUseConst,
int fUseLine,
int fUseRand,
int nRands,
int fVerbose )
234 p->nObjs = 2 + nVars + nNodes;
235 p->fUseConst = fUseConst;
236 p->fUseLine = fUseLine;
237 p->fUseRand = fUseRand;
238 p->fVerbose = fVerbose;
240 p->nWords = Abc_TtWordNum(nVars);
241 p->vOutLits = Vec_WecStart(
p->nObjs );
252 Vec_WrdFree(
p->vInfo );
253 Vec_WecFree(
p->vOutLits );
269static inline int Maj_ManFindFanin(
Maj_Man_t *
p,
int i,
int k )
271 int j, Count = 0, iVar = -1;
272 for ( j = 0; j <
p->nObjs; j++ )
273 if (
p->VarMarks[i][k][j] && sat_solver_var_value(
p->pSat,
p->VarMarks[i][k][j]) )
285 int i, k, iMint;
word * pFanins[3];
286 for ( i =
p->nVars + 2; i < p->nObjs; i++ )
288 for ( k = 0; k < 3; k++ )
289 pFanins[k] = Maj_ManTruth(
p, Maj_ManFindFanin(
p, i, k) );
290 Abc_TtMaj( Maj_ManTruth(
p, i), pFanins[0], pFanins[1], pFanins[2],
p->nWords );
295 for ( i = 0; i < (1 <<
p->nVars); i++ )
297 int nOnes = Abc_TtBitCount16(i);
298 if ( nOnes < p->nVars/2 || nOnes >
p->nVars/2+1 )
300 if ( Abc_TtGetBit(Maj_ManTruth(
p,
p->nObjs), i) == Abc_TtGetBit(Maj_ManTruth(
p,
p->nObjs-1), i) )
308 if ( Flag &&
p->nVars >= 6 )
309 iMint = Abc_TtFindLastDiffBit( Maj_ManTruth(
p,
p->nObjs-1), Maj_ManTruth(
p,
p->nObjs),
p->nVars );
311 iMint = Abc_TtFindFirstDiffBit( Maj_ManTruth(
p,
p->nObjs-1), Maj_ManTruth(
p,
p->nObjs),
p->nVars );
314 assert( iMint < (1 <<
p->nVars) );
332 printf(
"Realization of %d-input majority using %d MAJ3 gates:\n",
p->nVars,
p->nNodes );
334 for ( i =
p->nObjs - 1; i >=
p->nVars + 2; i-- )
336 printf(
"%02d = MAJ(", i-2 );
337 for ( k = 2; k >= 0; k-- )
339 iVar = Maj_ManFindFanin(
p, i, k );
340 if ( iVar >= 2 && iVar < p->nVars + 2 )
341 printf(
" %c",
'a'+iVar-2 );
343 printf(
" %d", iVar );
345 printf(
" %02d", iVar-2 );
365 int pLits[
MAJ_NOBJS], pLits2[2], i, j, k, n, m;
367 for ( i =
p->nVars + 2; i < p->nObjs; i++ )
369 for ( k = 0; k < 3; k++ )
372 for ( j = 0; j <
p->nObjs; j++ )
373 if (
p->VarMarks[i][k][j] )
374 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 0 );
379 for ( n = 0; n < nLits; n++ )
380 for ( m = n+1; m < nLits; m++ )
382 pLits2[0] = Abc_LitNot(pLits[n]);
383 pLits2[1] = Abc_LitNot(pLits[m]);
387 if ( k == 2 ||
p->VarMarks[i][k][2] == 0 ||
p->VarMarks[i][k+1][2] == 0 )
390 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][k][j] )
391 for ( n = j; n <
p->nObjs; n++ )
if (
p->VarMarks[i][k+1][n] )
393 pLits2[0] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
394 pLits2[1] = Abc_Var2Lit(
p->VarMarks[i][k+1][n], 1 );
401 for ( i = 2; i <
p->nObjs - 1; i++ )
403 Vec_Int_t * vArray = Vec_WecEntry(
p->vOutLits, i);
404 assert( Vec_IntSize(vArray) > 0 );
414 for ( i = 0; i <
p->nVars; i++ )
415 p->VarVals[i+2] = (iMint >> i) & 1;
418 for ( i =
p->nVars + 2; i < p->nObjs; i++ )
421 int iBaseSatVarI =
p->iVar + 4*(i -
p->nVars - 2);
422 for ( k = 0; k < 3; k++ )
424 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][k][j] )
426 int iBaseSatVarJ =
p->iVar + 4*(j -
p->nVars - 2);
427 for ( n = 0; n < 2; n++ )
429 int pLits[3], nLits = 0;
430 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
431 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + k, n );
432 if ( j >=
p->nVars + 2 )
433 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarJ + 3, !n );
434 else if (
p->VarVals[j] == n )
442 for ( n = 0; n < 2; n++ )
444 if ( i ==
p->nObjs - 1 && n == Value )
446 for ( k = 0; k < 3; k++ )
448 int pLits[3], nLits = 0;
449 if ( k != 0 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 0, n );
450 if ( k != 1 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 1, n );
451 if ( k != 2 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 2, n );
452 if ( i !=
p->nObjs - 1 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 3, !n );
459 p->iVar += 4*
p->nNodes;
465 abctime clkTotal = Abc_Clock();
470 printf(
"Running exact synthesis for %d-input majority with %d MAJ3 gates...\n",
p->nVars,
p->nNodes );
471 for ( i = 0; iMint != -1; i++ )
476 printf(
"The problem has no solution after %2d iterations. ", i+1 );
482 printf(
"Iter %3d : ", i );
484 printf(
" Var =%5d ",
p->iVar );
487 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
491 printf(
"The problem has no solution after %2d iterations. ", i+1 );
494 iMint = Maj_ManEval(
p );
499 Abc_PrintTime( 1,
"Total runtime", Abc_Clock() - clkTotal );
533static inline word * Exa_ManTruth(
Exa_Man_t *
p,
int v ) {
return Vec_WrdEntryP(
p->vInfo,
p->nWords * v ); }
549 Vec_Wrd_t * vInfo =
p->vInfo = Vec_WrdStart(
p->nWords * (
p->nObjs+1) );
int i;
550 for ( i = 0; i <
p->nVars; i++ )
551 Abc_TtIthVar( Exa_ManTruth(
p, i), i,
p->nVars );
560 p->iVar = 1 +
p->nNodes * 3;
562 for ( i =
p->nVars; i < p->nObjs; i++ )
564 for ( k = 0; k < 2; k++ )
566 if (
p->pPars->fFewerVars && i ==
p->nObjs - 1 && k == 0 )
569 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
570 p->VarMarks[i][k][j] =
p->iVar++;
573 for ( j =
p->pPars->fFewerVars ? 1 - k : 0; j < i - k; j++ )
575 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
576 p->VarMarks[i][k][j] =
p->iVar++;
580 printf(
"The number of parameter variables = %d.\n",
p->iVar );
583 for ( i =
p->nVars; i < p->nObjs; i++ )
585 printf(
"Node %d\n", i );
586 for ( j = 0; j <
p->nObjs; j++ )
588 for ( k = 0; k < 2; k++ )
589 printf(
"%3d ",
p->VarMarks[i][k][j] );
599 p->nVars = pPars->nVars;
600 p->nNodes = pPars->nNodes;
601 p->nObjs = pPars->nVars + pPars->nNodes;
602 p->nWords = Abc_TtWordNum(pPars->nVars);
604 p->vOutLits = Vec_WecStart(
p->nObjs );
614 Vec_WrdFree(
p->vInfo );
615 Vec_WecFree(
p->vOutLits );
631static inline int Exa_ManFindFanin(
Exa_Man_t *
p,
int i,
int k )
633 int j, Count = 0, iVar = -1;
634 for ( j = 0; j <
p->nObjs; j++ )
635 if (
p->VarMarks[i][k][j] && sat_solver_var_value(
p->pSat,
p->VarMarks[i][k][j]) )
646 int i, k, iMint;
word * pFanins[2];
647 for ( i =
p->nVars; i < p->nObjs; i++ )
649 int iVarStart = 1 + 3*(i -
p->nVars);
650 for ( k = 0; k < 2; k++ )
651 pFanins[k] = Exa_ManTruth(
p, Exa_ManFindFanin(
p, i, k) );
652 Abc_TtConst0( Exa_ManTruth(
p, i),
p->nWords );
653 for ( k = 1; k < 4; k++ )
655 if ( !sat_solver_var_value(
p->pSat, iVarStart+k-1) )
657 Abc_TtAndCompl( Exa_ManTruth(
p,
p->nObjs), pFanins[0], !(k&1), pFanins[1], !(k>>1),
p->nWords );
658 Abc_TtOr( Exa_ManTruth(
p, i), Exa_ManTruth(
p, i), Exa_ManTruth(
p,
p->nObjs),
p->nWords );
661 if ( Flag &&
p->nVars >= 6 )
662 iMint = Abc_TtFindLastDiffBit( Exa_ManTruth(
p,
p->nObjs-1),
p->pTruth,
p->nVars );
664 iMint = Abc_TtFindFirstDiffBit( Exa_ManTruth(
p,
p->nObjs-1),
p->pTruth,
p->nVars );
666 assert( iMint < (1 <<
p->nVars) );
684 printf(
"Realization of given %d-input function using %d two-input gates:\n",
p->nVars,
p->nNodes );
686 for ( i =
p->nObjs - 1; i >=
p->nVars; i-- )
688 int iVarStart = 1 + 3*(i -
p->nVars);
689 int Val1 = sat_solver_var_value(
p->pSat, iVarStart);
690 int Val2 = sat_solver_var_value(
p->pSat, iVarStart+1);
691 int Val3 = sat_solver_var_value(
p->pSat, iVarStart+2);
692 if ( i ==
p->nObjs - 1 && fCompl )
693 printf(
"%02d = 4\'b%d%d%d1(", i, !Val3, !Val2, !Val1 );
695 printf(
"%02d = 4\'b%d%d%d0(", i, Val3, Val2, Val1 );
696 for ( k = 1; k >= 0; k-- )
698 iVar = Exa_ManFindFanin(
p, i, k );
699 if ( iVar >= 0 && iVar < p->nVars )
700 printf(
" %c",
'a'+iVar );
702 printf(
" %02d", iVar );
722 int pLits[
MAJ_NOBJS], pLits2[2], i, j, k, n, m;
724 for ( i =
p->nVars; i < p->nObjs; i++ )
726 int iVarStart = 1 + 3*(i -
p->nVars);
727 for ( k = 0; k < 2; k++ )
730 for ( j = 0; j <
p->nObjs; j++ )
731 if (
p->VarMarks[i][k][j] )
732 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 0 );
737 for ( n = 0; n < nLits; n++ )
738 for ( m = n+1; m < nLits; m++ )
740 pLits2[0] = Abc_LitNot(pLits[n]);
741 pLits2[1] = Abc_LitNot(pLits[m]);
748 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][k][j] )
749 for ( n = j; n <
p->nObjs; n++ )
if (
p->VarMarks[i][k+1][n] )
751 pLits2[0] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
752 pLits2[1] = Abc_Var2Lit(
p->VarMarks[i][k+1][n], 1 );
759 for ( j =
p->nVars; j < i; j++ )
760 for ( n = 0; n <
p->nObjs; n++ )
if (
p->VarMarks[i][0][n] )
761 for ( m = n+1; m <
p->nObjs; m++ )
if (
p->VarMarks[j][0][m] )
763 pLits2[0] = Abc_Var2Lit(
p->VarMarks[i][0][n], 1 );
764 pLits2[1] = Abc_Var2Lit(
p->VarMarks[j][0][m], 1 );
770 for ( k = 0; k < 3; k++ )
772 pLits[0] = Abc_Var2Lit( iVarStart, k==1 );
773 pLits[1] = Abc_Var2Lit( iVarStart+1, k==2 );
774 pLits[2] = Abc_Var2Lit( iVarStart+2, k!=0 );
780 pLits[0] = Abc_Var2Lit( iVarStart, 1 );
781 pLits[1] = Abc_Var2Lit( iVarStart+1, 1 );
782 pLits[2] = Abc_Var2Lit( iVarStart+2, 0 );
788 for ( i = 0; i <
p->nObjs - 1; i++ )
790 Vec_Int_t * vArray = Vec_WecEntry(
p->vOutLits, i);
791 assert( Vec_IntSize(vArray) > 0 );
800 int i, k, n, j, Value = Abc_TtGetBit(
p->pTruth, iMint);
801 for ( i = 0; i <
p->nVars; i++ )
802 p->VarVals[i] = (iMint >> i) & 1;
805 for ( i =
p->nVars; i < p->nObjs; i++ )
808 int iVarStart = 1 + 3*(i -
p->nVars);
809 int iBaseSatVarI =
p->iVar + 3*(i -
p->nVars);
810 for ( k = 0; k < 2; k++ )
812 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][k][j] )
814 int iBaseSatVarJ =
p->iVar + 3*(j -
p->nVars);
815 for ( n = 0; n < 2; n++ )
817 int pLits[3], nLits = 0;
818 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
819 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + k, n );
821 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarJ + 2, !n );
822 else if (
p->VarVals[j] == n )
830 for ( n = 0; n < 2; n++ )
832 if ( i ==
p->nObjs - 1 && n == Value )
834 for ( k = 0; k < 4; k++ )
836 int pLits[4], nLits = 0;
837 if ( k == 0 && n == 1 )
839 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 0, (k&1) );
840 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 1, (k>>1) );
841 if ( i !=
p->nObjs - 1 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 2, !n );
842 if ( k > 0 ) pLits[nLits++] = Abc_Var2Lit( iVarStart + k-1, n );
849 p->iVar += 3*
p->nNodes;
854 int i, status, iMint = 1;
855 abctime clkTotal = Abc_Clock();
857 word pTruth[16]; Abc_TtReadHex( pTruth, pPars->pTtStr );
858 assert( pPars->nVars <= 10 );
860 if ( pTruth[0] & 1 ) { fCompl = 1; Abc_TtNot( pTruth,
p->nWords ); }
863 printf(
"Running exact synthesis for %d-input function with %d two-input gates...\n",
p->nVars,
p->nNodes );
864 for ( i = 0; iMint != -1; i++ )
870 if ( pPars->fVerbose )
872 printf(
"Iter %3d : ", i );
874 printf(
" Var =%5d ",
p->iVar );
877 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
881 printf(
"The problem has no solution.\n" );
884 iMint = Exa_ManEval(
p );
889 Abc_PrintTime( 1,
"Total runtime", Abc_Clock() - clkTotal );
916static inline word * Exa3_ManTruth(
Exa3_Man_t *
p,
int v ) {
return Vec_WrdEntryP(
p->vInfo,
p->nWords * v ); }
932 Vec_Wrd_t * vInfo =
p->vInfo = Vec_WrdStart(
p->nWords * (
p->nObjs+1) );
int i;
933 for ( i = 0; i <
p->nVars; i++ )
934 Abc_TtIthVar( Exa3_ManTruth(
p, i), i,
p->nVars );
943 p->iVar = 1 +
p->LutMask *
p->nNodes;
945 for ( i =
p->nVars; i < p->nObjs; i++ )
947 if (
p->pPars->fLutCascade )
951 Vec_WecPush(
p->vOutLits, i-1, Abc_Var2Lit(
p->iVar, 0) );
952 p->VarMarks[i][0][i-1] =
p->iVar++;
954 for ( k = (
int)(i >
p->nVars); k < p->nLutSize; k++ )
956 for ( j = 0; j <
p->nVars - k + (int)(i >
p->nVars); j++ )
958 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
959 p->VarMarks[i][k][j] =
p->iVar++;
964 for ( k = 0; k <
p->nLutSize; k++ )
966 if (
p->pPars->fFewerVars && i ==
p->nObjs - 1 && k == 0 )
969 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
970 p->VarMarks[i][k][j] =
p->iVar++;
973 for ( j =
p->pPars->fFewerVars ?
p->nLutSize - 1 - k : 0; j < i - k; j++ )
975 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
976 p->VarMarks[i][k][j] =
p->iVar++;
980 printf(
"The number of parameter variables = %d.\n",
p->iVar );
984 for ( i =
p->nObjs - 1; i >=
p->nVars; i-- )
986 printf(
" Node %2d\n", i );
987 for ( j = 0; j <
p->nObjs; j++ )
989 printf(
"Fanin %2d : ", j );
990 for ( k = 0; k <
p->nLutSize; k++ )
991 printf(
"%3d ",
p->VarMarks[i][k][j] );
997static int Exa3_ManInitPolarityFindVar(
Exa3_Man_t *
p,
int i,
int k,
int * pIndex )
1001 iVar =
p->VarMarks[i][k][*pIndex];
1002 *pIndex = (*pIndex + 1) %
p->nVars;
1003 }
while ( iVar <= 0 );
1009 int i, k, iVar, nInputs = 0;
1010 for ( i =
p->nVars; i < p->nObjs; i++ )
1013 int iVarStart = 1 +
p->LutMask*(i -
p->nVars);
1014 iVar = iVarStart +
p->LutMask-1;
1015 p->pSat->polarity[iVar] = 1;
1018 for ( i =
p->nVars; i < p->nObjs; i++ )
1021 if ( i ==
p->nVars )
1023 for ( k =
p->nLutSize - 1; k >= 0; k-- )
1025 iVar = Exa3_ManInitPolarityFindVar(
p, i, k, &nInputs );
1026 p->pSat->polarity[iVar] = 1;
1031 for ( k =
p->nLutSize - 1; k > 0; k-- )
1033 iVar = Exa3_ManInitPolarityFindVar(
p, i, k, &nInputs );
1034 p->pSat->polarity[iVar] = 1;
1036 iVar =
p->VarMarks[i][0][i-1];
1037 if ( iVar <= 0 ) printf(
"Variable mapping error.\n" ), fflush(stdout);
1039 p->pSat->polarity[iVar] = 1;
1049 p->nVars = pPars->nVars;
1050 p->nNodes = pPars->nNodes;
1051 p->nLutSize = pPars->nLutSize;
1052 p->LutMask = (1 << pPars->nLutSize) - 1;
1053 p->nObjs = pPars->nVars + pPars->nNodes;
1054 p->nWords = Abc_TtWordNum(pPars->nVars);
1056 p->vOutLits = Vec_WecStart(
p->nObjs );
1057 p->iVar = Exa3_ManMarkup(
p );
1058 p->vInfo = Exa3_ManTruthTables(
p );
1067 Vec_WrdFree(
p->vInfo );
1068 Vec_WecFree(
p->vOutLits );
1084static inline int Exa3_ManFindFanin(
Exa3_Man_t *
p,
int i,
int k )
1086 int j, Count = 0, iVar = -1;
1087 for ( j = 0; j <
p->nObjs; j++ )
1088 if (
p->VarMarks[i][k][j] && sat_solver_var_value(
p->pSat,
p->VarMarks[i][k][j]) )
1098 static int Flag = 0;
1099 int i, k, j, iMint;
word * pFanins[6];
1100 for ( i =
p->nVars; i < p->nObjs; i++ )
1102 int iVarStart = 1 +
p->LutMask*(i -
p->nVars);
1103 for ( k = 0; k <
p->nLutSize; k++ )
1104 pFanins[k] = Exa3_ManTruth(
p, Exa3_ManFindFanin(
p, i, k) );
1105 Abc_TtConst0( Exa3_ManTruth(
p, i),
p->nWords );
1106 for ( k = 1; k <=
p->LutMask; k++ )
1108 if ( !sat_solver_var_value(
p->pSat, iVarStart+k-1) )
1111 Abc_TtConst1( Exa3_ManTruth(
p,
p->nObjs),
p->nWords );
1112 for ( j = 0; j <
p->nLutSize; j++ )
1113 Abc_TtAndCompl( Exa3_ManTruth(
p,
p->nObjs), Exa3_ManTruth(
p,
p->nObjs), 0, pFanins[j], !((k >> j) & 1),
p->nWords );
1114 Abc_TtOr( Exa3_ManTruth(
p, i), Exa3_ManTruth(
p, i), Exa3_ManTruth(
p,
p->nObjs),
p->nWords );
1117 if ( Flag &&
p->nVars >= 6 )
1118 iMint = Abc_TtFindLastDiffBit( Exa3_ManTruth(
p,
p->nObjs-1),
p->pTruth,
p->nVars );
1120 iMint = Abc_TtFindFirstDiffBit( Exa3_ManTruth(
p,
p->nObjs-1),
p->pTruth,
p->nVars );
1122 assert( iMint < (1 <<
p->nVars) );
1137static void Exa3_ManPrintSolution(
Exa3_Man_t *
p,
int fCompl )
1140 printf(
"Realization of given %d-input function using %d %d-input LUTs:\n",
p->nVars,
p->nNodes,
p->nLutSize );
1141 for ( i =
p->nObjs - 1; i >=
p->nVars; i-- )
1143 int Val, iVarStart = 1 +
p->LutMask*(i -
p->nVars);
1153 printf(
"%02d = %d\'b", i, 1 <<
p->nLutSize );
1154 for ( k =
p->LutMask - 1; k >= 0; k-- )
1156 Val = sat_solver_var_value(
p->pSat, iVarStart+k);
1157 if ( i ==
p->nObjs - 1 && fCompl )
1158 printf(
"%d", !Val );
1160 printf(
"%d", Val );
1162 if ( i ==
p->nObjs - 1 && fCompl )
1167 for ( k =
p->nLutSize - 1; k >= 0; k-- )
1169 iVar = Exa3_ManFindFanin(
p, i, k );
1170 if ( iVar >= 0 && iVar < p->nVars )
1171 printf(
" %c",
'a'+iVar );
1173 printf(
" %02d", iVar );
1190static void Exa3_ManDumpBlif(
Exa3_Man_t *
p,
int fCompl )
1193 char pFileName[1000];
1194 sprintf( pFileName,
"%s.blif",
p->pPars->pTtStr );
1195 FILE * pFile = fopen( pFileName,
"wb" );
1196 if ( pFile == NULL )
return;
1197 fprintf( pFile,
"# Realization of given %d-input function using %d %d-input LUTs synthesized by ABC on %s\n",
p->nVars,
p->nNodes,
p->nLutSize,
Extra_TimeStamp() );
1198 fprintf( pFile,
".model %s\n",
p->pPars->pTtStr );
1199 fprintf( pFile,
".inputs" );
1200 for ( k = 0; k <
p->nVars; k++ )
1201 fprintf( pFile,
" %c",
'a'+k );
1202 fprintf( pFile,
"\n.outputs F\n" );
1203 for ( i =
p->nObjs - 1; i >=
p->nVars; i-- )
1205 fprintf( pFile,
".names" );
1206 for ( k = 0; k <
p->nLutSize; k++ )
1208 iVar = Exa3_ManFindFanin(
p, i, k );
1209 if ( iVar >= 0 && iVar < p->nVars )
1210 fprintf( pFile,
" %c",
'a'+iVar );
1212 fprintf( pFile,
" %02d", iVar );
1214 if ( i ==
p->nObjs - 1 )
1215 fprintf( pFile,
" F\n" );
1217 fprintf( pFile,
" %02d\n", i );
1218 int iVarStart = 1 +
p->LutMask*(i -
p->nVars);
1219 for ( k = 0; k <
p->LutMask; k++ )
1221 int Val = sat_solver_var_value(
p->pSat, iVarStart+k);
1224 for ( b = 0; b <
p->nLutSize; b++ )
1225 fprintf( pFile,
"%d", ((k+1) >> b) & 1 );
1226 fprintf( pFile,
" %d\n", i !=
p->nObjs - 1 || !fCompl );
1229 fprintf( pFile,
".end\n\n" );
1231 printf(
"Finished dumping the resulting LUT network into file \"%s\".\n", pFileName );
1246static int Exa3_ManAddCnfStart(
Exa3_Man_t *
p,
int fOnlyAnd )
1248 int pLits[
MAJ_NOBJS], pLits2[2], i, j, k, n, m;
1250 for ( i =
p->nVars; i < p->nObjs; i++ )
1252 int iVarStart = 1 +
p->LutMask*(i -
p->nVars);
1253 for ( k = 0; k <
p->nLutSize; k++ )
1256 for ( j = 0; j <
p->nObjs; j++ )
1257 if (
p->VarMarks[i][k][j] )
1258 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 0 );
1263 for ( n = 0; n < nLits; n++ )
1264 for ( m = n+1; m < nLits; m++ )
1266 pLits2[0] = Abc_LitNot(pLits[n]);
1267 pLits2[1] = Abc_LitNot(pLits[m]);
1271 if ( k ==
p->nLutSize - 1 )
1274 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][k][j] )
1275 for ( n = j; n <
p->nObjs; n++ )
if (
p->VarMarks[i][k+1][n] )
1277 pLits2[0] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
1278 pLits2[1] = Abc_Var2Lit(
p->VarMarks[i][k+1][n], 1 );
1285#ifdef USE_NODE_ORDER
1287 for ( j =
p->nVars; j < i; j++ )
1288 for ( n = 0; n <
p->nObjs; n++ )
if (
p->VarMarks[i][0][n] )
1289 for ( m = n+1; m <
p->nObjs; m++ )
if (
p->VarMarks[j][0][m] )
1291 pLits2[0] = Abc_Var2Lit(
p->VarMarks[i][0][n], 1 );
1292 pLits2[1] = Abc_Var2Lit(
p->VarMarks[j][0][m], 1 );
1297 if (
p->nLutSize != 2 )
1300 for ( k = 0; k < 3; k++ )
1302 pLits[0] = Abc_Var2Lit( iVarStart, k==1 );
1303 pLits[1] = Abc_Var2Lit( iVarStart+1, k==2 );
1304 pLits[2] = Abc_Var2Lit( iVarStart+2, k!=0 );
1310 pLits[0] = Abc_Var2Lit( iVarStart, 1 );
1311 pLits[1] = Abc_Var2Lit( iVarStart+1, 1 );
1312 pLits[2] = Abc_Var2Lit( iVarStart+2, 0 );
1318 for ( i = 0; i <
p->nObjs - 1; i++ )
1320 Vec_Int_t * vArray = Vec_WecEntry(
p->vOutLits, i);
1321 assert( Vec_IntSize(vArray) > 0 );
1327static int Exa3_ManAddCnf(
Exa3_Man_t *
p,
int iMint )
1330 int i, k, n, j, Value = Abc_TtGetBit(
p->pTruth, iMint);
1331 for ( i = 0; i <
p->nVars; i++ )
1332 p->VarVals[i] = (iMint >> i) & 1;
1335 for ( i =
p->nVars; i < p->nObjs; i++ )
1338 int iVarStart = 1 +
p->LutMask*(i -
p->nVars);
1339 int iBaseSatVarI =
p->iVar + (
p->nLutSize+1)*(i -
p->nVars);
1340 for ( k = 0; k <
p->nLutSize; k++ )
1342 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][k][j] )
1344 int iBaseSatVarJ =
p->iVar + (
p->nLutSize+1)*(j -
p->nVars);
1345 for ( n = 0; n < 2; n++ )
1347 int pLits[3], nLits = 0;
1348 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
1349 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + k, n );
1350 if ( j >=
p->nVars )
1351 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarJ +
p->nLutSize, !n );
1352 else if (
p->VarVals[j] == n )
1360 for ( n = 0; n < 2; n++ )
1362 if ( i ==
p->nObjs - 1 && n == Value )
1364 for ( k = 0; k <=
p->LutMask; k++ )
1366 int pLits[8], nLits = 0;
1367 if ( k == 0 && n == 1 )
1372 for ( j = 0; j <
p->nLutSize; j++ )
1373 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + j, (k >> j) & 1 );
1374 if ( i !=
p->nObjs - 1 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + j, !n );
1375 if ( k > 0 ) pLits[nLits++] = Abc_Var2Lit( iVarStart + k-1, n );
1376 assert( nLits <= p->nLutSize+2 );
1382 p->iVar += (
p->nLutSize+1)*
p->nNodes;
1387 int i, status, iMint = 1;
1388 abctime clkTotal = Abc_Clock();
1391 if ( pPars->pSymStr ) {
1392 word * pFun = Abc_TtSymFunGenerate( pPars->pSymStr, pPars->nVars );
1393 pPars->pTtStr =
ABC_CALLOC(
char, pPars->nVars > 2 ? (1 << (pPars->nVars-2)) + 1 : 2 );
1395 printf(
"Generated symmetric function: %s\n", pPars->pTtStr );
1398 if ( pPars->pTtStr )
1399 Abc_TtReadHex( pTruth, pPars->pTtStr );
1401 assert( pPars->nVars <= 10 );
1402 assert( pPars->nLutSize <= 6 );
1403 p = Exa3_ManAlloc( pPars, pTruth );
1404 if ( pTruth[0] & 1 ) { fCompl = 1; Abc_TtNot( pTruth,
p->nWords ); }
1405 status = Exa3_ManAddCnfStart(
p, pPars->fOnlyAnd );
1407 printf(
"Running exact synthesis for %d-input function with %d %d-input LUTs...\n",
p->nVars,
p->nNodes,
p->nLutSize );
1408 for ( i = 0; iMint != -1; i++ )
1411 if ( !Exa3_ManAddCnf(
p, iMint ) )
1414 if ( pPars->fVerbose )
1416 printf(
"Iter %3d : ", i );
1418 printf(
" Var =%5d ",
p->iVar );
1421 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
1425 printf(
"The problem has no solution.\n" );
1428 iMint = Exa3_ManEval(
p );
1431 Exa3_ManPrintSolution(
p, fCompl );
1432 Abc_PrintTime( 1,
"Total runtime", Abc_Clock() - clkTotal );
1434 Exa3_ManDumpBlif(
p, fCompl );
1435 if ( pPars->pSymStr )
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Exa3_ManExactSynthesis2(Bmc_EsPar_t *pPars)
int Maj_ManExactSynthesis2(int nVars, int nNodes, int fUseConst, int fUseLine, int fUseRand, int nRands, int fVerbose)
#define MAJ_NOBJS
DECLARATIONS ///.
int Maj_ManExactSynthesisTest()
void Exa_ManExactSynthesis2(Bmc_EsPar_t *pPars)
int Maj_ManValue(int iMint, int nVars)
FUNCTION DEFINITIONS ///.
void Maj_ManFree(Maj_Man_t *p)
Vec_Wrd_t * Exa_ManTruthTables(Exa_Man_t *p)
struct Maj_Man_t_ Maj_Man_t
Vec_Wrd_t * Maj_ManTruthTables(Maj_Man_t *p)
int Exa_ManMarkup(Exa_Man_t *p)
struct Exa3_Man_t_ Exa3_Man_t
struct Exa_Man_t_ Exa_Man_t
Exa_Man_t * Exa_ManAlloc(Bmc_EsPar_t *pPars, word *pTruth)
int Maj_ManAddCnf(Maj_Man_t *p, int iMint)
void Exa_ManPrintSolution(Exa_Man_t *p, int fCompl)
int Exa_ManAddCnf(Exa_Man_t *p, int iMint)
void Exa_ManFree(Exa_Man_t *p)
int Maj_ManMarkup(Maj_Man_t *p)
int Exa_ManAddCnfStart(Exa_Man_t *p, int fOnlyAnd)
Maj_Man_t * Maj_ManAlloc(int nVars, int nNodes, int fUseConst, int fUseLine)
void Maj_ManPrintSolution(Maj_Man_t *p)
int Maj_ManAddCnfStart(Maj_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Bmc_EsPar_t_ Bmc_EsPar_t
INCLUDES ///.
#define sat_solver_addclause
void Extra_PrintBinary(FILE *pFile, unsigned Sign[], int nBits)
unsigned __int64 word
DECLARATIONS ///.
sat_solver * sat_solver_new(void)
int sat_solver_nconflicts(sat_solver *s)
int sat_solver_nclauses(sat_solver *s)
void sat_solver_setnvars(sat_solver *s, int n)
void sat_solver_delete(sat_solver *s)
int VarMarks[MAJ_NOBJS][6][MAJ_NOBJS]
int VarMarks[MAJ_NOBJS][2][MAJ_NOBJS]
int VarMarks[MAJ_NOBJS][3][MAJ_NOBJS]
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.