63static inline word * Maj_ManTruth(
Maj_Man_t *
p,
int v ) {
return Vec_WrdEntryP(
p->vInfo,
p->nWords * v ); }
83 for ( k = 0; k < nVars; k++ )
84 Count += (iMint >> k) & 1;
85 return (
int)(Count > nVars/2);
89 Vec_Wrd_t * vInfo =
p->vInfo = Vec_WrdStart(
p->nWords * (
p->nObjs + 1) );
90 int i, nMints = Abc_MaxInt( 64, 1 <<
p->nVars );
91 Abc_TtFill( Maj_ManTruth(
p, 1),
p->nWords );
92 for ( i = 0; i <
p->nVars; i++ )
93 Abc_TtIthVar( Maj_ManTruth(
p, i+2), i,
p->nVars );
94 for ( i = 0; i < nMints; i++ )
96 Abc_TtSetBit( Maj_ManTruth(
p,
p->nObjs), i );
107 for ( k = 0; k < 3; k++ )
110 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
111 p->VarMarks[i][k][j] =
p->iVar++;
114 for ( i =
p->nVars + 3; i < p->nObjs; i++ )
116 for ( k = 0; k < 3; k++ )
118 if (
p->fUseLine && k == 0 )
121 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
122 p->VarMarks[i][k][j] =
p->iVar++;
125 for ( j = (
p->fUseConst && k == 2) ? 0 : 2; j < i - k; j++ )
127 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
128 p->VarMarks[i][k][j] =
p->iVar++;
132 printf(
"The number of parameter variables = %d.\n",
p->iVar );
135 for ( i =
p->nVars + 2; i < p->nObjs; i++ )
137 printf(
"Node %d\n", i );
138 for ( j = 0; j <
p->nObjs; j++ )
140 for ( k = 0; k < 3; k++ )
141 printf(
"%3d ",
p->VarMarks[i][k][j] );
152 p->nObjs = 2 + nVars + nNodes;
153 p->fUseConst = fUseConst;
154 p->fUseLine = fUseLine;
155 p->nWords = Abc_TtWordNum(nVars);
156 p->vOutLits = Vec_WecStart(
p->nObjs );
167 Vec_WrdFree(
p->vInfo );
168 Vec_WecFree(
p->vOutLits );
184static inline int Maj_ManFindFanin(
Maj_Man_t *
p,
int i,
int k )
186 int j, Count = 0, iVar = -1;
187 for ( j = 0; j <
p->nObjs; j++ )
200 int i, k, iMint;
word * pFanins[3];
201 for ( i =
p->nVars + 2; i < p->nObjs; i++ )
203 for ( k = 0; k < 3; k++ )
204 pFanins[k] = Maj_ManTruth(
p, Maj_ManFindFanin(
p, i, k) );
205 Abc_TtMaj( Maj_ManTruth(
p, i), pFanins[0], pFanins[1], pFanins[2],
p->nWords );
210 for ( i = 0; i < (1 <<
p->nVars); i++ )
212 int nOnes = Abc_TtBitCount16(i);
213 if ( nOnes < p->nVars/2 || nOnes >
p->nVars/2+1 )
215 if ( Abc_TtGetBit(Maj_ManTruth(
p,
p->nObjs), i) == Abc_TtGetBit(Maj_ManTruth(
p,
p->nObjs-1), i) )
223 if ( Flag &&
p->nVars >= 6 )
224 iMint = Abc_TtFindLastDiffBit( Maj_ManTruth(
p,
p->nObjs-1), Maj_ManTruth(
p,
p->nObjs),
p->nVars );
226 iMint = Abc_TtFindFirstDiffBit( Maj_ManTruth(
p,
p->nObjs-1), Maj_ManTruth(
p,
p->nObjs),
p->nVars );
229 assert( iMint < (1 <<
p->nVars) );
247 printf(
"Realization of %d-input majority using %d MAJ3 gates:\n",
p->nVars,
p->nNodes );
249 for ( i =
p->nObjs - 1; i >=
p->nVars + 2; i-- )
251 printf(
"%02d = MAJ(", i-2 );
252 for ( k = 2; k >= 0; k-- )
254 iVar = Maj_ManFindFanin(
p, i, k );
255 if ( iVar >= 2 && iVar < p->nVars + 2 )
256 printf(
" %c",
'a'+iVar-2 );
258 printf(
" %d", iVar );
260 printf(
" %02d", iVar-2 );
280 int pLits[
MAJ_NOBJS], pLits2[2], i, j, k, n, m;
282 for ( i =
p->nVars + 2; i < p->nObjs; i++ )
284 for ( k = 0; k < 3; k++ )
287 for ( j = 0; j <
p->nObjs; j++ )
288 if (
p->VarMarks[i][k][j] )
289 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 0 );
294 for ( n = 0; n < nLits; n++ )
295 for ( m = n+1; m < nLits; m++ )
297 pLits2[0] = Abc_LitNot(pLits[n]);
298 pLits2[1] = Abc_LitNot(pLits[m]);
305 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][k][j] )
306 for ( n = j; n <
p->nObjs; n++ )
if (
p->VarMarks[i][k+1][n] )
308 pLits2[0] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
309 pLits2[1] = Abc_Var2Lit(
p->VarMarks[i][k+1][n], 1 );
316 for ( i = 2; i <
p->nObjs - 1; i++ )
318 Vec_Int_t * vArray = Vec_WecEntry(
p->vOutLits, i);
319 assert( Vec_IntSize(vArray) > 0 );
329 for ( i = 0; i <
p->nVars; i++ )
330 p->VarVals[i+2] = (iMint >> i) & 1;
333 for ( i =
p->nVars + 2; i < p->nObjs; i++ )
336 int iBaseSatVarI =
p->iVar + 4*(i -
p->nVars - 2);
337 for ( k = 0; k < 3; k++ )
339 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][k][j] )
341 int iBaseSatVarJ =
p->iVar + 4*(j -
p->nVars - 2);
342 for ( n = 0; n < 2; n++ )
344 int pLits[3], nLits = 0;
345 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
346 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + k, n );
347 if ( j >=
p->nVars + 2 )
348 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarJ + 3, !n );
349 else if (
p->VarVals[j] == n )
357 for ( n = 0; n < 2; n++ )
359 if ( i ==
p->nObjs - 1 && n == Value )
361 for ( k = 0; k < 3; k++ )
363 int pLits[3], nLits = 0;
364 if ( k != 0 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 0, n );
365 if ( k != 1 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 1, n );
366 if ( k != 2 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 2, n );
367 if ( i !=
p->nObjs - 1 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 3, !n );
374 p->iVar += 4*
p->nNodes;
380 abctime clkTotal = Abc_Clock();
384 printf(
"Running exact synthesis for %d-input majority with %d MAJ3 gates...\n",
p->nVars,
p->nNodes );
385 for ( i = 0; iMint != -1; i++ )
393 printf(
"Iter %3d : ", i );
395 printf(
" Var =%5d ",
p->iVar );
398 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
402 printf(
"The problem has no solution.\n" );
405 iMint = Maj_ManEval(
p );
410 Abc_PrintTime( 1,
"Total runtime", Abc_Clock() - clkTotal );
440static inline word * Exa_ManTruth(
Exa_Man_t *
p,
int v ) {
return Vec_WrdEntryP(
p->vInfo,
p->nWords * v ); }
456 Vec_Wrd_t * vInfo =
p->vInfo = Vec_WrdStart(
p->nWords * (
p->nObjs+1) );
int i;
457 for ( i = 0; i <
p->nVars; i++ )
458 Abc_TtIthVar( Exa_ManTruth(
p, i), i,
p->nVars );
467 p->iVar = 1 + 3*
p->nNodes;
469 for ( i =
p->nVars; i < p->nObjs; i++ )
471 for ( k = 0; k < 2; k++ )
473 if (
p->pPars->fFewerVars && i ==
p->nObjs - 1 && k == 0 )
476 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
477 p->VarMarks[i][k][j] =
p->iVar++;
480 for ( j =
p->pPars->fFewerVars ? 1 - k : 0; j < i - k; j++ )
482 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
483 p->VarMarks[i][k][j] =
p->iVar++;
487 printf(
"The number of parameter variables = %d.\n",
p->iVar );
490 for ( i =
p->nVars; i < p->nObjs; i++ )
492 printf(
"Node %d\n", i );
493 for ( j = 0; j <
p->nObjs; j++ )
495 for ( k = 0; k < 2; k++ )
496 printf(
"%3d ",
p->VarMarks[i][k][j] );
506 p->nVars = pPars->nVars;
507 p->nNodes = pPars->nNodes;
508 p->nObjs = pPars->nVars + pPars->nNodes;
509 p->nWords = Abc_TtWordNum(pPars->nVars);
511 p->vOutLits = Vec_WecStart(
p->nObjs );
516 if ( pPars->RuntimeLim )
518 if ( pPars->fDumpCnf )
521 sprintf( Buffer,
"%s_%d_%d.cnf",
p->pPars->pTtStr, 2,
p->nNodes );
522 p->pFile = fopen( Buffer,
"wb" );
523 fputs(
"p cnf \n",
p->pFile );
532 sprintf( Buffer,
"%s_%d_%d.cnf",
p->pPars->pTtStr, 2,
p->nNodes );
536 printf(
"CNF was dumped into file \"%s\".\n", Buffer );
539 Vec_WrdFree(
p->vInfo );
540 Vec_WecFree(
p->vOutLits );
556static inline int Exa_ManFindFanin(
Exa_Man_t *
p,
int i,
int k )
558 int j, Count = 0, iVar = -1;
559 for ( j = 0; j <
p->nObjs; j++ )
571 int i, k, iMint;
word * pFanins[2];
572 for ( i =
p->nVars; i < p->nObjs; i++ )
574 int iVarStart = 1 + 3*(i -
p->nVars);
575 for ( k = 0; k < 2; k++ )
576 pFanins[k] = Exa_ManTruth(
p, Exa_ManFindFanin(
p, i, k) );
577 Abc_TtConst0( Exa_ManTruth(
p, i),
p->nWords );
578 for ( k = 1; k < 4; k++ )
582 Abc_TtAndCompl( Exa_ManTruth(
p,
p->nObjs), pFanins[0], !(k&1), pFanins[1], !(k>>1),
p->nWords );
583 Abc_TtOr( Exa_ManTruth(
p, i), Exa_ManTruth(
p, i), Exa_ManTruth(
p,
p->nObjs),
p->nWords );
586 if ( Flag &&
p->nVars >= 6 )
587 iMint = Abc_TtFindLastDiffBit( Exa_ManTruth(
p,
p->nObjs-1),
p->pTruth,
p->nVars );
589 iMint = Abc_TtFindFirstDiffBit( Exa_ManTruth(
p,
p->nObjs-1),
p->pTruth,
p->nVars );
591 assert( iMint < (1 <<
p->nVars) );
613 Abc_TtNot(
p->pTruth,
p->nWords );
616 Abc_TtNot(
p->pTruth,
p->nWords );
617 sprintf( FileName,
"%s_%d_%d.blif", Buffer, 2,
p->nNodes );
618 pFile = fopen( FileName,
"wb" );
619 fprintf( pFile,
"# Realization of the %d-input function %s using %d two-input gates:\n",
p->nVars, Buffer,
p->nNodes );
620 fprintf( pFile,
".model %s_%d_%d\n", Buffer, 2,
p->nNodes );
621 fprintf( pFile,
".inputs" );
622 for ( i = 0; i <
p->nVars; i++ )
623 fprintf( pFile,
" %c",
'a'+i );
624 fprintf( pFile,
"\n" );
625 fprintf( pFile,
".outputs F\n" );
626 for ( i =
p->nObjs - 1; i >=
p->nVars; i-- )
628 int iVarStart = 1 + 3*(i -
p->nVars);
633 fprintf( pFile,
".names" );
634 for ( k = 1; k >= 0; k-- )
636 iVar = Exa_ManFindFanin(
p, i, k );
637 if ( iVar >= 0 && iVar < p->nVars )
638 fprintf( pFile,
" %c",
'a'+iVar );
640 fprintf( pFile,
" %02d", iVar );
642 if ( i ==
p->nObjs - 1 )
643 fprintf( pFile,
" F\n" );
645 fprintf( pFile,
" %02d\n", i );
646 if ( i ==
p->nObjs - 1 && fCompl )
647 fprintf( pFile,
"00 1\n" );
648 if ( (i ==
p->nObjs - 1 && fCompl) ^ Val1 )
649 fprintf( pFile,
"01 1\n" );
650 if ( (i ==
p->nObjs - 1 && fCompl) ^ Val2 )
651 fprintf( pFile,
"10 1\n" );
652 if ( (i ==
p->nObjs - 1 && fCompl) ^ Val3 )
653 fprintf( pFile,
"11 1\n" );
655 fprintf( pFile,
".end\n\n" );
657 printf(
"Solution was dumped into file \"%s\".\n", FileName );
662 printf(
"Realization of given %d-input function using %d two-input gates:\n",
p->nVars,
p->nNodes );
664 for ( i =
p->nObjs - 1; i >=
p->nVars; i-- )
666 int iVarStart = 1 + 3*(i -
p->nVars);
670 if ( i ==
p->nObjs - 1 && fCompl )
671 printf(
"%02d = 4\'b%d%d%d1(", i, !Val3, !Val2, !Val1 );
673 printf(
"%02d = 4\'b%d%d%d0(", i, Val3, Val2, Val1 );
674 for ( k = 1; k >= 0; k-- )
676 iVar = Exa_ManFindFanin(
p, i, k );
677 if ( iVar >= 0 && iVar < p->nVars )
678 printf(
" %c",
'a'+iVar );
680 printf(
" %02d", iVar );
698static inline int Exa_ManAddClause(
Exa_Man_t *
p,
int * pLits,
int nLits )
704 for ( i = 0; i < nLits; i++ )
705 fprintf(
p->pFile,
"%s%d ", Abc_LitIsCompl(pLits[i]) ?
"-" :
"", Abc_Lit2Var(pLits[i]) );
706 fprintf(
p->pFile,
"0\n" );
712 int pLits[
MAJ_NOBJS], pLits2[2], i, j, k, n, m;
714 for ( i =
p->nVars; i < p->nObjs; i++ )
716 for ( k = 0; k < 2; k++ )
719 for ( j = 0; j <
p->nObjs; j++ )
721 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 0 );
724 for ( n = 0; n < nLits; n++ )
725 for ( m = n+1; m < nLits; m++ )
728 pLits2[0] = Abc_LitNot(pLits[n]);
729 pLits2[1] = Abc_LitNot(pLits[m]);
730 if ( !Exa_ManAddClause(
p, pLits2, 2 ) )
740 pLits2[0] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
741 pLits2[1] = Abc_Var2Lit(
p->VarMarks[i][k+1][n], 1 );
742 if ( !Exa_ManAddClause(
p, pLits2, 2 ) )
768 int pLits[
MAJ_NOBJS], pLits2[3], i, j, k, n, m, Start, Stop;
772 for ( j = 0; j < Start; j++ )
773 if (
p->VarMarks[n][0][j] ) {
774 pLits[0] = Abc_Var2Lit(
p->VarMarks[n][0][j], 1 );
775 Exa_ManAddClause(
p, pLits, 1 );
777 for ( k = 0; k < 2; k++ )
778 for ( j = Stop; j < n; j++ )
779 if (
p->VarMarks[n][k][j] ) {
780 pLits[0] = Abc_Var2Lit(
p->VarMarks[n][k][j], 1 );
781 Exa_ManAddClause(
p, pLits, 1 );
785 assert( n ==
p->nVars +
p->nNodes );
786 Vec_IntFreeP( &vRes );
789 for ( i =
p->nVars; i < p->nObjs; i++ )
791 int iVarStart = 1 + 3*(i -
p->nVars);
792 for ( k = 0; k < 2; k++ )
795 for ( j = 0; j <
p->nObjs; j++ )
796 if (
p->VarMarks[i][k][j] )
797 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 0 );
799 if ( !Exa_ManAddClause(
p, pLits, nLits ) )
802 if ( !
p->pPars->fDynConstr )
804 for ( n = 0; n < nLits; n++ )
805 for ( m = n+1; m < nLits; m++ )
807 pLits2[0] = Abc_LitNot(pLits[n]);
808 pLits2[1] = Abc_LitNot(pLits[m]);
809 if ( !Exa_ManAddClause(
p, pLits2, 2 ) )
816 if ( !
p->pPars->fDynConstr )
818 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][k][j] )
819 for ( n = j; n <
p->nObjs; n++ )
if (
p->VarMarks[i][k+1][n] )
821 pLits2[0] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
822 pLits2[1] = Abc_Var2Lit(
p->VarMarks[i][k+1][n], 1 );
823 if ( !Exa_ManAddClause(
p, pLits2, 2 ) )
830 for ( j =
p->nVars; j < i; j++ )
831 for ( n = 0; n <
p->nObjs; n++ )
if (
p->VarMarks[i][0][n] )
832 for ( m = n+1; m <
p->nObjs; m++ )
if (
p->VarMarks[j][0][m] )
834 pLits2[0] = Abc_Var2Lit(
p->VarMarks[i][0][n], 1 );
835 pLits2[1] = Abc_Var2Lit(
p->VarMarks[j][0][m], 1 );
836 if ( !Exa_ManAddClause(
p, pLits2, 2 ) )
841 for ( j =
p->nVars; j < i; j++ )
842 for ( k = 0; k < 2; k++ )
if (
p->VarMarks[i][k][j] )
844 pLits2[0] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
845 for ( n = 0; n <
p->nObjs; n++ )
846 for ( m = 0; m < 2; m++ )
848 if (
p->VarMarks[i][!k][n] &&
p->VarMarks[j][m][n] )
850 pLits2[1] = Abc_Var2Lit(
p->VarMarks[i][!k][n], 1 );
851 pLits2[2] = Abc_Var2Lit(
p->VarMarks[j][m][n], 1 );
852 if ( !Exa_ManAddClause(
p, pLits2, 3 ) )
858 for ( k = 0; k < 3; k++ )
860 pLits[0] = Abc_Var2Lit( iVarStart, k==1 );
861 pLits[1] = Abc_Var2Lit( iVarStart+1, k==2 );
862 pLits[2] = Abc_Var2Lit( iVarStart+2, k!=0 );
863 if ( !Exa_ManAddClause(
p, pLits, 3 ) )
868 pLits[0] = Abc_Var2Lit( iVarStart, 1 );
869 pLits[1] = Abc_Var2Lit( iVarStart+1, 1 );
870 pLits[2] = Abc_Var2Lit( iVarStart+2, 0 );
871 if ( !Exa_ManAddClause(
p, pLits, 3 ) )
876 for ( i = 0; i <
p->nObjs - 1; i++ )
878 Vec_Int_t * vArray = Vec_WecEntry(
p->vOutLits, i);
879 assert( Vec_IntSize(vArray) > 0 );
880 if ( !Exa_ManAddClause(
p, Vec_IntArray(vArray), Vec_IntSize(vArray) ) )
888 int i, k, n, j, Value = Abc_TtGetBit(
p->pTruth, iMint);
889 for ( i = 0; i <
p->nVars; i++ )
890 p->VarVals[i] = (iMint >> i) & 1;
893 for ( i =
p->nVars; i < p->nObjs; i++ )
896 int iVarStart = 1 + 3*(i -
p->nVars);
897 int iBaseSatVarI =
p->iVar + 3*(i -
p->nVars);
898 for ( k = 0; k < 2; k++ )
900 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][k][j] )
902 int iBaseSatVarJ =
p->iVar + 3*(j -
p->nVars);
903 for ( n = 0; n < 2; n++ )
905 int pLits[3], nLits = 0;
906 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
907 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + k, n );
909 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarJ + 2, !n );
910 else if (
p->VarVals[j] == n )
912 if ( !Exa_ManAddClause(
p, pLits, nLits ) )
918 for ( n = 0; n < 2; n++ )
920 if ( i ==
p->nObjs - 1 && n == Value )
922 for ( k = 0; k < 4; k++ )
924 int pLits[4], nLits = 0;
925 if ( k == 0 && n == 1 )
927 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 0, (k&1) );
928 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 1, (k>>1) );
929 if ( i !=
p->nObjs - 1 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + 2, !n );
930 if ( k > 0 ) pLits[nLits++] = Abc_Var2Lit( iVarStart + k-1, n );
932 if ( !Exa_ManAddClause(
p, pLits, nLits ) )
937 p->iVar += 3*
p->nNodes;
942 int i, status, iMint = 1;
943 abctime clkTotal = Abc_Clock();
945 word pTruth[16]; Abc_TtReadHex( pTruth, pPars->pTtStr );
946 assert( pPars->nVars <= 10 );
948 if ( pTruth[0] & 1 ) { fCompl = 1; Abc_TtNot( pTruth,
p->nWords ); }
951 printf(
"Running exact synthesis for %d-input function with %d two-input gates...\n",
p->nVars,
p->nNodes );
952 for ( i = 0; iMint != -1; i++ )
957 if ( pPars->fDynConstr )
961 if ( pPars->fVerbose )
963 printf(
"Iter %3d : ", i );
965 printf(
" Var =%5d ",
p->iVar );
968 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
972 printf(
"The problem has no solution.\n" );
977 printf(
"The solver timed out after %d sec.\n", pPars->RuntimeLim );
980 iMint = Exa_ManEval(
p );
988 Abc_PrintTime( 1,
"Total runtime", Abc_Clock() - clkTotal );
1017static inline word * Exa3_ManTruth(
Exa3_Man_t *
p,
int v ) {
return Vec_WrdEntryP(
p->vInfo,
p->nWords * v ); }
1019static inline int Exa3_ManIsUsed2(
Exa3_Man_t *
p,
int m,
int n,
int i,
int j )
1021 int Pos = ((m *
p->pPars->nNodes + n -
p->pPars->nVars) *
p->nObjs + i) *
p->nObjs + j;
1023 assert( i < n && j < n && i < j );
1024 if ( Vec_BitEntry(
p->vUsed2,
Pos) )
1027 Vec_BitWriteEntry(
p->vUsed2,
Pos, 1 );
1031static inline int Exa3_ManIsUsed3(
Exa3_Man_t *
p,
int m,
int n,
int i,
int j,
int k )
1033 int Pos = (((m *
p->pPars->nNodes + n -
p->pPars->nVars) *
p->nObjs + i) *
p->nObjs + j) *
p->nObjs + k;
1035 assert( i < n && j < n && k < n && i < j && j < k );
1036 if ( Vec_BitEntry(
p->vUsed3,
Pos) )
1039 Vec_BitWriteEntry(
p->vUsed3,
Pos, 1 );
1062 Vec_IntPushUniqueOrder( vLevel, iVar );
1064 while ( Vec_IntSize(vLevel) < nLutSize-(
int)(i>0) );
1071 Vec_Int_t * vCounts = Vec_IntStart( nVars );
1074 Vec_IntAddToEntry( vCounts, Obj, 1 );
1079 for (
int i = 0; i < 1000; i++ ) {
1082 int RetValue = Vec_IntFind( q, 0 );
1084 if ( RetValue == -1 )
1105 Vec_Wrd_t * vInfo =
p->vInfo = Vec_WrdStart(
p->nWords * (
p->nObjs+1) );
int i;
1106 for ( i = 0; i <
p->nVars; i++ )
1107 Abc_TtIthVar( Exa3_ManTruth(
p, i), i,
p->nVars );
1116 p->iVar = 1 +
p->LutMask *
p->nNodes;
1118 for ( i =
p->nVars; i < p->nObjs; i++ )
1120 if (
p->pPars->fLutCascade )
1124 Vec_WecPush(
p->vOutLits, i-1, Abc_Var2Lit(
p->iVar, 0) );
1125 p->VarMarks[i][0][i-1] =
p->iVar++;
1127 for ( k = (
int)(i >
p->nVars); k < p->nLutSize; k++ )
1129 for ( j = 0; j <
p->nVars - k + (int)(i >
p->nVars); j++ )
1131 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
1132 p->VarMarks[i][k][j] =
p->iVar++;
1137 for ( k = 0; k <
p->nLutSize; k++ )
1139 if (
p->pPars->fFewerVars && i ==
p->nObjs - 1 && k == 0 )
1142 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
1143 p->VarMarks[i][k][j] =
p->iVar++;
1146 for ( j =
p->pPars->fFewerVars ?
p->nLutSize - 1 - k : 0; j < i - k; j++ )
1148 Vec_WecPush(
p->vOutLits, j, Abc_Var2Lit(
p->iVar, 0) );
1149 p->VarMarks[i][k][j] =
p->iVar++;
1153 printf(
"The number of parameter variables = %d.\n",
p->iVar );
1154 if (
p->pPars->fLutCascade &&
p->pPars->fLutInFixed ) {
1158 printf(
"Using fixed input assignment:\n" );
1160 printf(
"%02d : ",
p->nVars+i );
1162 printf(
"%c ",
'a'+
Var );
1169 for ( i =
p->nObjs - 1; i >=
p->nVars; i-- )
1171 printf(
" Node %2d\n", i );
1172 for ( j = 0; j <
p->nObjs; j++ )
1174 printf(
"Fanin %2d : ", j );
1175 for ( k = 0; k <
p->nLutSize; k++ )
1176 printf(
"%3d ",
p->VarMarks[i][k][j] );
1186 p->nVars = pPars->nVars;
1187 p->nNodes = pPars->nNodes;
1188 p->nLutSize = pPars->nLutSize;
1189 p->LutMask = (1 << pPars->nLutSize) - 1;
1190 p->nObjs = pPars->nVars + pPars->nNodes;
1191 p->nWords = Abc_TtWordNum(pPars->nVars);
1193 p->vOutLits = Vec_WecStart(
p->nObjs );
1194 p->iVar = Exa3_ManMarkup(
p );
1195 p->vInfo = Exa3_ManTruthTables(
p );
1196 if (
p->pPars->nLutSize == 2 )
1197 p->vUsed2 = Vec_BitStart( (1 <<
p->pPars->nVars) *
p->pPars->nNodes *
p->nObjs *
p->nObjs );
1198 else if (
p->pPars->nLutSize == 3 )
1199 p->vUsed3 = Vec_BitStart( (1 <<
p->pPars->nVars) *
p->pPars->nNodes *
p->nObjs *
p->nObjs *
p->nObjs );
1202 if ( pPars->RuntimeLim )
1209 Vec_WrdFree(
p->vInfo );
1210 Vec_BitFreeP( &
p->vUsed2 );
1211 Vec_BitFreeP( &
p->vUsed3 );
1212 Vec_WecFree(
p->vOutLits );
1213 Vec_WecFreeP( &
p->vInVars );
1229static inline int Exa3_ManFindFanin(
Exa3_Man_t *
p,
int i,
int k )
1231 int j, Count = 0, iVar = -1;
1232 for ( j = 0; j <
p->nObjs; j++ )
1243 static int Flag = 0;
1244 int i, k, j, iMint;
word * pFanins[6];
1245 for ( i =
p->nVars; i < p->nObjs; i++ )
1247 int iVarStart = 1 +
p->LutMask*(i -
p->nVars);
1248 for ( k = 0; k <
p->nLutSize; k++ )
1249 pFanins[k] = Exa3_ManTruth(
p, Exa3_ManFindFanin(
p, i, k) );
1250 Abc_TtConst0( Exa3_ManTruth(
p, i),
p->nWords );
1251 for ( k = 1; k <=
p->LutMask; k++ )
1256 Abc_TtConst1( Exa3_ManTruth(
p,
p->nObjs),
p->nWords );
1257 for ( j = 0; j <
p->nLutSize; j++ )
1258 Abc_TtAndCompl( Exa3_ManTruth(
p,
p->nObjs), Exa3_ManTruth(
p,
p->nObjs), 0, pFanins[j], !((k >> j) & 1),
p->nWords );
1259 Abc_TtOr( Exa3_ManTruth(
p, i), Exa3_ManTruth(
p, i), Exa3_ManTruth(
p,
p->nObjs),
p->nWords );
1262 if ( Flag &&
p->nVars >= 6 )
1263 iMint = Abc_TtFindLastDiffBit( Exa3_ManTruth(
p,
p->nObjs-1),
p->pTruth,
p->nVars );
1265 iMint = Abc_TtFindFirstDiffBit( Exa3_ManTruth(
p,
p->nObjs-1),
p->pTruth,
p->nVars );
1267 assert( iMint < (1 <<
p->nVars) );
1282static void Exa3_ManPrintSolution(
Exa3_Man_t *
p,
int fCompl )
1285 printf(
"Realization of given %d-input function using %d %d-input LUTs:\n",
p->nVars,
p->nNodes,
p->nLutSize );
1286 for ( i =
p->nObjs - 1; i >=
p->nVars; i-- )
1288 int Val, iVarStart = 1 +
p->LutMask*(i -
p->nVars);
1289 printf(
"%02d = %d\'b", i, 1 <<
p->nLutSize );
1290 for ( k =
p->LutMask - 1; k >= 0; k-- )
1293 if ( i ==
p->nObjs - 1 && fCompl )
1294 printf(
"%d", !Val );
1296 printf(
"%d", Val );
1298 if ( i ==
p->nObjs - 1 && fCompl )
1303 for ( k =
p->nLutSize - 1; k >= 0; k-- )
1305 iVar = Exa3_ManFindFanin(
p, i, k );
1306 if ( iVar >= 0 && iVar < p->nVars )
1307 printf(
" %c",
'a'+iVar );
1309 printf(
" %02d", iVar );
1326static void Exa3_ManDumpBlif(
Exa3_Man_t *
p,
int fCompl )
1329 char pFileName[1000];
1330 sprintf( pFileName,
"%s.blif",
p->pPars->pTtStr );
1331 FILE * pFile = fopen( pFileName,
"wb" );
1332 if ( pFile == NULL )
return;
1333 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() );
1334 fprintf( pFile,
".model %s\n",
p->pPars->pTtStr );
1335 fprintf( pFile,
".inputs" );
1336 for ( k = 0; k <
p->nVars; k++ )
1337 fprintf( pFile,
" %c",
'a'+k );
1338 fprintf( pFile,
"\n.outputs F\n" );
1339 for ( i =
p->nObjs - 1; i >=
p->nVars; i-- )
1341 fprintf( pFile,
".names" );
1342 for ( k = 0; k <
p->nLutSize; k++ )
1344 iVar = Exa3_ManFindFanin(
p, i, k );
1345 if ( iVar >= 0 && iVar < p->nVars )
1346 fprintf( pFile,
" %c",
'a'+iVar );
1348 fprintf( pFile,
" %02d", iVar );
1350 if ( i ==
p->nObjs - 1 )
1351 fprintf( pFile,
" F\n" );
1353 fprintf( pFile,
" %02d\n", i );
1354 int iVarStart = 1 +
p->LutMask*(i -
p->nVars);
1355 for ( k = 0; k <
p->LutMask; k++ )
1360 for ( b = 0; b <
p->nLutSize; b++ )
1361 fprintf( pFile,
"%d", ((k+1) >> b) & 1 );
1362 fprintf( pFile,
" %d\n", i !=
p->nObjs - 1 || !fCompl );
1365 fprintf( pFile,
".end\n\n" );
1367 printf(
"Finished dumping the resulting LUT network into file \"%s\".\n", pFileName );
1382static int Exa3_ManAddCnfStart(
Exa3_Man_t *
p,
int fOnlyAnd )
1384 int pLits[
MAJ_NOBJS], pLits2[2], i, j, k, n, m;
1386 for ( i =
p->nVars; i < p->nObjs; i++ )
1388 int iVarStart = 1 +
p->LutMask*(i -
p->nVars);
1389 for ( k = 0; k <
p->nLutSize; k++ )
1392 for ( j = 0; j <
p->nObjs; j++ )
1393 if (
p->VarMarks[i][k][j] )
1394 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 0 );
1399 for ( n = 0; n < nLits; n++ )
1400 for ( m = n+1; m < nLits; m++ )
1402 pLits2[0] = Abc_LitNot(pLits[n]);
1403 pLits2[1] = Abc_LitNot(pLits[m]);
1407 if ( k ==
p->nLutSize - 1 )
1410 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][k][j] )
1411 for ( n = j; n <
p->nObjs; n++ )
if (
p->VarMarks[i][k+1][n] )
1413 pLits2[0] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
1414 pLits2[1] = Abc_Var2Lit(
p->VarMarks[i][k+1][n], 1 );
1421 if (
p->pPars->fOrderNodes )
1423 for ( j =
p->nVars; j < i; j++ )
1424 for ( n = 0; n <
p->nObjs; n++ )
if (
p->VarMarks[i][0][n] )
1425 for ( m = n+1; m <
p->nObjs; m++ )
if (
p->VarMarks[j][0][m] )
1427 pLits2[0] = Abc_Var2Lit(
p->VarMarks[i][0][n], 1 );
1428 pLits2[1] = Abc_Var2Lit(
p->VarMarks[j][0][m], 1 );
1434 if (
p->nLutSize != 2 )
1437 for ( k = 0; k < 3; k++ )
1439 pLits[0] = Abc_Var2Lit( iVarStart, k==1 );
1440 pLits[1] = Abc_Var2Lit( iVarStart+1, k==2 );
1441 pLits[2] = Abc_Var2Lit( iVarStart+2, k!=0 );
1447 pLits[0] = Abc_Var2Lit( iVarStart, 1 );
1448 pLits[1] = Abc_Var2Lit( iVarStart+1, 1 );
1449 pLits[2] = Abc_Var2Lit( iVarStart+2, 0 );
1455 for ( i = 0; i <
p->nObjs - 1; i++ )
1457 Vec_Int_t * vArray = Vec_WecEntry(
p->vOutLits, i);
1458 assert( Vec_IntSize(vArray) > 0 );
1466 assert( Vec_IntSize(vLevel) > 0 );
1468 pLits[0] = Abc_Var2Lit(
p->VarMarks[
p->nVars+i][
p->nLutSize-1-k][
Var], 0 );
assert(pLits[0]);
1476static int Exa3_ManAddCnf(
Exa3_Man_t *
p,
int iMint )
1479 int i, k, n, j, Value = Abc_TtGetBit(
p->pTruth, iMint);
1480 for ( i = 0; i <
p->nVars; i++ )
1481 p->VarVals[i] = (iMint >> i) & 1;
1485 for ( i =
p->nVars; i < p->nObjs; i++ )
1488 int iVarStart = 1 +
p->LutMask*(i -
p->nVars);
1489 int iBaseSatVarI =
p->iVar + (
p->nLutSize+1)*(i -
p->nVars);
1490 for ( k = 0; k <
p->nLutSize; k++ )
1492 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][k][j] )
1494 int iBaseSatVarJ =
p->iVar + (
p->nLutSize+1)*(j -
p->nVars);
1495 for ( n = 0; n < 2; n++ )
1497 int pLits[3], nLits = 0;
1498 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 1 );
1499 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + k, n );
1500 if ( j >=
p->nVars )
1501 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarJ +
p->nLutSize, !n );
1502 else if (
p->VarVals[j] == n )
1510 for ( n = 0; n < 2; n++ )
1512 if ( i ==
p->nObjs - 1 && n == Value )
1514 for ( k = 0; k <=
p->LutMask; k++ )
1516 int pLits[16], nLits = 0;
1517 if ( k == 0 && n == 1 )
1522 for ( j = 0; j <
p->nLutSize; j++ )
1523 pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + j, (k >> j) & 1 );
1524 if ( i !=
p->nObjs - 1 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVarI + j, !n );
1525 if ( k > 0 ) pLits[nLits++] = Abc_Var2Lit( iVarStart + k-1, n );
1526 assert( nLits <= p->nLutSize+2 );
1532 p->iVar += (
p->nLutSize+1)*
p->nNodes;
1536static int Exa3_ManAddCnf2(
Exa3_Man_t *
p,
int iMint )
1538 int iBaseSatVar =
p->iVar +
p->nNodes*iMint;
1540 int i, k, n, j, Value = Abc_TtGetBit(
p->pTruth, iMint);
1541 for ( i = 0; i <
p->nVars; i++ )
1542 p->VarVals[i] = (iMint >> i) & 1;
1544 for ( i =
p->nVars; i < p->nObjs; i++ )
1547 int iVarStart = 1 +
p->LutMask*(i -
p->nVars);
1550 for ( j = 0; j <
p->nLutSize; j++ )
1551 pFanins[j] = Exa3_ManFindFanin(
p, i, j);
1553 if (
p->pPars->nLutSize == 2 && Exa3_ManIsUsed2(
p, iMint, i, pFanins[1], pFanins[0]) )
1555 if (
p->pPars->nLutSize == 3 && Exa3_ManIsUsed3(
p, iMint, i, pFanins[2], pFanins[1], pFanins[0]) )
1558 for ( n = 0; n < 2; n++ )
1560 if ( i ==
p->nObjs - 1 && n == Value )
1562 for ( k = 0; k <=
p->LutMask; k++ )
1564 int pLits[16], nLits = 0;
1565 if ( k == 0 && n == 1 )
1567 for ( j = 0; j <
p->nLutSize; j++ )
1570 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][j][pFanins[j]], 1 );
1571 if ( pFanins[j] >=
p->nVars )
1572 pLits[nLits++] = Abc_Var2Lit( iBaseSatVar + pFanins[j] -
p->nVars, (k >> j) & 1 );
1573 else if (
p->VarVals[pFanins[j]] != ((k >> j) & 1) )
1576 if ( j < p->nLutSize )
1579 if ( i !=
p->nObjs - 1 ) pLits[nLits++] = Abc_Var2Lit( iBaseSatVar + i -
p->nVars, !n );
1580 if ( k > 0 ) pLits[nLits++] = Abc_Var2Lit( iVarStart + k-1, n );
1581 assert( nLits <= 2*p->nLutSize+2 );
1591 printf(
"Iter%6d : ", i );
1596 Abc_PrintTime( 1,
"Time", clk );
1600 int i, status, Res = 0, iMint = 1;
1601 abctime clkTotal = Abc_Clock();
1604 if ( pPars->pSymStr ) {
1605 word * pFun = Abc_TtSymFunGenerate( pPars->pSymStr, pPars->nVars );
1606 pPars->pTtStr =
ABC_CALLOC(
char, pPars->nVars > 2 ? (1 << (pPars->nVars-2)) + 1 : 2 );
1608 printf(
"Generated symmetric function: %s\n", pPars->pTtStr );
1611 if ( pPars->pTtStr )
1612 Abc_TtReadHex( pTruth, pPars->pTtStr );
1614 assert( pPars->nVars <= 10 );
1615 assert( pPars->nLutSize <= 6 );
1616 p = Exa3_ManAlloc( pPars, pTruth );
1617 if ( pTruth[0] & 1 ) { fCompl = 1; Abc_TtNot( pTruth,
p->nWords ); }
1618 status = Exa3_ManAddCnfStart(
p, pPars->fOnlyAnd );
1620 printf(
"Running exact synthesis for %d-input function with %d %d-input LUTs...\n",
p->nVars,
p->nNodes,
p->nLutSize );
1621 if ( pPars->fUseIncr )
1627 for ( i = 0; iMint != -1; i++ )
1629 if ( pPars->fUseIncr ? !Exa3_ManAddCnf2(
p, iMint ) : !Exa3_ManAddCnf(
p, iMint ) )
1632 if ( pPars->fVerbose && (!pPars->fUseIncr || i % 100 == 0) )
1636 iMint = Exa3_ManEval(
p );
1641 Exa3_ManPrintSolution(
p, fCompl ), Res = 1;
1643 printf(
"The solver timed out after %d sec.\n", pPars->RuntimeLim );
1645 printf(
"The problem has no solution.\n" );
1646 printf(
"Added = %d. Tried = %d. ",
p->nUsed[1],
p->nUsed[0] );
1647 Abc_PrintTime( 1,
"Total runtime", Abc_Clock() - clkTotal );
1649 Exa3_ManDumpBlif(
p, fCompl );
1650 if ( pPars->pSymStr )
1657 int i, k, nDecs = 0,
nWords = Abc_TtWordNum(pPars->nVars);
1660 for ( i = 0; i < pPars->Seed; i++ )
1662 for ( i = 0; i < pPars->nRandFuncs; i++ ) {
1663 if ( pPars->nMintNum == 0 )
1664 for ( k = 0; k <
nWords; k++ )
1667 Abc_TtClear( pFun,
nWords );
1668 for ( k = 0; k < pPars->nMintNum; k++ ) {
1670 do iMint = (Rand0 ^
Abc_Random(0)) % (1 << pPars->nVars);
1671 while ( Abc_TtGetBit(pFun, iMint) );
1672 Abc_TtSetBit( pFun, iMint );
1675 pPars->pTtStr =
ABC_CALLOC(
char, pPars->nVars > 2 ? (1 << (pPars->nVars-2)) + 1 : 2 );
1677 printf(
"\nFunction %4d : ", i );
1678 if ( pPars->nMintNum )
1679 printf(
"Random function has %d positive minterms.", pPars->nMintNum );
1681 if ( pPars->fVerbose )
1682 printf(
"Truth table : %s\n", pPars->pTtStr );
1686 printf(
"\nDecomposable are %d (out of %d) functions (%.2f %%).\n\n", nDecs, pPars->nRandFuncs, 100.0*nDecs/pPars->nRandFuncs );
1704 int i, Count = 0;
word Temp;
1709 printf(
"The data for %d divisors are not normalized.\n", Count );
1710 if ( !(Vec_WrdEntry(vSimsOut, 0) & 1) )
1711 printf(
"The output data is not normalized.\n" );
1715static inline void Exa_ManPrintFanin(
int nIns,
int nDivs,
int iNode,
int fComp )
1718 printf(
" %s", fComp ?
"const1" :
"const0" );
1719 else if ( iNode > 0 && iNode <= nIns )
1720 printf(
" %s%c", fComp ?
"~" :
"",
'a'+iNode-1 );
1721 else if ( iNode > nIns && iNode < nDivs )
1722 printf(
" %s%c", fComp ?
"~" :
"",
'A'+iNode-nIns-1 );
1724 printf(
" %s%d", fComp ?
"~" :
"", iNode );
1728 int i, nDivs = 1 + Mini_AigPiNum(
p), nNodes = Mini_AigAndNum(
p);
1729 printf(
"This %d-var function (%d divisors) has %d gates (%d xor) and %d levels:\n",
1730 nIns, nDivs, nNodes, Mini_AigXorNum(
p), Mini_AigLevelNum(
p) );
1731 for ( i = nDivs + nNodes; i < Mini_AigNodeNum(
p); i++ )
1733 int Lit0 = Mini_AigNodeFanin0(
p, i );
1734 printf(
"%2d = ", i );
1735 Exa_ManPrintFanin( nIns, nDivs, Abc_Lit2Var(Lit0), Abc_LitIsCompl(Lit0) );
1738 for ( i = nDivs + nNodes - 1; i >= nDivs; i-- )
1740 int Lit0 = Mini_AigNodeFanin0(
p, i );
1741 int Lit1 = Mini_AigNodeFanin1(
p, i );
1742 printf(
"%2d = ", i );
1745 Exa_ManPrintFanin( nIns, nDivs, Abc_Lit2Var(Lit0), Abc_LitIsCompl(Lit0) );
1747 Exa_ManPrintFanin( nIns, nDivs, Abc_Lit2Var(Lit1), Abc_LitIsCompl(Lit1) );
1751 Exa_ManPrintFanin( nIns, nDivs, Abc_Lit2Var(Lit1), Abc_LitIsCompl(Lit1) );
1753 Exa_ManPrintFanin( nIns, nDivs, Abc_Lit2Var(Lit0), Abc_LitIsCompl(Lit0) );
1761 int i, nDivs = 1 + Mini_AigPiNum(
p), nNodes = Mini_AigAndNum(
p);
1762 int k, nOuts = Mini_AigPoNum(
p), nErrors = 0;
word Outs[6] = {0};
1763 Vec_Wrd_t * vSimsIn2 = Vec_WrdStart( 64 );
1765 assert( Vec_WrdSize(vSimsIn) <= 64 );
1766 assert( Vec_WrdSize(vSimsIn) == Vec_WrdSize(vSimsOut) );
1767 Vec_WrdFillExtra( vSimsIn, 64, 0 );
1769 assert( Mini_AigNodeNum(
p) <= 64 );
1770 for ( i = nDivs; i < nDivs + nNodes; i++ )
1772 int Lit0 = Mini_AigNodeFanin0(
p, i );
1773 int Lit1 = Mini_AigNodeFanin1(
p, i );
1774 word Sim0 = Vec_WrdEntry( vSimsIn2, Abc_Lit2Var(Lit0) );
1775 word Sim1 = Vec_WrdEntry( vSimsIn2, Abc_Lit2Var(Lit1) );
1776 Sim0 = Abc_LitIsCompl(Lit0) ? ~Sim0 : Sim0;
1777 Sim1 = Abc_LitIsCompl(Lit1) ? ~Sim1 : Sim1;
1778 Vec_WrdWriteEntry( vSimsIn2, i, Lit0 < Lit1 ? Sim0 & Sim1 : Sim0 ^ Sim1 );
1780 for ( i = nDivs + nNodes; i < Mini_AigNodeNum(
p); i++ )
1782 int Lit0 = Mini_AigNodeFanin0(
p, i );
1783 word Sim0 = Vec_WrdEntry( vSimsIn2, Abc_Lit2Var(Lit0) );
1784 Outs[i - (nDivs + nNodes)] = Abc_LitIsCompl(Lit0) ? ~Sim0 : Sim0;
1786 Vec_WrdFree( vSimsIn2 );
1787 for ( i = 0; i < Vec_WrdSize(vSimsOut); i++ )
1790 for ( k = 0; k < nOuts; k++ )
1791 if ( (Outs[k] >> i) & 1 )
1793 nErrors += !Abc_TtGetBit(Vec_WrdEntryP(vSimsOut, i), iOutMint);
1796 printf(
"Verification successful. " );
1798 printf(
"Verification failed for %d (out of %d) minterms.\n", nErrors, Vec_WrdSize(vSimsOut) );
1815 char * pToken, pBuffer[1000];
1816 FILE * pFile = fopen( pFileName,
"rb" );
1817 if ( pFile == NULL )
1819 Abc_Print( -1,
"Cannot open file \"%s\".\n", pFileName );
1822 while ( fgets( pBuffer, 1000, pFile ) != NULL )
1824 if ( pBuffer[0] ==
's' )
1826 if (
strncmp(pBuffer+2,
"SAT", 3) )
1829 vRes = Vec_IntAlloc( 100 );
1831 else if ( pBuffer[0] ==
'v' )
1833 pToken =
strtok( pBuffer+1,
" \n\r\t" );
1836 int Token = atoi(pToken);
1839 Vec_IntSetEntryFull( vRes, Abc_AbsInt(Token), Token > 0 );
1840 pToken =
strtok( NULL,
" \n\r\t" );
1843 else if ( pBuffer[0] !=
'c' )
1847 unlink( pFileName );
1852 int fVerboseSolver = 0;
1853 abctime clkTotal = Abc_Clock();
1856 char * pKissat =
"kissat.exe";
1858 char * pKissat =
"kissat";
1860 char Command[1000], * pCommand = (
char *)&Command;
1862 sprintf( pCommand,
"%s --time=%d %s %s > %s", pKissat, TimeOut, fVerboseSolver ?
"":
"-q", pFileNameIn, pFileNameOut );
1864 sprintf( pCommand,
"%s %s %s > %s", pKissat, fVerboseSolver ?
"":
"-q", pFileNameIn, pFileNameOut );
1868 if (
system( pCommand ) == -1 )
1871 fprintf( stdout,
"Command \"%s\" did not succeed.\n", pCommand );
1878 printf(
"The problem has a solution. " );
1879 else if ( vRes == NULL && TimeOut == 0 )
1880 printf(
"The problem has no solution. " );
1881 else if ( vRes == NULL )
1882 printf(
"The problem has no solution or timed out after %d sec. ", TimeOut );
1883 Abc_PrintTime( 1,
"SAT solver time", Abc_Clock() - clkTotal );
1919 int i, k, j, nVars[3] = {1 + 5*
p->nNodes, 0, 3*
p->nNodes*Vec_WrdSize(
p->vSimsIn)};
1921 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
1922 for ( k = 0; k < 2; k++ )
1923 for ( j = 1+!k; j < i-k; j++ )
1924 p->VarMarks[i][k][j] = nVars[0] + nVars[1]++;
1925 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
1926 for ( j =
p->nOuts == 1 ?
p->nDivs +
p->nNodes - 1 : 0; j < p->nDivs +
p->nNodes; j++ )
1927 p->VarMarks[i][0][j] = nVars[0] + nVars[1]++;
1929 printf(
"Variables: Function = %d. Structure = %d. Internal = %d. Total = %d.\n",
1930 nVars[0], nVars[1], nVars[2], nVars[0] + nVars[1] + nVars[2] );
1933 for ( j = 0; j < 2; j++ )
1936 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
1938 for ( k = 0; k < 2; k++ )
1939 printf(
"%3d ", j ? k : i );
1943 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
1945 printf(
"%3d ", j ? 0 : i );
1950 for ( j = 0; j < 5 +
p->nNodes*9 +
p->nOuts*5; j++ )
1953 for ( j =
p->nObjs - 2; j >= 0; j-- )
1955 if ( j > 0 && j <= p->nIns )
1956 printf(
" %c : ",
'a'+j-1 );
1958 printf(
"%2d : ", j );
1959 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
1961 for ( k = 0; k < 2; k++ )
1962 printf(
"%3d ",
p->VarMarks[i][k][j] );
1966 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
1968 printf(
"%3d ",
p->VarMarks[i][0][j] );
1974 return nVars[0] + nVars[1] + nVars[2];
1979 assert( Vec_WrdSize(vSimsIn) == Vec_WrdSize(vSimsOut) );
1980 p->vSimsIn = vSimsIn;
1981 p->vSimsOut = vSimsOut;
1982 p->fVerbose = fVerbose;
1987 p->nObjs =
p->nDivs +
p->nNodes +
p->nOuts;
2008static inline int Exa4_ManAddClause(
Exa4_Man_t *
p,
int * pLits,
int nLits )
2011 for ( i = 0; i < nLits; i++ )
2012 if ( pLits[i] == 1 )
2014 else if ( pLits[i] == 0 )
2016 else if ( pLits[i] <= 2*
p->nCnfVars )
2017 pLits[k++] = pLits[i];
2024 for ( i = 0; i < nLits; i++ )
2025 fprintf(
p->pFile,
"%s%d ", Abc_LitIsCompl(pLits[i]) ?
"-" :
"", Abc_Lit2Var(pLits[i]) );
2026 fprintf(
p->pFile,
"0\n" );
2030 for ( i = 0; i < nLits; i++ )
2031 fprintf( stdout,
"%s%d ", Abc_LitIsCompl(pLits[i]) ?
"-" :
"", Abc_Lit2Var(pLits[i]) );
2032 fprintf( stdout,
"\n" );
2036static inline int Exa4_ManAddClause4(
Exa4_Man_t *
p,
int Lit0,
int Lit1,
int Lit2,
int Lit3 )
2038 int pLits[4] = { Lit0, Lit1, Lit2, Lit3 };
2039 return Exa4_ManAddClause(
p, pLits, 4 );
2045 int pLits[2*
MAJ_NOBJS], i, j, k, n, m, nLits, Start, Stop;
2049 for ( j = 0; j < Start; j++ )
2050 if (
p->VarMarks[n][0][j] )
2051 Exa4_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[n][0][j], 1 ), 0, 0, 0 );
2052 for ( k = 0; k < 2; k++ )
2053 for ( j = Stop; j < n; j++ )
2054 if (
p->VarMarks[n][k][j] )
2055 Exa4_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[n][k][j], 1 ), 0, 0, 0 );
2058 assert( n ==
p->nDivs +
p->nNodes );
2059 Vec_IntFreeP( &vRes );
2061 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
2063 int iVarStart = 1 + 5*(i -
p->nDivs);
2064 for ( k = 0; k < 2; k++ )
2067 for ( j = 0; j <
p->nObjs; j++ )
2068 if (
p->VarMarks[i][k][j] )
2069 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 0 );
2071 Exa4_ManAddClause(
p, pLits, nLits );
2073 for ( n = 0; n < nLits; n++ )
2074 for ( m = n+1; m < nLits; m++ )
2075 Exa4_ManAddClause4(
p, Abc_LitNot(pLits[n]), Abc_LitNot(pLits[m]), 0, 0 );
2078 fprintf(
p->pFile,
"k %d ", nLits-1 );
2079 for ( n = 0; n < nLits; n++ )
2080 pLits[n] = Abc_LitNot(pLits[n]);
2081 Exa4_ManAddClause(
p, pLits, nLits );
2085 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][0][j] )
2086 for ( n = j; n <
p->nObjs; n++ )
if (
p->VarMarks[i][1][n] )
2087 Exa4_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[i][0][j], 1), Abc_Var2Lit(
p->VarMarks[i][1][n], 1), 0, 0 );
2090 for ( j =
p->nDivs; j < i; j++ )
2091 for ( n = 0; n <
p->nObjs; n++ )
if (
p->VarMarks[i][0][n] )
2092 for ( m = n+1; m <
p->nObjs; m++ )
if (
p->VarMarks[j][0][m] )
2093 Exa4_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[i][0][n], 1), Abc_Var2Lit(
p->VarMarks[j][0][m], 1), 0, 0 );
2094 for ( j =
p->nDivs; j < i; j++ )
2095 for ( k = 0; k < 2; k++ )
if (
p->VarMarks[i][k][j] )
2096 for ( n = 0; n <
p->nObjs; n++ )
if (
p->VarMarks[i][!k][n] )
2097 for ( m = 0; m < 2; m++ )
if (
p->VarMarks[j][m][n] )
2098 Exa4_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[i][k][j], 1), Abc_Var2Lit(
p->VarMarks[i][!k][n], 1), Abc_Var2Lit(
p->VarMarks[j][m][n], 1), 0 );
2102 for ( k = 0; k < 5-fOnlyAnd; k++ )
2103 pLits[nLits++] = Abc_Var2Lit( iVarStart+k, 0 );
2104 Exa4_ManAddClause(
p, pLits, nLits );
2105 for ( n = 0; n < nLits; n++ )
2106 for ( m = n+1; m < nLits; m++ )
2107 Exa4_ManAddClause4(
p, Abc_LitNot(pLits[n]), Abc_LitNot(pLits[m]), 0, 0 );
2111 for ( k = 0; k < 3; k++ )
2112 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart, k==1), Abc_Var2Lit(iVarStart+1, k==2), Abc_Var2Lit(iVarStart+2, k!=0), 0);
2114 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart, 1), Abc_Var2Lit(iVarStart+1, 1), Abc_Var2Lit(iVarStart+2, 0), 0);
2117 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
2120 for ( k = 0; k < 2; k++ )
2121 for ( j = i+1; j <
p->nObjs; j++ )
2122 if (
p->VarMarks[j][k][i] )
2123 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[j][k][i], 0 );
2124 Exa4_ManAddClause(
p, pLits, nLits );
2126 for ( n = 0; n < nLits; n++ )
2127 for ( m = n+1; m < nLits; m++ )
2128 Exa4_ManAddClause4(
p, Abc_LitNot(pLits[n]), Abc_LitNot(pLits[m]), 0, 0 );
2130 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
2133 for ( j = 0; j <
p->nDivs +
p->nNodes; j++ )
if (
p->VarMarks[i][0][j] )
2134 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][0][j], 0 );
2135 Exa4_ManAddClause(
p, pLits, nLits );
2136 for ( n = 0; n < nLits; n++ )
2137 for ( m = n+1; m < nLits; m++ )
2138 Exa4_ManAddClause4(
p, Abc_LitNot(pLits[n]), Abc_LitNot(pLits[m]), 0, 0 );
2144 int iNodeVar =
p->nCnfVars + 3*
p->nNodes*(iMint - Vec_WrdSize(
p->vSimsIn));
2145 int iOutMint = Abc_Tt6FirstBit( Vec_WrdEntry(
p->vSimsOut, iMint) );
2148 assert( iMint < Vec_WrdSize(
p->vSimsIn) );
2149 for ( i = 0; i <
p->nDivs; i++ )
2150 VarVals[i] = (Vec_WrdEntry(
p->vSimsIn, iMint) >> i) & 1;
2151 for ( i = 0; i <
p->nNodes; i++ )
2152 VarVals[
p->nDivs + i] = Abc_Var2Lit(iNodeVar + 3*i + 2, 0);
2153 for ( i = 0; i <
p->nOuts; i++ )
2154 VarVals[
p->nDivs +
p->nNodes + i] = (iOutMint >> i) & 1;
2157 printf(
"Adding minterm %d: ", iMint );
2158 for ( i = 0; i <
p->nObjs; i++ )
2159 printf(
" %d=%d", i, VarVals[i] );
2162 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
2164 int iVarStart = 1 + 5*(i -
p->nDivs);
2165 int iBaseVarI = iNodeVar + 3*(i -
p->nDivs);
2166 for ( k = 0; k < 2; k++ )
2167 for ( j = 0; j < i; j++ )
if (
p->VarMarks[i][k][j] )
2168 for ( n = 0; n < 2; n++ )
2169 Exa4_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[i][k][j], 1), Abc_Var2Lit(iBaseVarI + k, n), Abc_LitNotCond(VarVals[j], !n), 0);
2176 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 0, 1), Abc_Var2Lit(iBaseVarI + 0, 0), 0, Abc_Var2Lit(iBaseVarI + 2, 1) );
2177 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 0, 1), 0, Abc_Var2Lit(iBaseVarI + 1, 0), Abc_Var2Lit(iBaseVarI + 2, 1) );
2178 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 0, 1), Abc_Var2Lit(iBaseVarI + 0, 1), Abc_Var2Lit(iBaseVarI + 1, 1), Abc_Var2Lit(iBaseVarI + 2, 0) );
2180 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 1, 1), Abc_Var2Lit(iBaseVarI + 0, 1), 0, Abc_Var2Lit(iBaseVarI + 2, 1) );
2181 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 1, 1), 0, Abc_Var2Lit(iBaseVarI + 1, 0), Abc_Var2Lit(iBaseVarI + 2, 1) );
2182 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 1, 1), Abc_Var2Lit(iBaseVarI + 0, 0), Abc_Var2Lit(iBaseVarI + 1, 1), Abc_Var2Lit(iBaseVarI + 2, 0) );
2184 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 2, 1), Abc_Var2Lit(iBaseVarI + 0, 0), 0, Abc_Var2Lit(iBaseVarI + 2, 1) );
2185 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 2, 1), 0, Abc_Var2Lit(iBaseVarI + 1, 1), Abc_Var2Lit(iBaseVarI + 2, 1) );
2186 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 2, 1), Abc_Var2Lit(iBaseVarI + 0, 1), Abc_Var2Lit(iBaseVarI + 1, 0), Abc_Var2Lit(iBaseVarI + 2, 0) );
2191 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 3, 1), Abc_Var2Lit(iBaseVarI + 0, 1), 0, Abc_Var2Lit(iBaseVarI + 2, 0) );
2192 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 3, 1), 0, Abc_Var2Lit(iBaseVarI + 1, 1), Abc_Var2Lit(iBaseVarI + 2, 0) );
2193 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 3, 1), Abc_Var2Lit(iBaseVarI + 0, 0), Abc_Var2Lit(iBaseVarI + 1, 0), Abc_Var2Lit(iBaseVarI + 2, 1) );
2201 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 4, 1), Abc_Var2Lit(iBaseVarI + 0, 1), Abc_Var2Lit(iBaseVarI + 1, 1), Abc_Var2Lit(iBaseVarI + 2, 1) );
2202 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 4, 1), Abc_Var2Lit(iBaseVarI + 0, 1), Abc_Var2Lit(iBaseVarI + 1, 0), Abc_Var2Lit(iBaseVarI + 2, 0) );
2203 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 4, 1), Abc_Var2Lit(iBaseVarI + 0, 0), Abc_Var2Lit(iBaseVarI + 1, 1), Abc_Var2Lit(iBaseVarI + 2, 0) );
2204 Exa4_ManAddClause4(
p, Abc_Var2Lit(iVarStart + 4, 1), Abc_Var2Lit(iBaseVarI + 0, 0), Abc_Var2Lit(iBaseVarI + 1, 0), Abc_Var2Lit(iBaseVarI + 2, 1) );
2209 for ( k = 0; k < 4; k++ )
2210 for ( n = 0; n < 2; n++ )
2211 Exa4_ManAddClause4(
p, Abc_Var2Lit(iBaseVarI + 0, k&1), Abc_Var2Lit(iBaseVarI + 1, k>>1), Abc_Var2Lit(iBaseVarI + 2, !n), Abc_Var2Lit(k ? iVarStart + k-1 : 0, n));
2214 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
2216 for ( j = 0; j <
p->nDivs +
p->nNodes; j++ )
if (
p->VarMarks[i][0][j] )
2217 for ( n = 0; n < 2; n++ )
2218 Exa4_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[i][0][j], 1), Abc_LitNotCond(VarVals[j], n), Abc_LitNotCond(VarVals[i], !n), 0);
2225 p->pFile = fopen( pFileName,
"wb" );
2226 fputs(
"p cnf \n",
p->pFile );
2228 for ( m = 1; m < Vec_WrdSize(
p->vSimsIn); m++ )
2231 fprintf(
p->pFile,
"p %cnf %d %d", fCard ?
'k' :
'c',
p->nCnfVars,
p->nCnfClauses );
2248 int j, Count = 0, iVar = -1;
2249 for ( j = 0; j <
p->nObjs; j++ )
2250 if (
p->VarMarks[i][k][j] && Vec_IntEntry(vValues,
p->VarMarks[i][k][j]) )
2256 printf(
"Fanin count is %d instead of %d.\n", Count, 1 );
2260static inline void Exa4_ManPrintFanin(
Exa4_Man_t *
p,
int iNode,
int fComp )
2263 printf(
" %s", fComp ?
"const1" :
"const0" );
2264 else if ( iNode > 0 && iNode <= p->nIns )
2265 printf(
" %s%c", fComp ?
"~" :
"",
'a'+iNode-1 );
2266 else if ( iNode >
p->nIns && iNode < p->nDivs )
2267 printf(
" %s%c", fComp ?
"~" :
"",
'A'+iNode-
p->nIns-1 );
2269 printf(
" %s%d", fComp ?
"~" :
"", iNode );
2274 printf(
"Circuit for %d-var function with %d divisors contains %d two-input gates:\n",
p->nIns,
p->nDivs,
p->nNodes );
2275 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
2277 int iVar = Exa4_ManFindFanin(
p, vValues, i, 0 );
2278 printf(
"%2d = ", i );
2279 Exa4_ManPrintFanin(
p, iVar, 0 );
2282 for ( i =
p->nDivs +
p->nNodes - 1; i >=
p->nDivs; i-- )
2284 int iVarStart = 1 + 5*(i -
p->nDivs);
2287 int Val1 = Vec_IntEntry(vValues, iVarStart);
2288 int Val2 = Vec_IntEntry(vValues, iVarStart+1);
2289 int Val3 = Vec_IntEntry(vValues, iVarStart+2);
2290 int Val4 = Vec_IntEntry(vValues, iVarStart+3);
2292 printf(
"%2d = ", i );
2293 for ( k = 0; k < 2; k++ )
2295 int iNode = Exa4_ManFindFanin(
p, vValues, i, !k );
2296 int fComp = k ? Val1 | Val3 : Val2 | Val3;
2297 Exa4_ManPrintFanin(
p, iNode, fComp );
2299 printf(
" %c", (Val1 || Val2 || Val3) ?
'&' : (Val4 ?
'|' :
'^') );
2304 int Val1 = Vec_IntEntry(vValues, iVarStart);
2305 int Val2 = Vec_IntEntry(vValues, iVarStart+1);
2306 int Val3 = Vec_IntEntry(vValues, iVarStart+2);
2307 printf(
"%2d = ", i );
2308 for ( k = 0; k < 2; k++ )
2310 int iNode = Exa4_ManFindFanin(
p, vValues, i, !k );
2311 int fComp = k ? !Val1 && Val2 && !Val3 : Val1 && !Val2 && !Val3;
2312 Exa4_ManPrintFanin(
p, iNode, fComp );
2314 printf(
" %c", (Val1 && Val2) ? (Val3 ?
'|' :
'^') :
'&' );
2323 Mini_Aig_t * pMini = Mini_AigStartSupport(
p->nDivs-1,
p->nObjs );
2324 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
2326 int iNodes[2] = {0};
2327 int iVarStart = 1 + 5*(i -
p->nDivs);
2330 int Val1 = Vec_IntEntry(vValues, iVarStart);
2331 int Val2 = Vec_IntEntry(vValues, iVarStart+1);
2332 int Val3 = Vec_IntEntry(vValues, iVarStart+2);
2333 int Val4 = Vec_IntEntry(vValues, iVarStart+3);
2334 int Val5 = Vec_IntEntry(vValues, iVarStart+4);
2335 for ( k = 0; k < 2; k++ )
2337 int iNode = Exa4_ManFindFanin(
p, vValues, i, !k );
2338 int fComp = k ? Val1 | Val3 : Val2 | Val3;
2339 iNodes[k] = Abc_Var2Lit(iNode, fComp ^ Compl[iNode]);
2341 if ( Val1 || Val2 || Val3 )
2342 Mini_AigAnd( pMini, iNodes[0], iNodes[1] );
2346 Mini_AigOr( pMini, iNodes[0], iNodes[1] );
2348 Mini_AigXorSpecial( pMini, iNodes[0], iNodes[1] );
2354 int Val1 = Vec_IntEntry(vValues, iVarStart);
2355 int Val2 = Vec_IntEntry(vValues, iVarStart+1);
2356 int Val3 = Vec_IntEntry(vValues, iVarStart+2);
2357 Compl[i] = Val1 && Val2 && Val3;
2358 for ( k = 0; k < 2; k++ )
2360 int iNode = Exa4_ManFindFanin(
p, vValues, i, !k );
2361 int fComp = k ? !Val1 && Val2 && !Val3 : Val1 && !Val2 && !Val3;
2362 iNodes[k] = Abc_Var2Lit(iNode, fComp ^ Compl[iNode]);
2367 Mini_AigOr( pMini, iNodes[0], iNodes[1] );
2369 Mini_AigXorSpecial( pMini, iNodes[0], iNodes[1] );
2372 Mini_AigAnd( pMini, iNodes[0], iNodes[1] );
2375 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
2377 int iVar = Exa4_ManFindFanin(
p, vValues, i, 0 );
2378 Mini_AigCreatePo( pMini, Abc_Var2Lit(iVar, Compl[iVar]) );
2380 assert(
p->nObjs == Mini_AigNodeNum(pMini) );
2395Mini_Aig_t *
Exa4_ManGenTest(
Vec_Wrd_t * vSimsIn,
Vec_Wrd_t * vSimsOut,
int nIns,
int nDivs,
int nOuts,
int nNodes,
int TimeOut,
int fOnlyAnd,
int fFancy,
int fOrderNodes,
int fUniqFans,
int fVerbose,
int fCard,
char * pGuide )
2397 extern Vec_Int_t *
Gia_RunKadical(
char * pFileNameIn,
char * pFileNameOut,
int Seed,
int nBTLimit,
int TimeOut,
int fVerbose,
int * pStatus );
2399 abctime clkTotal = Abc_Clock();
2402 int Status = 0, Rand = ((((unsigned)rand()) << 12) ^ ((unsigned)rand())) & 0xFFFFF;
2403 char pFileNameIn[32];
sprintf( pFileNameIn,
"_%05x_.cnf", Rand );
2404 char pFileNameOut[32];
sprintf( pFileNameOut,
"_%05x_.out", Rand );
2407 Exa4_ManGenCnf(
p, pFileNameIn, fOnlyAnd, fFancy, fOrderNodes, fUniqFans, fCard, pGuide );
2409 printf(
"Timeout = %d. OnlyAnd = %d. Fancy = %d. OrderNodes = %d. UniqueFans = %d. Verbose = %d.\n", TimeOut, fOnlyAnd, fFancy, fOrderNodes, fUniqFans, fVerbose );
2411 printf(
"CNF with %d variables and %d clauses was dumped into file \"%s\".\n",
p->nCnfVars,
p->nCnfClauses, pFileNameIn );
2413 vValues =
Gia_RunKadical( pFileNameIn, pFileNameOut, 0, 0, TimeOut, fVerbose, &Status );
2415 vValues =
Exa4_ManSolve( pFileNameIn, pFileNameOut, TimeOut, fVerbose );
2420 Vec_IntFreeP( &vValues );
2422 unlink( pFileNameIn );
2423 Abc_PrintTime( 1,
"Total runtime", Abc_Clock() - clkTotal );
2430 Vec_Wrd_t * vSimsIn = Vec_WrdStart( 8 );
2431 Vec_Wrd_t * vSimsOut = Vec_WrdStart( 8 );
2432 int Truths[2] = { 0x96, 0xE8 };
2433 for ( m = 0; m < 8; m++ )
2436 for ( i = 0; i < 2; i++ )
2437 if ( (Truths[i] >> m) & 1 )
2439 Abc_TtSetBit( Vec_WrdEntryP(vSimsOut, m), iOutMint );
2440 for ( i = 0; i < 3; i++ )
2442 Abc_TtSetBit( Vec_WrdEntryP(vSimsIn, m), 1+i );
2444 pMini =
Exa4_ManGenTest( vSimsIn, vSimsOut, 3, 4, 2, pPars->nNodes, pPars->RuntimeLim, pPars->fOnlyAnd, pPars->fFewerVars, pPars->fOrderNodes, pPars->fUniqFans, pPars->fVerbose, 0, pPars->pGuide );
2445 if ( pMini ) Mini_AigStop( pMini );
2446 Vec_WrdFree( vSimsIn );
2447 Vec_WrdFree( vSimsOut );
2452 int i, m, nMints = 1 << pPars->nVars, fCompl = 0;
2453 Vec_Wrd_t * vSimsIn = Vec_WrdStart( nMints );
2454 Vec_Wrd_t * vSimsOut = Vec_WrdStart( nMints );
2455 word pTruth[16]; Abc_TtReadHex( pTruth, pPars->pTtStr );
2456 if ( pTruth[0] & 1 ) { fCompl = 1; Abc_TtNot( pTruth, Abc_TtWordNum(pPars->nVars) ); }
2457 assert( pPars->nVars <= 10 );
2458 for ( m = 0; m < nMints; m++ )
2460 Abc_TtSetBit( Vec_WrdEntryP(vSimsOut, m), Abc_TtGetBit(pTruth, m) );
2461 for ( i = 0; i < pPars->nVars; i++ )
2463 Abc_TtSetBit( Vec_WrdEntryP(vSimsIn, m), 1+i );
2465 assert( Vec_WrdSize(vSimsIn) == (1 << pPars->nVars) );
2466 pMini =
Exa4_ManGenTest( vSimsIn, vSimsOut, pPars->nVars, 1+pPars->nVars, 1, pPars->nNodes, pPars->RuntimeLim, pPars->fOnlyAnd, pPars->fFewerVars, pPars->fOrderNodes, pPars->fUniqFans, pPars->fVerbose, pPars->fCard, pPars->pGuide );
2467 if ( pMini ) Mini_AigStop( pMini );
2468 if ( fCompl ) printf(
"The resulting circuit, if computed, will be complemented.\n" );
2469 Vec_WrdFree( vSimsIn );
2470 Vec_WrdFree( vSimsOut );
2507 int i, j, k, nVars[3] = {1 + 3*
p->nNodes, 0,
p->nNodes*Vec_WrdSize(
p->vSimsIn)};
2509 Vec_IntFill(
p->vFans, 1 + 3*
p->nNodes, 0 );
2510 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
2511 for ( j = 2; j < i; j++ )
2513 p->VarMarks[i][j] = nVars[0] + nVars[1];
2514 Vec_IntPush(
p->vFans, 0 );
2515 for ( k = 1; k < j; k++ )
2516 Vec_IntPush(
p->vFans, (i << 16) | (j << 8) | k );
2519 assert( Vec_IntSize(
p->vFans) == nVars[0] + nVars[1] );
2520 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
2521 for ( j =
p->nOuts == 1 ?
p->nDivs +
p->nNodes - 1 : 0; j < p->nDivs +
p->nNodes; j++ )
2522 p->VarMarks[i][j] = nVars[0] + nVars[1]++;
2524 printf(
"Variables: Function = %d. Structure = %d. Internal = %d. Total = %d.\n",
2525 nVars[0], nVars[1], nVars[2], nVars[0] + nVars[1] + nVars[2] );
2530 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
2532 printf(
"%3d ", i );
2536 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
2538 printf(
"%3d ", i );
2543 for ( j = 0; j < 5 +
p->nNodes*5 +
p->nOuts*5; j++ )
2546 for ( j =
p->nObjs - 2; j >= 0; j-- )
2548 if ( j > 0 && j <= p->nIns )
2549 printf(
" %c : ",
'a'+j-1 );
2551 printf(
"%2d : ", j );
2552 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
2554 printf(
"%3d ",
p->VarMarks[i][j] );
2558 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
2560 printf(
"%3d ",
p->VarMarks[i][j] );
2566 return nVars[0] + nVars[1] + nVars[2];
2571 assert( Vec_WrdSize(vSimsIn) == Vec_WrdSize(vSimsOut) );
2572 p->vSimsIn = vSimsIn;
2573 p->vSimsOut = vSimsOut;
2574 p->fVerbose = fVerbose;
2579 p->nObjs =
p->nDivs +
p->nNodes +
p->nOuts;
2580 p->vFans = Vec_IntAlloc( 5000 );
2586 Vec_IntFree(
p->vFans );
2602static inline int Exa5_ManAddClause(
Exa5_Man_t *
p,
int * pLits,
int nLits )
2605 for ( i = 0; i < nLits; i++ )
2606 if ( pLits[i] == 1 )
2608 else if ( pLits[i] == 0 )
2610 else if ( pLits[i] <= 2*
p->nCnfVars )
2611 pLits[k++] = pLits[i];
2618 for ( i = 0; i < nLits; i++ )
2619 fprintf(
p->pFile,
"%s%d ", Abc_LitIsCompl(pLits[i]) ?
"-" :
"", Abc_Lit2Var(pLits[i]) );
2620 fprintf(
p->pFile,
"0\n" );
2624 for ( i = 0; i < nLits; i++ )
2625 fprintf( stdout,
"%s%d ", Abc_LitIsCompl(pLits[i]) ?
"-" :
"", Abc_Lit2Var(pLits[i]) );
2626 fprintf( stdout,
"\n" );
2630static inline int Exa5_ManAddClause4(
Exa5_Man_t *
p,
int Lit0,
int Lit1,
int Lit2,
int Lit3,
int Lit4 )
2632 int pLits[5] = { Lit0, Lit1, Lit2, Lit3, Lit4 };
2633 return Exa5_ManAddClause(
p, pLits, 5 );
2635static inline void Exa5_ManAddOneHot(
Exa5_Man_t *
p,
int * pLits,
int nLits )
2638 for ( n = 0; n < nLits; n++ )
2639 for ( m = n+1; m < nLits; m++ )
2640 Exa5_ManAddClause4(
p, Abc_LitNot(pLits[n]), Abc_LitNot(pLits[m]), 0, 0, 0 );
2642static inline void Exa5_ManAddGroup(
Exa5_Man_t *
p,
int iVar,
int nVars )
2646 pLits[0] = Abc_Var2Lit( iVar, 1 );
2647 for ( i = 1; i <= nVars; i++ )
2648 pLits[i] = Abc_Var2Lit( iVar+i, 0 );
2649 Exa5_ManAddClause(
p, pLits, nVars+1 );
2650 Exa5_ManAddOneHot(
p, pLits+1, nVars );
2651 for ( i = 1; i <= nVars; i++ )
2652 Exa5_ManAddClause4(
p, Abc_LitNot(pLits[0]), Abc_LitNot(pLits[i]), 0, 0, 0 );
2656 Vec_Int_t * vArray = Vec_IntAlloc( 100 );
2657 int pLits[
MAJ_NOBJS], i, j, k, n, m, nLits, iObj;
2658 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
2660 int iVarStart = 1 + 3*(i -
p->nDivs);
2662 for ( j = 0; j < i; j++ )
if (
p->VarMarks[i][j] )
2663 Exa5_ManAddGroup(
p,
p->VarMarks[i][j], j-1 ), pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][j], 0);
2664 Exa5_ManAddClause(
p, pLits, nLits );
2665 Exa5_ManAddOneHot(
p, pLits, nLits );
2667 for ( j =
p->nDivs; j < i; j++ )
2668 for ( n = 0; n <
p->nObjs; n++ )
if (
p->VarMarks[i][n] )
2669 for ( m = n+1; m <
p->nObjs; m++ )
if (
p->VarMarks[j][m] )
2670 Exa5_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[i][n], 1), Abc_Var2Lit(
p->VarMarks[j][m], 1), 0, 0, 0 );
2671 for ( j =
p->nDivs; j < i; j++ )
if (
p->VarMarks[i][j] )
2674 for ( n = 1; n < j; n++ )
2676 int iVar =
p->VarMarks[i][j] + n;
2677 int iObj = Vec_IntEntry(
p->vFans, iVar );
2678 int iNode0 = (iObj >> 0) & 0xFF;
2679 int iNode1 = (iObj >> 8) & 0xFF;
2680 int iNode2 = (iObj >> 16) & 0xFF;
2685 assert(
p->VarMarks[j][2] > 0 );
2686 assert(
p->VarMarks[j+1][2] > 0 );
2687 for ( m =
p->VarMarks[j][2]+1; m < p->VarMarks[j+1][2]; m++ )
2689 int jObj = Vec_IntEntry(
p->vFans, m );
2690 int jNode0 = (jObj >> 0) & 0xFF;
2691 int jNode1 = (jObj >> 8) & 0xFF;
2692 int jNode2 = (jObj >> 16) & 0xFF;
2696 if ( iNode0 == jNode0 || iNode0 == jNode1 )
2697 Exa5_ManAddClause4(
p, Abc_Var2Lit(iVar, 1), Abc_Var2Lit(m, 1), 0, 0, 0 );
2701 for ( k = 0; k < 3; k++ )
2702 Exa5_ManAddClause4(
p, Abc_Var2Lit(iVarStart, k==1), Abc_Var2Lit(iVarStart+1, k==2), Abc_Var2Lit(iVarStart+2, k!=0), 0, 0);
2704 Exa5_ManAddClause4(
p, Abc_Var2Lit(iVarStart, 1), Abc_Var2Lit(iVarStart+1, 1), Abc_Var2Lit(iVarStart+2, 0), 0, 0);
2706 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
2708 Vec_IntClear( vArray );
2710 if ( iObj && ((iObj & 0xFF) == i || ((iObj >> 8) & 0xFF) == i) )
2711 Vec_IntPush( vArray, Abc_Var2Lit(k, 0) );
2712 for ( k =
p->nDivs +
p->nNodes; k < p->nObjs; k++ )
if (
p->VarMarks[k][i] )
2713 Vec_IntPush( vArray, Abc_Var2Lit(
p->VarMarks[k][i], 0) );
2714 Exa5_ManAddClause(
p, Vec_IntArray(vArray), Vec_IntSize(vArray) );
2716 Exa5_ManAddOneHot(
p, Vec_IntArray(vArray), Vec_IntSize(vArray) );
2718 Vec_IntFree( vArray );
2719 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
2722 for ( j = 0; j <
p->nDivs +
p->nNodes; j++ )
if (
p->VarMarks[i][j] )
2723 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][j], 0 );
2724 Exa5_ManAddClause(
p, pLits, nLits );
2725 Exa5_ManAddOneHot(
p, pLits, nLits );
2731 int iNodeVar =
p->nCnfVars +
p->nNodes*(iMint - Vec_WrdSize(
p->vSimsIn));
2732 int iOutMint = Abc_Tt6FirstBit( Vec_WrdEntry(
p->vSimsOut, iMint) );
2733 int i, k, n, j, VarVals[
MAJ_NOBJS], iNodes[3], iVarStart, iObj;
2735 assert( iMint < Vec_WrdSize(
p->vSimsIn) );
2736 for ( i = 0; i <
p->nDivs; i++ )
2737 VarVals[i] = (Vec_WrdEntry(
p->vSimsIn, iMint) >> i) & 1;
2738 for ( i = 0; i <
p->nNodes; i++ )
2739 VarVals[
p->nDivs + i] = Abc_Var2Lit(iNodeVar + i, 0);
2740 for ( i = 0; i <
p->nOuts; i++ )
2741 VarVals[
p->nDivs +
p->nNodes + i] = (iOutMint >> i) & 1;
2744 printf(
"Adding minterm %d: ", iMint );
2745 for ( i = 0; i <
p->nObjs; i++ )
2746 printf(
" %d=%d", i, VarVals[i] );
2751 if ( iObj == 0 )
continue;
2752 iNodes[1] = (iObj >> 0) & 0xFF;
2753 iNodes[0] = (iObj >> 8) & 0xFF;
2754 iNodes[2] = (iObj >> 16) & 0xFF;
2755 iVarStart = 1 + 3*(iNodes[2] -
p->nDivs);
2756 for ( k = 0; k < 4; k++ )
2757 for ( n = 0; n < 2; n++ )
2758 Exa5_ManAddClause4(
p, Abc_Var2Lit(i, 1), Abc_LitNotCond(VarVals[iNodes[0]], k&1), Abc_LitNotCond(VarVals[iNodes[1]], k>>1), Abc_LitNotCond(VarVals[iNodes[2]], !n), Abc_Var2Lit(k ? iVarStart + k-1 : 0, n));
2760 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
2762 for ( j = 0; j <
p->nDivs +
p->nNodes; j++ )
if (
p->VarMarks[i][j] )
2763 for ( n = 0; n < 2; n++ )
2764 Exa5_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[i][j], 1), Abc_LitNotCond(VarVals[j], n), Abc_LitNotCond(VarVals[i], !n), 0, 0);
2771 p->pFile = fopen( pFileName,
"wb" );
2772 fputs(
"p cnf \n",
p->pFile );
2774 for ( m = 1; m < Vec_WrdSize(
p->vSimsIn); m++ )
2777 fprintf(
p->pFile,
"p cnf %d %d",
p->nCnfVars,
p->nCnfClauses );
2794 int j, Count = 0, iVar = -1;
2795 for ( j = 0; j <
p->nObjs; j++ )
2796 if (
p->VarMarks[i][j] && Vec_IntEntry(vValues,
p->VarMarks[i][j]) )
2804static inline void Exa5_ManPrintFanin(
Exa5_Man_t *
p,
int iNode,
int fComp )
2807 printf(
" %s", fComp ?
"const1" :
"const0" );
2808 else if ( iNode > 0 && iNode <= p->nIns )
2809 printf(
" %s%c", fComp ?
"~" :
"",
'a'+iNode-1 );
2810 else if ( iNode >
p->nIns && iNode < p->nDivs )
2811 printf(
" %s%c", fComp ?
"~" :
"",
'A'+iNode-
p->nIns-1 );
2813 printf(
" %s%d", fComp ?
"~" :
"", iNode );
2820 int i, k, iObj, iNodes[3];
2821 printf(
"Circuit for %d-var function with %d divisors contains %d two-input gates:\n",
p->nIns,
p->nDivs,
p->nNodes );
2824 if ( iObj == 0 || Vec_IntEntry(vValues, i) == 0 )
2826 iNodes[0] = (iObj >> 0) & 0xFF;
2827 iNodes[1] = (iObj >> 8) & 0xFF;
2828 iNodes[2] = (iObj >> 16) & 0xFF;
2829 assert(
p->nDivs <= iNodes[2] && iNodes[2] <
p->nDivs +
p->nNodes );
2830 Fan0[iNodes[2]] = iNodes[0];
2831 Fan1[iNodes[2]] = iNodes[1];
2834 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
2836 int iVar = Exa5_ManFindFanin(
p, vValues, i );
2837 printf(
"%2d = ", i );
2838 Exa5_ManPrintFanin(
p, iVar, 0 );
2841 for ( i =
p->nDivs +
p->nNodes - 1; i >=
p->nDivs; i-- )
2843 int iVarStart = 1 + 3*(i -
p->nDivs);
2844 int Val1 = Vec_IntEntry(vValues, iVarStart);
2845 int Val2 = Vec_IntEntry(vValues, iVarStart+1);
2846 int Val3 = Vec_IntEntry(vValues, iVarStart+2);
2848 printf(
"%2d = ", i );
2849 for ( k = 0; k < 2; k++ )
2851 int iNode = k ? Fan1[i] : Fan0[i];
2852 int fComp = k ? !Val1 && Val2 && !Val3 : Val1 && !Val2 && !Val3;
2853 Exa5_ManPrintFanin(
p, iNode, fComp );
2855 printf(
" %c", (Val1 && Val2) ? (Val3 ?
'|' :
'^') :
'&' );
2862 Mini_Aig_t * pMini = Mini_AigStartSupport(
p->nDivs-1,
p->nObjs );
2867 int i, k, iObj, iNodes[3];
2870 if ( iObj == 0 || Vec_IntEntry(vValues, i) == 0 )
2872 iNodes[0] = (iObj >> 0) & 0xFF;
2873 iNodes[1] = (iObj >> 8) & 0xFF;
2874 iNodes[2] = (iObj >> 16) & 0xFF;
2875 assert(
p->nDivs <= iNodes[2] && iNodes[2] <
p->nDivs +
p->nNodes );
2876 Fan0[iNodes[2]] = iNodes[0];
2877 Fan1[iNodes[2]] = iNodes[1];
2880 assert(
p->nDivs == Mini_AigNodeNum(pMini) );
2881 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
2883 int iNodes[2] = {0};
2884 int iVarStart = 1 + 3*(i -
p->nDivs);
2885 int Val1 = Vec_IntEntry(vValues, iVarStart);
2886 int Val2 = Vec_IntEntry(vValues, iVarStart+1);
2887 int Val3 = Vec_IntEntry(vValues, iVarStart+2);
2889 Compl[i] = Val1 && Val2 && Val3;
2890 for ( k = 0; k < 2; k++ )
2892 int iNode = k ? Fan1[i] : Fan0[i];
2893 int fComp = k ? !Val1 && Val2 && !Val3 : Val1 && !Val2 && !Val3;
2894 iNodes[k] = Abc_Var2Lit(iNode, fComp ^ Compl[iNode]);
2899 Mini_AigOr( pMini, iNodes[0], iNodes[1] );
2901 Mini_AigXorSpecial( pMini, iNodes[0], iNodes[1] );
2904 Mini_AigAnd( pMini, iNodes[0], iNodes[1] );
2906 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
2908 int iVar = Exa5_ManFindFanin(
p, vValues, i );
2909 Mini_AigCreatePo( pMini, Abc_Var2Lit(iVar, Compl[iVar]) );
2911 assert(
p->nObjs == Mini_AigNodeNum(pMini) );
2926Mini_Aig_t *
Exa5_ManGenTest(
Vec_Wrd_t * vSimsIn,
Vec_Wrd_t * vSimsOut,
int nIns,
int nDivs,
int nOuts,
int nNodes,
int TimeOut,
int fOnlyAnd,
int fFancy,
int fOrderNodes,
int fUniqFans,
int fVerbose )
2928 abctime clkTotal = Abc_Clock();
2932 int Rand = ((((unsigned)rand()) << 12) ^ ((unsigned)rand())) & 0xFFFFF;
2933 char pFileNameIn[32];
sprintf( pFileNameIn,
"_%05x_.cnf", Rand );
2934 char pFileNameOut[32];
sprintf( pFileNameOut,
"_%05x_.out", Rand );
2937 Exa5_ManGenCnf(
p, pFileNameIn, fOnlyAnd, fFancy, fOrderNodes, fUniqFans );
2939 printf(
"Timeout = %d. OnlyAnd = %d. Fancy = %d. OrderNodes = %d. UniqueFans = %d. Verbose = %d.\n", TimeOut, fOnlyAnd, fFancy, fOrderNodes, fUniqFans, fVerbose );
2941 printf(
"CNF with %d variables and %d clauses was dumped into file \"%s\".\n",
p->nCnfVars,
p->nCnfClauses, pFileNameIn );
2942 vValues =
Exa4_ManSolve( pFileNameIn, pFileNameOut, TimeOut, fVerbose );
2947 Vec_IntFreeP( &vValues );
2949 unlink( pFileNameIn );
2950 Abc_PrintTime( 1,
"Total runtime", Abc_Clock() - clkTotal );
2956 int i, m, nMints = 1 << pPars->nVars, fCompl = 0;
2957 Vec_Wrd_t * vSimsIn = Vec_WrdStart( nMints );
2958 Vec_Wrd_t * vSimsOut = Vec_WrdStart( nMints );
2959 word pTruth[16]; Abc_TtReadHex( pTruth, pPars->pTtStr );
2960 if ( pTruth[0] & 1 ) { fCompl = 1; Abc_TtNot( pTruth, Abc_TtWordNum(pPars->nVars) ); }
2961 assert( pPars->nVars <= 10 );
2962 for ( m = 0; m < nMints; m++ )
2964 Abc_TtSetBit( Vec_WrdEntryP(vSimsOut, m), Abc_TtGetBit(pTruth, m) );
2965 for ( i = 0; i < pPars->nVars; i++ )
2967 Abc_TtSetBit( Vec_WrdEntryP(vSimsIn, m), 1+i );
2969 assert( Vec_WrdSize(vSimsIn) == (1 << pPars->nVars) );
2970 pMini =
Exa5_ManGenTest( vSimsIn, vSimsOut, pPars->nVars, 1+pPars->nVars, 1, pPars->nNodes, pPars->RuntimeLim, pPars->fOnlyAnd, pPars->fFewerVars, pPars->fOrderNodes, pPars->fUniqFans, pPars->fVerbose );
2971 if ( pMini ) Mini_AigStop( pMini );
2972 if ( fCompl ) printf(
"The resulting circuit, if computed, will be complemented.\n" );
2973 Vec_WrdFree( vSimsIn );
2974 Vec_WrdFree( vSimsOut );
2991 fprintf( pFile,
" { " );
2993 fprintf( pFile,
"%2d,%2d, ", Mini_AigNodeFanin0(
p, i), Mini_AigNodeFanin1(
p, i) ), Count++;
2995 fprintf( pFile,
"%2d,%2d", Mini_AigNodeFanin0(
p, i), Mini_AigNodeFanin0(
p, i) ), Count++;
2996 for ( i = Count; i < 8; i++ )
2997 fprintf( pFile,
", %2d,%2d", 0, 0 );
2998 fprintf( pFile,
" }" );
3002 word Res = 0;
int i, k = 0;
3005 int iLit0 = Mini_AigNodeFanin0(
p, i);
3006 int iLit1 = Mini_AigNodeFanin1(
p, i);
3010 assert( (iLit1 & 0xF) != (iLit0 & 0xF) );
3011 Pair = ((iLit1 & 0xF) << 4) | (iLit0 & 0xF);
3012 Res |= (
word)Pair << (k*8);
3016 assert( (iLit1 & 0x1F) != (iLit0 & 0x1F) );
3017 Pair = ((iLit1 & 0x1F) << 5) | (iLit0 & 0x1F);
3018 Res |= (
word)Pair << (32 + (k-4)*10);
3023 if ( Mini_AigNodeFanin0(
p, i) & 1 )
3024 Res |= (
word)1 << 62;
3029 unsigned First = (unsigned)Res;
3030 unsigned Second = (unsigned)(Res >> 32);
3031 word Fun0, Fun1, Nodes[16] = {0};
int i, k = 5;
3032 for ( i = 0; i < 4; i++ )
3033 Nodes[i+1] = s_Truths6[i];
3034 for ( i = 0; i < 4; i++ )
3036 int Lit0, Lit1, Pair = (First >> (i*8)) & 0xFF;
3042 Fun0 = (Lit0 & 1) ? ~Nodes[Lit0 >> 1] : Nodes[Lit0 >> 1];
3043 Fun1 = (Lit1 & 1) ? ~Nodes[Lit1 >> 1] : Nodes[Lit1 >> 1];
3044 Nodes[k++] = Lit0 < Lit1 ? Fun0 & Fun1 : Fun0 ^ Fun1;
3046 for ( i = 0; i < 3; i++ )
3048 int Lit0, Lit1, Pair = (Second >> (i*10)) & 0x3FF;
3054 Fun0 = (Lit0 & 1) ? ~Nodes[Lit0 >> 1] : Nodes[Lit0 >> 1];
3055 Fun1 = (Lit1 & 1) ? ~Nodes[Lit1 >> 1] : Nodes[Lit1 >> 1];
3056 Nodes[k++] = Lit0 < Lit1 ? Fun0 & Fun1 : Fun0 ^ Fun1;
3058 return (Res >> 62) ? ~Nodes[k-1] : Nodes[k-1];
3063 int i, m, nMints = 16, fCompl = 0;
3064 Vec_Wrd_t * vSimsIn = Vec_WrdStart( nMints );
3065 Vec_Wrd_t * vSimsOut = Vec_WrdStart( nMints );
3066 word pTruth[16] = { Abc_Tt6Stretch((
word)Truth, 4) };
3067 if ( pTruth[0] & 1 ) { fCompl = 1; Abc_TtNot( pTruth, 1 ); }
3068 for ( m = 0; m < nMints; m++ )
3070 Abc_TtSetBit( Vec_WrdEntryP(vSimsOut, m), Abc_TtGetBit(pTruth, m) );
3071 for ( i = 0; i < 4; i++ )
3073 Abc_TtSetBit( Vec_WrdEntryP(vSimsIn, m), 1+i );
3075 assert( Vec_WrdSize(vSimsIn) == 16 );
3076 pMini =
Exa5_ManGenTest( vSimsIn, vSimsOut, 4, 5, 1, nNodes, 0, 0, 0, 0, 0, 0 );
3077 if ( pMini && fCompl ) Mini_AigFlipLastPo( pMini );
3078 Vec_WrdFree( vSimsIn );
3079 Vec_WrdFree( vSimsOut );
3090 if ( uTruth == Truth )
3091 printf(
"Check ok.\n" );
3093 printf(
"Check NOT ok!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" );
3094 Mini_AigStop( pMini );
3101 int i, k, nFuncs = 1 << 15;
3102 Vec_Wrd_t * vRes = Vec_WrdAlloc( nFuncs );
3103 Vec_WrdPush( vRes, 0 );
3104 for ( i = 1; i < nFuncs; i++ )
3107 printf(
"\nFunction %d:\n", i );
3108 for ( k = 1; k < 8; k++ )
3112 Vec_WrdPush( vRes, Res );
3114 Vec_WrdDumpBin(
"minxaig4.data", vRes, 1 );
3115 Vec_WrdFree( vRes );
3132 word * pSims = Vec_WrdArray( vSimsDiv );
3133 word * pOuts = Vec_WrdArray( vSimsOut ), temp;
3134 int i, j, best_i, nSize = Vec_WrdSize(vSimsDiv);
3135 assert( Vec_WrdSize(vSimsOut) == nSize );
3136 for ( i = 0; i < nSize-1; i++ )
3139 for ( j = i+1; j < nSize; j++ )
3140 if ( pSims[j] < pSims[best_i] )
3145 pSims[i] = pSims[best_i];
3146 pSims[best_i] = temp;
3148 pOuts[i] = pOuts[best_i];
3149 pOuts[best_i] = temp;
3166 int nIns = 0, nDivs = 0, nOuts = 0, nPats = 0, iLine = 0;
3167 int iIns = 0, iDivs = 0, iOuts = 0, Value, i;
3169 FILE * pFile = fopen( pFileName,
"rb" );
3170 if ( pFile == NULL )
3172 Abc_Print( -1,
"Cannot open file \"%s\".\n", pFileName );
3175 while ( fgets( pBuffer, 1000, pFile ) != NULL )
3177 if ( pBuffer[0] ==
'c' )
3181 char * pLine = pBuffer;
3182 while ( (*pLine >=
'a' && *pLine <=
'z') || (*pLine >=
'A' && *pLine <=
'Z') )
3184 Value = sscanf( pLine,
"%d %d %d %d", &nIns, &nDivs, &nOuts, &nPats );
3187 Abc_Print( -1,
"Cannot read the parameter line in file \"%s\".\n", pFileName );
3191 if ( nIns + nDivs >= 64 )
3193 printf(
"The number of variables and divisors should not exceed 64.\n" );
3198 printf(
"The number of outputs should not exceed 6.\n" );
3201 if ( nPats >= 1000 )
3203 printf(
"The number of patterns should not exceed 1000.\n" );
3206 assert( nIns + nDivs < 64 && nOuts <= 6 && (nIns == 0 || nPats <= (1 << nIns)) && nPats < 1000 );
3207 *pvSimsDiv = Vec_WrdStart( nPats );
3208 *pvSimsOut = Vec_WrdStart( nPats );
3211 if ( pBuffer[0] ==
'\n' || pBuffer[0] ==
'\r' || pBuffer[0] ==
' ' )
3213 for ( i = 0; i < nPats; i++ )
3215 if ( pBuffer[i] ==
'0' )
3217 assert( pBuffer[i] ==
'1' );
3219 Abc_TtSetBit( Vec_WrdEntryP(*pvSimsDiv, nPats-1-i), 1+iIns );
3220 else if ( iDivs < nDivs )
3221 Abc_TtSetBit( Vec_WrdEntryP(*pvSimsDiv, nPats-1-i), 1+nIns+iDivs );
3222 else if ( iOuts < (1 << nOuts) )
3223 Abc_TtSetBit( Vec_WrdEntryP(*pvSimsOut, nPats-1-i), iOuts );
3225 assert( pBuffer[nPats] !=
'0' && pBuffer[nPats] !=
'1' );
3228 else if ( iDivs < nDivs )
3230 else if ( iOuts < (1 << nOuts) )
3233 printf(
"Finished reading file \"%s\" with %d inputs, %d divisors, %d outputs, and %d patterns.\n", pFileName, nIns, nDivs, nOuts, nPats );
3235 assert( iIns == nIns && iDivs == nDivs && iOuts == (1 << nOuts) );
3244 int i, o, m, nMintsI = 1 << nVars, nMintsO = 1 << nTruths;
3245 FILE * pFile = fopen( pFileName,
"wb" );
3246 fprintf( pFile,
"%d %d %d %d\n", nVars, 0, nTruths, nMintsI );
3247 fprintf( pFile,
"\n" );
3248 for ( i = 0; i < nVars; i++, fprintf( pFile,
"\n" ) )
3249 for ( m = nMintsI - 1; m >= 0; m-- )
3250 fprintf( pFile,
"%d", (m >> i) & 1 );
3251 fprintf( pFile,
"\n" );
3252 for ( o = 0; o < nMintsO; o++, fprintf( pFile,
"\n" ) )
3253 for ( m = nMintsI - 1; m >= 0; m-- )
3256 for ( i = 0; i < nTruths; i++ )
3257 if ( Abc_TtGetBit(pTruths+i, m) )
3258 oMint |= (
word)1 << i;
3259 fprintf( pFile,
"%d", oMint == o );
3265 int i, o, m, nMintsO = 1 << nOuts;
3266 FILE * pFile = fopen( pFileName,
"wb" );
3267 assert( Vec_WrdSize(vSimsDiv) == Vec_WrdSize(vSimsOut) );
3268 fprintf( pFile,
"%d %d %d %d\n", nVars, nDivs, nOuts, Vec_WrdSize(vSimsOut) );
3269 fprintf( pFile,
"\n" );
3270 for ( i = 0; i < nVars+nDivs; i++, fprintf( pFile,
"\n%s", (i == nVars && nDivs) ?
"\n":
"" ) )
3271 for ( m = Vec_WrdSize(vSimsOut) - 1; m >= 0; m-- )
3272 fprintf( pFile,
"%d", Abc_TtGetBit(Vec_WrdEntryP(vSimsDiv, m), 1+i) );
3273 fprintf( pFile,
"\n" );
3274 for ( o = 0; o < nMintsO; o++, fprintf( pFile,
"\n" ) )
3275 for ( m = Vec_WrdSize(vSimsOut) - 1; m >= 0; m-- )
3276 fprintf( pFile,
"%d", Abc_TtGetBit(Vec_WrdEntryP(vSimsOut, m), o) );
3282 assert( nVars >= 3 && nVars <= 7 );
3283 for ( k = 0; k < 3; k++ )
3285 for ( i = 0; i < (1 << nVars); i++ )
3287 int n = Abc_TtCountOnes( (
word)i );
3288 for ( k = 0; k < 3; k++ )
3290 Abc_TtSetBit( pTruths+k, i );
3297 assert( nVars >= 2 && nVars <= 3 );
3298 for ( k = 0; k < 2*nVars; k++ )
3300 for ( i = 0; i < (1 << nVars); i++ )
3301 for ( j = 0; j < (1 << nVars); j++ )
3304 for ( k = 0; k < 2*nVars; k++ )
3306 Abc_TtSetBit( pTruths+k, (i << nVars) | j );
3323 Vec_Wrd_t * vSimsDiv = NULL, * vSimsOut = NULL;
3324 word Entry, Truths[100] = { 0x96, 0xE8 };
3327 int i, nVars = 4, nOuts = 4, nDivs2, nOuts2;
3332 nVars =
Exa6_ReadFile( pFileName, &vSimsDiv, &vSimsOut, &nDivs2, &nOuts2 );
3335 Abc_TtPrintBits( &Entry, 1 + nVars );
3338 Abc_TtPrintBits( &Entry, 1 << nOuts );
3341 Vec_WrdFree( vSimsDiv );
3342 Vec_WrdFree( vSimsOut );
3363 assert( Gia_ObjIsAnd(pObj) );
3366 return pObj->
Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3372 Vec_Int_t * vCopies = Vec_IntStartFull( Mini_AigNodeNum(pMini) );
3374 Vec_IntWriteEntry( vCopies, 0, 0 );
3375 assert( Mini_AigPiNum(pMini) == Vec_IntSize(vIns)+Vec_IntSize(vDivs) );
3376 assert( Mini_AigPoNum(pMini) == Vec_IntSize(vOuts) );
3379 pNew->
pName = Abc_UtilStrsav(
p->pName );
3380 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
3381 Gia_ManConst0(
p)->Value = 0;
3383 pObj->
Value = Gia_ManAppendCi(pNew);
3390 int iFaninLit0 = Mini_AigNodeFanin0( pMini, k );
3391 int iFaninLit1 = Mini_AigNodeFanin1( pMini, k );
3392 int iLit0 = Vec_IntEntry(vCopies, Mini_AigLit2Var(iFaninLit0)) ^ Mini_AigLitIsCompl(iFaninLit0);
3393 int iLit1 = Vec_IntEntry(vCopies, Mini_AigLit2Var(iFaninLit1)) ^ Mini_AigLitIsCompl(iFaninLit1);
3394 if ( iFaninLit0 < iFaninLit1 )
3395 Vec_IntWriteEntry( vCopies, k, Gia_ManAppendAnd(pNew, iLit0, iLit1) );
3397 Vec_IntWriteEntry( vCopies, k, Gia_ManAppendXorReal(pNew, iLit0, iLit1) );
3402 int iFaninLit0 = Mini_AigNodeFanin0( pMini, k );
3403 int iLit0 = Vec_IntEntry(vCopies, Mini_AigLit2Var(iFaninLit0)) ^ Mini_AigLitIsCompl(iFaninLit0);
3404 Gia_ManObj(
p, Vec_IntEntry(vOuts, i++) )->Value = iLit0;
3409 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3411 Vec_IntFree( vCopies );
3451 int i, k, j, nVars[3] = {1 + 3*
p->nNodes, 0, 3*
p->nNodes*Vec_WrdSize(
p->vSimsIn)};
3453 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
3454 for ( k = 0; k < 2; k++ )
3455 for ( j = 1+!k; j < i-k; j++ )
3456 p->VarMarks[i][k][j] = nVars[0] + nVars[1]++;
3457 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
3458 for ( j = 0; j <
p->nDivs +
p->nNodes; j++ )
3459 p->VarMarks[i][0][j] = nVars[0] + nVars[1]++;
3461 printf(
"Variables: Function = %d. Structure = %d. Internal = %d. Total = %d.\n",
3462 nVars[0], nVars[1], nVars[2], nVars[0] + nVars[1] + nVars[2] );
3465 for ( j = 0; j < 2; j++ )
3468 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
3470 for ( k = 0; k < 2; k++ )
3471 printf(
"%3d ", j ? k : i );
3475 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
3477 printf(
"%3d ", j ? 0 : i );
3482 for ( j = 0; j < 5 +
p->nNodes*9 +
p->nOuts*5; j++ )
3485 for ( j =
p->nObjs - 2; j >= 0; j-- )
3487 if ( j > 0 && j <= p->nIns )
3488 printf(
" %c : ",
'a'+j-1 );
3489 else if ( j >
p->nIns && j < p->nDivs )
3490 printf(
" %c : ",
'A'+j-1-
p->nIns );
3492 printf(
"%2d : ", j );
3493 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
3495 for ( k = 0; k < 2; k++ )
3496 printf(
"%3d ",
p->VarMarks[i][k][j] );
3500 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
3502 printf(
"%3d ",
p->VarMarks[i][0][j] );
3508 return nVars[0] + nVars[1] + nVars[2];
3513 assert( Vec_WrdSize(vSimsIn) == Vec_WrdSize(vSimsOut) );
3514 p->vSimsIn = vSimsIn;
3515 p->vSimsOut = vSimsOut;
3516 p->fVerbose = fVerbose;
3521 p->nObjs =
p->nDivs +
p->nNodes +
p->nOuts;
3544static inline int Exa6_ManAddClause(
Exa6_Man_t *
p,
int * pLits,
int nLits )
3547 for ( i = 0; i < nLits; i++ )
3548 if ( pLits[i] == 1 )
3550 else if ( pLits[i] == 0 )
3552 else if ( pLits[i] <= 2*(
p->nCnfVars +
p->nCnfVars2) )
3553 pLits[k++] = pLits[i];
3560 for ( i = 0; i < nLits; i++ )
3561 fprintf(
p->pFile,
"%s%d ", Abc_LitIsCompl(pLits[i]) ?
"-" :
"", Abc_Lit2Var(pLits[i]) );
3562 fprintf(
p->pFile,
"0\n" );
3566 for ( i = 0; i < nLits; i++ )
3567 fprintf( stdout,
"%s%d ", Abc_LitIsCompl(pLits[i]) ?
"-" :
"", Abc_Lit2Var(pLits[i]) );
3568 fprintf( stdout,
"\n" );
3572static inline int Exa6_ManAddClause4(
Exa6_Man_t *
p,
int Lit0,
int Lit1,
int Lit2,
int Lit3 )
3574 int pLits[4] = { Lit0, Lit1, Lit2, Lit3 };
3575 return Exa6_ManAddClause(
p, pLits, 4 );
3579 int pLits[2*
MAJ_NOBJS], i, j, k, n, m, nLits;
3580 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
3582 int iVarStart = 1 + 3*(i -
p->nDivs);
3583 for ( k = 0; k < 2; k++ )
3586 for ( j = 0; j <
p->nObjs; j++ )
3587 if (
p->VarMarks[i][k][j] )
3588 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][k][j], 0 );
3590 Exa6_ManAddClause(
p, pLits, nLits );
3591 for ( n = 0; n < nLits; n++ )
3592 for ( m = n+1; m < nLits; m++ )
3593 Exa6_ManAddClause4(
p, Abc_LitNot(pLits[n]), Abc_LitNot(pLits[m]), 0, 0 );
3596 for ( j = 0; j <
p->nObjs; j++ )
if (
p->VarMarks[i][0][j] )
3597 for ( n = j; n <
p->nObjs; n++ )
if (
p->VarMarks[i][1][n] )
3598 Exa6_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[i][0][j], 1), Abc_Var2Lit(
p->VarMarks[i][1][n], 1), 0, 0 );
3601 for ( j =
p->nDivs; j < i; j++ )
3602 for ( n = 0; n <
p->nObjs; n++ )
if (
p->VarMarks[i][0][n] )
3603 for ( m = n+1; m <
p->nObjs; m++ )
if (
p->VarMarks[j][0][m] )
3604 Exa6_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[i][0][n], 1), Abc_Var2Lit(
p->VarMarks[j][0][m], 1), 0, 0 );
3605 for ( j =
p->nDivs; j < i; j++ )
3606 for ( k = 0; k < 2; k++ )
if (
p->VarMarks[i][k][j] )
3607 for ( n = 0; n <
p->nObjs; n++ )
if (
p->VarMarks[i][!k][n] )
3608 for ( m = 0; m < 2; m++ )
if (
p->VarMarks[j][m][n] )
3609 Exa6_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[i][k][j], 1), Abc_Var2Lit(
p->VarMarks[i][!k][n], 1), Abc_Var2Lit(
p->VarMarks[j][m][n], 1), 0 );
3613 for ( k = 0; k < 5-fOnlyAnd; k++ )
3614 pLits[nLits++] = Abc_Var2Lit( iVarStart+k, 0 );
3615 Exa6_ManAddClause(
p, pLits, nLits );
3616 for ( n = 0; n < nLits; n++ )
3617 for ( m = n+1; m < nLits; m++ )
3618 Exa6_ManAddClause4(
p, Abc_LitNot(pLits[n]), Abc_LitNot(pLits[m]), 0, 0 );
3622 for ( k = 0; k < 3; k++ )
3623 Exa6_ManAddClause4(
p, Abc_Var2Lit(iVarStart, k==1), Abc_Var2Lit(iVarStart+1, k==2), Abc_Var2Lit(iVarStart+2, k!=0), 0);
3625 Exa6_ManAddClause4(
p, Abc_Var2Lit(iVarStart, 1), Abc_Var2Lit(iVarStart+1, 1), Abc_Var2Lit(iVarStart+2, 0), 0);
3628 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
3631 for ( k = 0; k < 2; k++ )
3632 for ( j = i+1; j <
p->nObjs; j++ )
3633 if (
p->VarMarks[j][k][i] )
3634 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[j][k][i], 0 );
3637 for ( n = 0; n < nLits; n++ )
3638 for ( m = n+1; m < nLits; m++ )
3639 Exa6_ManAddClause4(
p, Abc_LitNot(pLits[n]), Abc_LitNot(pLits[m]), 0, 0 );
3641 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
3644 for ( j = 0; j <
p->nDivs +
p->nNodes; j++ )
if (
p->VarMarks[i][0][j] )
3645 pLits[nLits++] = Abc_Var2Lit(
p->VarMarks[i][0][j], 0 );
3646 Exa6_ManAddClause(
p, pLits, nLits );
3647 for ( n = 0; n < nLits; n++ )
3648 for ( m = n+1; m < nLits; m++ )
3649 Exa6_ManAddClause4(
p, Abc_LitNot(pLits[n]), Abc_LitNot(pLits[m]), 0, 0 );
3655 int iNodeVar =
p->nCnfVars + 3*
p->nNodes*(iMint - Vec_WrdSize(
p->vSimsIn));
3656 int iOutMint = Abc_Tt6FirstBit( Vec_WrdEntry(
p->vSimsOut, iMint) );
3657 int fOnlyOne = Abc_TtSuppOnlyOne( (
int)Vec_WrdEntry(
p->vSimsOut, iMint) );
3659 int fAllOnes = Abc_TtCountOnes( Vec_WrdEntry(
p->vSimsOut, iMint) ) == (1 <<
p->nOuts);
3663 assert( iMint < Vec_WrdSize(
p->vSimsIn) );
3665 for ( i = 0; i <
p->nDivs; i++ )
3666 VarVals[i] = (Vec_WrdEntry(
p->vSimsIn, iMint) >> i) & 1;
3667 for ( i = 0; i <
p->nNodes; i++ )
3668 VarVals[
p->nDivs + i] = Abc_Var2Lit(iNodeVar + 3*i + 2, 0);
3671 for ( i = 0; i <
p->nOuts; i++ )
3672 VarVals[
p->nDivs +
p->nNodes + i] = (iOutMint >> i) & 1;
3676 word t = Abc_Tt6Stretch( Vec_WrdEntry(
p->vSimsOut, iMint),
p->nOuts );
3677 int i, c, nCubes = 0, pCover[100], pLits[10];
3678 int iOutVar =
p->nCnfVars +
p->nCnfVars2;
p->nCnfVars2 +=
p->nOuts;
3679 for ( i = 0; i <
p->nOuts; i++ )
3680 VarVals[
p->nDivs +
p->nNodes + i] = Abc_Var2Lit(iOutVar + i, 0);
3684 Abc_Tt6IsopCover( ~t, ~t,
p->nOuts, pCover, &nCubes );
3685 for ( c = 0; c < nCubes; c++ )
3688 for ( i = 0; i <
p->nOuts; i++ )
3690 int iLit = (pCover[c] >> (2*i)) & 3;
3691 if ( iLit == 1 || iLit == 2 )
3692 pLits[nLits++] = Abc_Var2Lit(iOutVar + i, iLit != 1);
3694 Exa6_ManAddClause(
p, pLits, nLits );
3700 printf(
"Adding minterm %d: ", iMint );
3701 for ( i = 0; i <
p->nObjs; i++ )
3702 printf(
" %d=%d", i, VarVals[i] );
3705 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
3707 int iVarStart = 1 + 3*(i -
p->nDivs);
3708 int iBaseVarI = iNodeVar + 3*(i -
p->nDivs);
3709 for ( k = 0; k < 2; k++ )
3710 for ( j = 0; j < i; j++ )
if (
p->VarMarks[i][k][j] )
3711 for ( n = 0; n < 2; n++ )
3712 Exa6_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[i][k][j], 1), Abc_Var2Lit(iBaseVarI + k, n), Abc_LitNotCond(VarVals[j], !n), 0);
3713 for ( k = 0; k < 4; k++ )
3714 for ( n = 0; n < 2; n++ )
3715 Exa6_ManAddClause4(
p, Abc_Var2Lit(iBaseVarI + 0, k&1), Abc_Var2Lit(iBaseVarI + 1, k>>1), Abc_Var2Lit(iBaseVarI + 2, !n), Abc_Var2Lit(k ? iVarStart + k-1 : 0, n));
3717 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
3719 for ( j = 0; j <
p->nDivs +
p->nNodes; j++ )
if (
p->VarMarks[i][0][j] )
3720 for ( n = 0; n < 2; n++ )
3721 Exa6_ManAddClause4(
p, Abc_Var2Lit(
p->VarMarks[i][0][j], 1), Abc_LitNotCond(VarVals[j], n), Abc_LitNotCond(VarVals[i], !n), 0);
3728 p->pFile = fopen( pFileName,
"wb" );
3729 fputs(
"p cnf \n",
p->pFile );
3731 for ( m = 1; m < Vec_WrdSize(
p->vSimsIn); m++ )
3734 fprintf(
p->pFile,
"p cnf %d %d",
p->nCnfVars +
p->nCnfVars2,
p->nCnfClauses );
3751 int j, Count = 0, iVar = -1;
3752 for ( j = 0; j <
p->nObjs; j++ )
3753 if (
p->VarMarks[i][k][j] && Vec_IntEntry(vValues,
p->VarMarks[i][k][j]) )
3761static inline void Exa6_ManPrintFanin(
Exa6_Man_t *
p,
int iNode,
int fComp )
3764 printf(
" %s", fComp ?
"const1" :
"const0" );
3765 else if ( iNode > 0 && iNode <= p->nIns )
3766 printf(
" %s%c", fComp ?
"~" :
"",
'a'+iNode-1 );
3767 else if ( iNode >
p->nIns && iNode < p->nDivs )
3768 printf(
" %s%c", fComp ?
"~" :
"",
'A'+iNode-
p->nIns-1 );
3770 printf(
" %s%d", fComp ?
"~" :
"", iNode );
3775 printf(
"Circuit for %d-var function with %d divisors contains %d two-input gates:\n",
p->nIns,
p->nDivs,
p->nNodes );
3776 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
3778 int iVar = Exa6_ManFindFanin(
p, vValues, i, 0 );
3779 printf(
"%2d = ", i );
3780 Exa6_ManPrintFanin(
p, iVar, 0 );
3783 for ( i =
p->nDivs +
p->nNodes - 1; i >=
p->nDivs; i-- )
3785 int iVarStart = 1 + 3*(i -
p->nDivs);
3786 int Val1 = Vec_IntEntry(vValues, iVarStart);
3787 int Val2 = Vec_IntEntry(vValues, iVarStart+1);
3788 int Val3 = Vec_IntEntry(vValues, iVarStart+2);
3789 printf(
"%2d = ", i );
3790 for ( k = 0; k < 2; k++ )
3792 int iNode = Exa6_ManFindFanin(
p, vValues, i, !k );
3793 int fComp = k ? !Val1 && Val2 && !Val3 : Val1 && !Val2 && !Val3;
3794 Exa6_ManPrintFanin(
p, iNode, fComp );
3796 printf(
" %c", (Val1 && Val2) ? (Val3 ?
'|' :
'^') :
'&' );
3804 Mini_Aig_t * pMini = Mini_AigStartSupport(
p->nDivs-1,
p->nObjs );
3805 for ( i =
p->nDivs; i < p->nDivs +
p->nNodes; i++ )
3807 int iNodes[2] = {0};
3808 int iVarStart = 1 + 3*(i -
p->nDivs);
3809 int Val1 = Vec_IntEntry(vValues, iVarStart);
3810 int Val2 = Vec_IntEntry(vValues, iVarStart+1);
3811 int Val3 = Vec_IntEntry(vValues, iVarStart+2);
3812 Compl[i] = Val1 && Val2 && Val3;
3813 for ( k = 0; k < 2; k++ )
3815 int iNode = Exa6_ManFindFanin(
p, vValues, i, !k );
3816 int fComp = k ? !Val1 && Val2 && !Val3 : Val1 && !Val2 && !Val3;
3817 iNodes[k] = Abc_Var2Lit(iNode, fComp ^ Compl[iNode]);
3822 Mini_AigOr( pMini, iNodes[0], iNodes[1] );
3824 Mini_AigXorSpecial( pMini, iNodes[0], iNodes[1] );
3827 Mini_AigAnd( pMini, iNodes[0], iNodes[1] );
3829 for ( i =
p->nDivs +
p->nNodes; i < p->nObjs; i++ )
3831 int iVar = Exa6_ManFindFanin(
p, vValues, i, 0 );
3832 Mini_AigCreatePo( pMini, Abc_Var2Lit(iVar, Compl[iVar]) );
3834 assert(
p->nObjs == Mini_AigNodeNum(pMini) );
3849Mini_Aig_t *
Exa6_ManGenTest(
Vec_Wrd_t * vSimsIn,
Vec_Wrd_t * vSimsOut,
int nIns,
int nDivs,
int nOuts,
int nNodes,
int TimeOut,
int fOnlyAnd,
int fFancy,
int fOrderNodes,
int fUniqFans,
int fVerbose )
3852 abctime clkTotal = Abc_Clock();
3854 int Rand = ((((unsigned)rand()) << 12) ^ ((unsigned)rand())) & 0xFFFFF;
3855 char pFileNameIn[32];
sprintf( pFileNameIn,
"_%05x_.cnf", Rand );
3856 char pFileNameOut[32];
sprintf( pFileNameOut,
"_%05x_.out", Rand );
3859 Exa6_ManGenCnf(
p, pFileNameIn, fOnlyAnd, fFancy, fOrderNodes, fUniqFans );
3861 printf(
"Timeout = %d. OnlyAnd = %d. Fancy = %d. OrderNodes = %d. UniqueFans = %d. Verbose = %d.\n", TimeOut, fOnlyAnd, fFancy, fOrderNodes, fUniqFans, fVerbose );
3863 printf(
"CNF with %d variables and %d clauses was dumped into file \"%s\".\n",
p->nCnfVars,
p->nCnfClauses, pFileNameIn );
3864 vValues =
Exa4_ManSolve( pFileNameIn, pFileNameOut, TimeOut, fVerbose );
3869 Vec_IntFreeP( &vValues );
3871 unlink( pFileNameIn );
3872 Abc_PrintTime( 1,
"Total runtime", Abc_Clock() - clkTotal );
3877 Mini_Aig_t * pNew = Mini_AigStartSupport( Mini_AigPiNum(
p), Mini_AigNodeNum(
p) );
3878 Vec_Int_t * vCopies = Vec_IntStartFull( Mini_AigNodeNum(
p) );
int k, i = 0, o = 0;
3879 Vec_IntWriteEntry( vCopies, 0, 0 );
3881 Vec_IntWriteEntry( vCopies, k, Abc_Var2Lit(k, (ComplIns>>i++) & 1) );
3884 int iFaninLit0 = Mini_AigNodeFanin0(
p, k );
3885 int iFaninLit1 = Mini_AigNodeFanin1(
p, k );
3886 int iLit0 = Vec_IntEntry(vCopies, Mini_AigLit2Var(iFaninLit0)) ^ Mini_AigLitIsCompl(iFaninLit0);
3887 int iLit1 = Vec_IntEntry(vCopies, Mini_AigLit2Var(iFaninLit1)) ^ Mini_AigLitIsCompl(iFaninLit1);
3888 if ( iFaninLit0 < iFaninLit1 )
3889 Vec_IntWriteEntry( vCopies, k, Mini_AigAnd(pNew, iLit0, iLit1) );
3891 Vec_IntWriteEntry( vCopies, k, Mini_AigXorSpecial(pNew, iLit0, iLit1) );
3895 int iFaninLit0 = Mini_AigNodeFanin0(
p, k );
3896 int iLit0 = Vec_IntEntry(vCopies, Mini_AigLit2Var(iFaninLit0)) ^ Mini_AigLitIsCompl(iFaninLit0);
3897 Mini_AigCreatePo( pNew, iLit0 ^ ((ComplOuts >> o++) & 1) );
3899 Vec_IntFree( vCopies );
3905 int m, nMints = 1 << nOuts;
3906 for ( m = 0; m < nMints; m++ )
3907 if ( (Mint >> m) & 1 )
3908 MintNew |= (
word)1 << (m ^ Polar);
3914 for ( i = 0; i < (1 << nOuts); i++ )
3921 Vec_Wrd_t * vRes = Vec_WrdAlloc( Vec_WrdSize(vOuts) );
3929 Vec_Wrd_t * vRes = Vec_WrdAlloc( Vec_WrdSize(vIns) );
3930 int i;
word Entry, Polar = Vec_WrdEntry( vIns, 0 );
3932 Vec_WrdPush( vRes, Entry ^ Polar );
3939 Abc_TtPrintBits( &Entry, nDivs );
3942 Abc_TtPrintBits( &Entry, 1 << nOuts );
3949 int DivCompl, OutCompl;
3950 if ( nVars == 0 )
return NULL;
3952 DivCompl = (int)Vec_WrdEntry(vSimsDiv, 0) >> 1;
3955 printf(
"Inputs = %d. Divisors = %d. Outputs = %d. Nodes = %d. InP = %d. OutP = %d.\n",
3956 nVars, nDivs, nOuts, nNodes, DivCompl, OutCompl );
3959 pMini =
Exa6_ManGenTest( vSimsDiv2, vSimsOut2, nVars, nDivs, nOuts, nNodes, 0, fOnlyAnd, 0, 0, 0, fVerbose );
3962 if ( DivCompl || OutCompl )
3965 Mini_AigStop( pTemp );
3973 Vec_WrdFreeP( &vSimsDiv2 );
3974 Vec_WrdFreeP( &vSimsOut2 );
3980 Vec_Wrd_t * vSimsDiv = NULL, * vSimsOut = NULL;
3981 int i, k, nDivs, nOuts, nVars = 0;
3982 if ( !
strcmp(pFileName +
strlen(pFileName) - 3,
"rel") )
3983 nVars =
Exa6_ReadFile( pFileName, &vSimsDiv, &vSimsOut, &nDivs, &nOuts );
3984 else if ( !
strcmp(pFileName +
strlen(pFileName) - 3,
"pla") ) {
3987 if ( !
p || !p2 )
return;
3991 vSimsDiv = Vec_WrdStart( p2->nPats );
3992 for ( k = 0; k <
p->nIns; k++ )
3993 for ( i = 0; i < p2->nPats; i++ )
3994 if ( Abc_RDataGetIn(p2, k, i) )
3995 Abc_InfoSetBit((
unsigned *)Vec_WrdEntryP(vSimsDiv, i), 1+k);
3996 vSimsOut = Vec_WrdStart( p2->nPats );
3997 for ( k = 0; k < (1 <<
p->nOuts); k++ )
3998 for ( i = 0; i < p2->nPats; i++ )
3999 if ( Abc_RDataGetOut(p2, k, i) )
4000 Abc_InfoSetBit((
unsigned *)Vec_WrdEntryP(vSimsOut, i), k);
4002 Abc_RDataStop( p2 );
4005 printf(
"Unknown file extension in file \"%s\".\n", pFileName );
4011 pMini =
Exa_ManExactSynthesis6Int( vSimsDiv, vSimsOut, nVars, nDivs, nOuts, pPars->nNodes, pPars->fOnlyAnd, pPars->fVerbose, pFileName );
4012 Vec_WrdFreeP( &vSimsDiv );
4013 Vec_WrdFreeP( &vSimsOut );
4014 if ( pMini ) Mini_AigStop( pMini );
4028static inline int Exa7_AddClause( FILE * pFile,
int * pLits,
int nLits )
4031 for ( i = 0; i < nLits; i++ ) {
4032 if ( pLits[i] == 1 )
4034 else if ( pLits[i] == 0 )
4037 pLits[k++] = pLits[i];
4043 for ( i = 0; i < nLits; i++ )
4044 fprintf( pFile,
"%s%d ", Abc_LitIsCompl(pLits[i]) ?
"-" :
"", Abc_Lit2Var(pLits[i]) );
4045 fprintf( pFile,
"0\n" );
4049 for ( i = 0; i < nLits; i++ )
4050 fprintf( stdout,
"%s%d ", Abc_LitIsCompl(pLits[i]) ?
"-" :
"", Abc_Lit2Var(pLits[i])-1 );
4051 fprintf( stdout,
"\n" );
4055static inline int Exa7_AddClause4( FILE * pFile,
int Lit0,
int Lit1,
int Lit2,
int Lit3 )
4057 int pLits[4] = { Lit0, Lit1, Lit2, Lit3 };
4058 return Exa7_AddClause( pFile, pLits, 4 );
4062 return 1 + n*n*m + n*i + j;
4066 int m, n, v, k, nV = nVars + nNodes, nMints = 1 << nVars, nClas = 0;
4067 int pVars[32] = {0};
assert( nVars + nNodes + 1 < 32 );
4068 FILE * pFile = fopen( pFileName,
"wb" );
4069 fputs(
"p cnf \n", pFile );
4070 for ( m = 0; m < nMints; m++ )
4072 for ( v = 0; v < nVars; v++ )
4073 nClas += Exa7_AddClause4( pFile, Abc_Var2Lit(
Exa7_GetVar(nV, v, v, m), ((m >> v)&1)==0), 0, 0, 0 );
4074 nClas += Exa7_AddClause4( pFile, Abc_Var2Lit(
Exa7_GetVar(nV, nV-1, nV-1, m), ((pTruth[0] >> m)&1)==0), 0, 0, 0 );
4075 for ( n = nVars; n < nV; n++ )
4078 for ( v = 0; v < n; v++ )
4084 nClas += Exa7_AddClause4( pFile, Abc_Var2Lit(iFanVar, 1), Abc_Var2Lit(iParVar, 1), Abc_Var2Lit(iValFan, 0), 0 );
4085 nClas += Exa7_AddClause4( pFile, Abc_Var2Lit(iFanVar, 0), Abc_Var2Lit(iParVar, 0), 0, 0 );
4086 nClas += Exa7_AddClause4( pFile, Abc_Var2Lit(iFanVar, 0), Abc_Var2Lit(iValFan, 1), 0, 0 );
4088 nClas += Exa7_AddClause4( pFile, Abc_Var2Lit(iParVar, 1), Abc_Var2Lit(iValFan, 0), Abc_Var2Lit(iValNode, 0), 0 );
4089 pVars[v] = Abc_Var2Lit(iFanVar, 1);
4091 pVars[v] = Abc_Var2Lit(iValNode, 1);
4093 nClas += Exa7_AddClause( pFile, pVars, n+1 );
4096 for ( n = nVars; n < nV; n++ ) {
4097 for ( v = 0; v < n; v++ )
4098 pVars[v] = Abc_Var2Lit(
Exa7_GetVar(nV, v, n, 0), 0);
4099 nClas += Exa7_AddClause( pFile, pVars, n );
4101 int Total = 1 << n, Limit = GateSize + 1;
4102 for ( m = 0; m < Total; m++ )
4104 if ( Abc_TtCountOnes((
word)m) != Limit )
4106 for ( k = v = 0; v < n; v++ )
4108 pVars[k++] = Abc_Var2Lit(
Exa7_GetVar(nV, v, n, 0), 1);
4110 nClas += Exa7_AddClause( pFile, pVars, Limit );
4115 fprintf( pFile,
"p cnf %d %d", nMints * nV * nV, nClas );
4123 char FileName[1100];
4124 int v, n, k, nV = nVars+nNodes;
4126 sprintf( FileName,
"func%s_%d_%d.v", Buffer, GateSize, nNodes );
4127 pFile = fopen( FileName,
"wb" );
4128 fprintf( pFile,
"// Realization of the %d-input function %s using %d NAND gates:\n", nVars, Buffer, nNodes );
4129 fprintf( pFile,
"module func%s_%d_%d ( input", Buffer, GateSize, nNodes );
4130 for ( v = 0; v < nVars; v++ )
4131 fprintf( pFile,
" %c,",
'a'+v );
4132 fprintf( pFile,
" output out );\n" );
4133 for ( n = nVars; n < nV; n++ ) {
4135 for ( v = 0; v < n; v++ )
4136 nFans += Vec_IntEntry(vValues,
Exa7_GetVar(nV, v, n, 0));
4137 fprintf( pFile,
" wire %c = ~(",
'a'+n );
4138 for ( k = v = 0; v < n; v++ )
4139 if ( Vec_IntEntry(vValues,
Exa7_GetVar(nV, v, n, 0)) )
4140 fprintf( pFile,
"%c%s",
'a'+v, ++k < nFans ?
" & ":
"" );
4141 fprintf( pFile,
");\n" );
4143 fprintf( pFile,
" assign out = %c;\n",
'a'+nV-1 );
4144 fprintf( pFile,
"endmodule\n\n" );
4146 printf(
"Solution was dumped into file \"%s\".\n", FileName );
4150 abctime clkTotal = Abc_Clock();
4151 int v, n, nMints = 1 << pPars->nVars;
4152 int nV = pPars->nVars + pPars->nNodes;
4153 word pTruth[16]; Abc_TtReadHex( pTruth, pPars->pTtStr );
4155 int Rand = ((((unsigned)rand()) << 12) ^ ((unsigned)rand())) & 0xFFFFF;
4156 char pFileNameIn[32];
sprintf( pFileNameIn,
"_%05x_.cnf", Rand );
4157 char pFileNameOut[32];
sprintf( pFileNameOut,
"_%05x_.out", Rand );
4158 int nClas =
Exa7_ManGenCnf( pFileNameIn, pTruth, pPars->nVars, pPars->nNodes, GateSize );
4159 if ( pPars->fVerbose )
4160 printf(
"CNF with %d variables and %d clauses was dumped into file \"%s\".\n", nMints * nV * nV, nClas, pFileNameIn );
4161 vValues =
Exa4_ManSolve( pFileNameIn, pFileNameOut, pPars->RuntimeLim, pPars->fVerbose );
4162 if ( pPars->fVerbose && vValues ) {
4164 for ( n = 0; n < nV; n++ )
4165 printf(
"%2d ", n );
4167 for ( n = pPars->nVars; n < nV; n++, printf(
"\n") ) {
4168 printf(
"%2d : ", n );
4169 for ( v = 0; v < n; v++ )
4170 printf(
" %c ", Vec_IntEntry(vValues,
Exa7_GetVar(nV, v, n, 0)) ?
'1':
'.' );
4175 Vec_IntFreeP( &vValues );
4176 unlink( pFileNameIn );
4177 Abc_PrintTime( 1,
"Total runtime", Abc_Clock() - clkTotal );
4194 char Command[1000];
int i;
4195 FILE * pFile = fopen(
"npn3.txt",
"r" );
4196 for ( i = 0; i < 14; i++ )
4202 int Value = fscanf( pFile,
"%s", Buffer );
4204 if ( i == 0 )
continue;
4205 if ( Buffer[
strlen(Buffer)-1] ==
'\n' )
4206 Buffer[
strlen(Buffer)-1] =
'\0';
4207 if ( Buffer[
strlen(Buffer)-1] ==
'\r' )
4208 Buffer[
strlen(Buffer)-1] =
'\0';
4209 sprintf( Command,
"lutexact -I 3 -N 2 -K 2 -gvc %s", Buffer+2 );
4210 printf(
"\nNPN class %6d : Command \"%s\":\n", i, Command );
4213 fprintf( stdout,
"Cannot execute command \"%s\".\n", Command );
4221 char Command[1000];
int i;
4223 for ( i = 0; i < 10000; i++ )
4226 sprintf( Command,
"lutexact -I 6 -N 2 -K 5 -gvc %016lx", Truth );
4227 printf(
"\nIter %4d : Command \"%s\":\n", i, Command );
4230 fprintf( stdout,
"Cannot execute command \"%s\".\n", Command );
int bmcg_sat_solver_conflictnum(bmcg_sat_solver *s)
abctime bmcg_sat_solver_set_runtime_limit(bmcg_sat_solver *s, abctime Limit)
int bmcg_sat_solver_varnum(bmcg_sat_solver *s)
bmcg_sat_solver * bmcg_sat_solver_start()
MACRO DEFINITIONS ///.
int bmcg_sat_solver_solve(bmcg_sat_solver *s, int *plits, int nlits)
int bmcg_sat_solver_addclause(bmcg_sat_solver *s, int *plits, int nlits)
int bmcg_sat_solver_read_cex_varvalue(bmcg_sat_solver *s, int ivar)
void bmcg_sat_solver_set_nvars(bmcg_sat_solver *s, int nvars)
int bmcg_sat_solver_clausenum(bmcg_sat_solver *s)
void bmcg_sat_solver_stop(bmcg_sat_solver *s)
#define GLUCOSE_UNSAT
INCLUDES ///.
word Abc_RandomW(int fReset)
#define ABC_ALLOC(type, num)
unsigned Abc_Random(int fReset)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_DLL Abc_Frame_t * Abc_FrameGetGlobalFrame()
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define MAJ_NOBJS
DECLARATIONS ///.
int Maj_ManValue(int iMint, int nVars)
FUNCTION DEFINITIONS ///.
void Exa3_ManPrint(Exa3_Man_t *p, int i, int iMint, abctime clk)
int Exa4_ManMarkup(Exa4_Man_t *p)
Vec_Int_t * Exa4_ManSolve(char *pFileNameIn, char *pFileNameOut, int TimeOut, int fVerbose)
int Exa5_ManMarkup(Exa5_Man_t *p)
void Maj_ManFree(Maj_Man_t *p)
word Abc_TtConvertEntry(word Res)
void Exa4_ManGenMint(Exa4_Man_t *p, int iMint, int fOnlyAnd, int fFancy)
Mini_Aig_t * Exa4_ManMiniAig(Exa4_Man_t *p, Vec_Int_t *vValues, int fFancy)
Mini_Aig_t * Exa6_ManMiniAig(Exa6_Man_t *p, Vec_Int_t *vValues, int fFancy)
Vec_Wrd_t * Exa_ManTruthTables(Exa_Man_t *p)
void Exa6_GenCount(word *pTruths, int nVars)
void Exa_ManDumpBlif(Exa_Man_t *p, int fCompl)
void Exa_ManExactSynthesis7(Bmc_EsPar_t *pPars, int GateSize)
Vec_Int_t * Exa3_CountInputVars(int nVars, Vec_Wec_t *p)
word Mini_AigWriteEntry(Mini_Aig_t *p)
Vec_Wrd_t * Exa6_ManTransformInputs(Vec_Wrd_t *vIns)
struct Maj_Man_t_ Maj_Man_t
int Exa6_ManFindPolar(word First, int nOuts)
word Exa6_ManPolarMinterm(word Mint, int nOuts, int Polar)
int Exa7_ManGenCnf(char *pFileName, word *pTruth, int nVars, int nNodes, int GateSize)
void Exa_ManExactPrint(Vec_Wrd_t *vSimsDiv, Vec_Wrd_t *vSimsOut, int nDivs, int nOuts)
void Exa_ManExactSynthesis6_(Bmc_EsPar_t *pPars, char *pFileName)
struct Exa4_Man_t_ Exa4_Man_t
void Exa4_ManPrintSolution(Exa4_Man_t *p, Vec_Int_t *vValues, int fFancy)
void Exa_ManExactSynthesis4_(Bmc_EsPar_t *pPars)
Mini_Aig_t * Exa_ManExactSynthesis6Int(Vec_Wrd_t *vSimsDiv, Vec_Wrd_t *vSimsOut, int nVars, int nDivs, int nOuts, int nNodes, int fOnlyAnd, int fVerbose, char *pFileName)
Exa5_Man_t * Exa5_ManAlloc(Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut, int nIns, int nDivs, int nOuts, int nNodes, int fVerbose)
void Exa6_ManGenCnf(Exa6_Man_t *p, char *pFileName, int fOnlyAnd, int fFancy, int fOrderNodes, int fUniqFans)
void Exa6_ManPrintSolution(Exa6_Man_t *p, Vec_Int_t *vValues, int fFancy)
void Exa4_ManGenCnf(Exa4_Man_t *p, char *pFileName, int fOnlyAnd, int fFancy, int fOrderNodes, int fUniqFans, int fCard, char *pGuide)
int Exa6_ReadFile(char *pFileName, Vec_Wrd_t **pvSimsDiv, Vec_Wrd_t **pvSimsOut, int *pnDivs, int *pnOuts)
struct Exa5_Man_t_ Exa5_Man_t
Vec_Int_t * Exa4_ManParse(char *pFileName)
DECLARATIONS ///.
Mini_Aig_t * Exa6_ManGenTest(Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut, int nIns, int nDivs, int nOuts, int nNodes, int TimeOut, int fOnlyAnd, int fFancy, int fOrderNodes, int fUniqFans, int fVerbose)
void Exa_NpnCascadeTest6()
int Exa_ManSolverSolve(Exa_Man_t *p)
int Exa5_ManGenStart(Exa5_Man_t *p, int fOnlyAnd, int fFancy, int fOrderNodes, int fUniqFans)
Mini_Aig_t * Exa4_ManGenTest(Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut, int nIns, int nDivs, int nOuts, int nNodes, int TimeOut, int fOnlyAnd, int fFancy, int fOrderNodes, int fUniqFans, int fVerbose, int fCard, char *pGuide)
void Exa5_ManGenMint(Exa5_Man_t *p, int iMint, int fOnlyAnd, int fFancy)
void Exa6_WriteFile(char *pFileName, int nVars, word *pTruths, int nTruths)
void Exa_ManMiniVerify(Mini_Aig_t *p, Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut)
void Exa3_ManExactSynthesisRand(Bmc_EsPar_t *pPars)
Vec_Wrd_t * Maj_ManTruthTables(Maj_Man_t *p)
int Exa_ManMarkup(Exa_Man_t *p)
void Exa4_ManFree(Exa4_Man_t *p)
void Mini_AigPrintArray(FILE *pFile, Mini_Aig_t *p)
void Exa5_ManPrintSolution(Exa5_Man_t *p, Vec_Int_t *vValues, int fFancy)
Exa6_Man_t * Exa6_ManAlloc(Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut, int nIns, int nDivs, int nOuts, int nNodes, int fVerbose)
struct Exa3_Man_t_ Exa3_Man_t
void Exa5_ManFree(Exa5_Man_t *p)
void Exa5_ManGenCnf(Exa5_Man_t *p, char *pFileName, int fOnlyAnd, int fFancy, int fOrderNodes, int fUniqFans)
Exa4_Man_t * Exa4_ManAlloc(Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut, int nIns, int nDivs, int nOuts, int nNodes, int fVerbose)
void Exa_ManExactSynthesis6(Bmc_EsPar_t *pPars, char *pFileName)
void Exa6_SortSims(Vec_Wrd_t *vSimsDiv, Vec_Wrd_t *vSimsOut)
int Exa6_ManGenStart(Exa6_Man_t *p, int fOnlyAnd, int fFancy, int fOrderNodes, int fUniqFans)
int Exa_ManAddCnfAdd(Exa_Man_t *p, int *pnAdded)
void Exa6_GenProd(word *pTruths, int nVars)
struct Exa_Man_t_ Exa_Man_t
Mini_Aig_t * Exa5_ManMiniAig(Exa5_Man_t *p, Vec_Int_t *vValues)
Mini_Aig_t * Exa5_ManGenTest(Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut, int nIns, int nDivs, int nOuts, int nNodes, int TimeOut, int fOnlyAnd, int fFancy, int fOrderNodes, int fUniqFans, int fVerbose)
Exa_Man_t * Exa_ManAlloc(Bmc_EsPar_t *pPars, word *pTruth)
Vec_Wrd_t * Exa6_ManTransformOutputs(Vec_Wrd_t *vOuts, int nOuts)
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_ManIsNormalized(Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut)
void Exa_ManFree(Exa_Man_t *p)
void Exa_ManExactSynthesis(Bmc_EsPar_t *pPars)
struct Exa6_Man_t_ Exa6_Man_t
Mini_Aig_t * Mini_AigDupCompl(Mini_Aig_t *p, int ComplIns, int ComplOuts)
void Exa6_WriteFile2(char *pFileName, int nVars, int nDivs, int nOuts, Vec_Wrd_t *vSimsDiv, Vec_Wrd_t *vSimsOut)
void Exa_NpnCascadeTest()
Vec_Wec_t * Exa3_ChooseInputVars(int nVars, int nLuts, int nLutSize)
Vec_Wec_t * Exa3_ChooseInputVars_int(int nVars, int nLuts, int nLutSize)
int Exa3_ManExactSynthesis(Bmc_EsPar_t *pPars)
int Exa6_ManMarkup(Exa6_Man_t *p)
Gia_Man_t * Gia_ManDupMini(Gia_Man_t *p, Vec_Int_t *vIns, Vec_Int_t *vDivs, Vec_Int_t *vOuts, Mini_Aig_t *pMini)
int Exa7_GetVar(int n, int i, int j, int m)
void Exa_ManDumpVerilog(Vec_Int_t *vValues, int nVars, int nNodes, int GateSize, word *pTruth)
void Exa_ManExactSynthesis4Vars()
int Maj_ManMarkup(Maj_Man_t *p)
#define MAJ_NOBJS
DECLARATIONS ///.
void Exa6_ManGenMint(Exa6_Man_t *p, int iMint, int fOnlyAnd, int fFancy)
int Exa_ManAddCnfStart(Exa_Man_t *p, int fOnlyAnd)
void Exa_ManExactSynthesis5(Bmc_EsPar_t *pPars)
int Gia_ManDupMini_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Maj_Man_t * Maj_ManAlloc(int nVars, int nNodes, int fUseConst, int fUseLine)
void Maj_ManPrintSolution(Maj_Man_t *p)
int Maj_ManExactSynthesis(int nVars, int nNodes, int fUseConst, int fUseLine, int fVerbose)
void Exa_ManMiniPrint(Mini_Aig_t *p, int nIns)
word Exa_ManExactSynthesis4VarsOne(int Index, int Truth, int nNodes)
int Exa4_ManGenStart(Exa4_Man_t *p, int fOnlyAnd, int fFancy, int fOrderNodes, int fUniqFans, int fCard, char *pGuide)
void Exa_ManExactSynthesis4(Bmc_EsPar_t *pPars)
void Exa6_ManFree(Exa6_Man_t *p)
int Maj_ManAddCnfStart(Maj_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Bmc_EsPar_t_ Bmc_EsPar_t
INCLUDES ///.
ABC_DLL int Cmd_CommandExecute(Abc_Frame_t *pAbc, const char *sCommand)
ABC_NAMESPACE_IMPL_START void Extra_BitMatrixTransposeP(Vec_Wrd_t *vSimsIn, int nWordsIn, Vec_Wrd_t *vSimsOut, int nWordsOut)
DECLARATIONS ///.
Vec_Int_t * Gia_ManKSatGenLevels(char *pGuide, int nIns, int nNodes)
Vec_Int_t * Gia_RunKadical(char *pFileNameIn, char *pFileNameOut, int Seed, int nBTLimit, int TimeOut, int fVerbose, int *pStatus)
void Gia_ManSetRegNum(Gia_Man_t *p, int nRegs)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
struct Gia_Obj_t_ Gia_Obj_t
void Gia_ManFillValue(Gia_Man_t *p)
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
void Extra_PrintBinary(FILE *pFile, unsigned Sign[], int nBits)
typedefABC_NAMESPACE_HEADER_START struct Abc_RData_t_ Abc_RData_t
INCLUDES ///.
unsigned __int64 word
DECLARATIONS ///.
struct Mini_Aig_t_ Mini_Aig_t
BASIC TYPES ///.
#define Mini_AigForEachPi(p, i)
#define Mini_AigForEachPo(p, i)
#define Mini_AigForEachAnd(p, i)
int VarMarks[MAJ_NOBJS][6][MAJ_NOBJS]
int VarMarks[MAJ_NOBJS][2][MAJ_NOBJS]
int VarMarks[MAJ_NOBJS][MAJ_NOBJS]
int VarMarks[MAJ_NOBJS][2][MAJ_NOBJS]
int VarMarks[MAJ_NOBJS][2][MAJ_NOBJS]
int VarMarks[MAJ_NOBJS][3][MAJ_NOBJS]
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryDoubleStart(vVec, Entry1, Entry2, i, Start)
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
#define Vec_WecForEachLevelReverse(vGlob, vVec, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.