69 int i, k, d, v, n, iVar = 0;
70 assert( nLuts >= 1 && nLuts <= 2 );
75 p->nVars = nLuts * nSize;
76 p->nPars = nLuts * (1 << nSize) + nLuts * nSize * nDivs;
78 for ( i = 0; i < nLuts; i++ )
79 for ( k = 0; k < (1 << nSize); k++ )
80 p->pPars1[i][k] = iVar++;
81 for ( i = 0; i < nLuts; i++ )
82 for ( k = 0; k < nSize; k++ )
83 for ( d = 0; d < nDivs; d++ )
84 p->pPars2[i][k][d] = iVar++;
86 for ( i = 0; i < nLuts; i++ )
87 for ( k = 0; k < nSize; k++ )
88 p->pVars[i][k] = iVar++;
90 for ( i = 1; i < nLuts; i++ )
91 p->pVars[i][nSize] =
p->pVars[i-1][0];
93 for ( d = 0; d < nDivs; d++ )
95 assert( iVar ==
p->nPars +
p->nVars +
p->nDivs );
98 for ( i = 0; i < nLuts; i++ )
99 for ( k = (i > 0); k < nSize; k++ )
100 for ( d = 0; d < nDivs; d++ )
101 for ( n = 0; n < nDivs; n++ )
105 Vec_IntPush( vCnf, Abc_Var2Lit(
p->pPars2[i][k][d], 0) );
106 Vec_IntPush( vCnf, Abc_Var2Lit(
p->pPars2[i][k][n], 0) );
107 Vec_IntPush( vCnf, -1 );
109 else if ( k < nSize-1 )
111 Vec_IntPush( vCnf, Abc_Var2Lit(
p->pPars2[i][k][d], 0) );
112 Vec_IntPush( vCnf, Abc_Var2Lit(
p->pPars2[i][k+1][n], 0) );
113 Vec_IntPush( vCnf, -1 );
118 for ( i = 0; i < nLuts; i++ )
119 for ( k = 0; k < (1 << nSize); k++ )
120 for ( n = 0; n < 2; n++ )
122 for ( v = 0; v < nSize; v++ )
123 Vec_IntPush( vCnf, Abc_Var2Lit(
p->pPars1[i][v], (k >> v) & 1) );
124 Vec_IntPush( vCnf, Abc_Var2Lit(
p->pVars[i][nSize], n) );
125 Vec_IntPush( vCnf, Abc_Var2Lit(
p->pPars1[i][k], !n) );
126 Vec_IntPush( vCnf, -1 );
130 for ( i = 0; i < nLuts; i++ )
131 for ( k = (i > 0); k < nSize; k++ )
132 for ( d = 0; d < nDivs; d++ )
133 for ( n = 0; n < 2; n++ )
135 Vec_IntPush( vCnf, Abc_Var2Lit(
p->pPars2[i][k][d], 0) );
136 Vec_IntPush( vCnf, Abc_Var2Lit(
p->pPars1[i][k], n) );
137 Vec_IntPush( vCnf, Abc_Var2Lit(
p->pDivs[d], !n) );
138 Vec_IntPush( vCnf, -1 );
146 int pLits[8], nLits, i, k, iLit, RetValue;
147 int ThisTopVar =
p->pVars[0][
p->nSize];
148 int FirstDivVar =
p->nPars +
p->nVars;
150 for ( i = 0; i < Vec_IntSize(vCnf); i++ )
152 assert( Vec_IntEntry(vCnf, i) != -1 );
153 for ( k = i+1; k < Vec_IntSize(vCnf); k++ )
154 if ( Vec_IntEntry(vCnf, i) == -1 )
158 if ( Abc_Lit2Var(iLit) == ThisTopVar )
159 pLits[nLits++] = Abc_Var2Lit( ThisTopVar, Abc_LitIsCompl(iLit) );
160 else if ( Abc_Lit2Var(iLit) >= FirstDivVar )
161 pLits[nLits++] = Abc_Var2Lit( pDivVars[Abc_Lit2Var(iLit)-FirstDivVar], Abc_LitIsCompl(iLit) );
163 pLits[nLits++] = iLit + 2 * iStartVar;
174 int pLits[8], nLits, i, k, iLit, RetValue;
175 int ThisTopVar =
p->pVars[0][
p->nSize];
176 int FirstDivVar =
p->nPars +
p->nVars;
177 int FirstIntVar =
p->nPars;
183 if ( Abc_Lit2Var(iLit) == ThisTopVar )
185 if ( Abc_LitIsCompl(iLit) == iTopVarValue )
189 else if ( Abc_Lit2Var(iLit) >= FirstDivVar )
191 if ( Abc_LitIsCompl(iLit) == pDivVarValues[Abc_Lit2Var(iLit)-FirstDivVar] )
195 else if ( Abc_Lit2Var(iLit) >= FirstIntVar )
196 pLits[nLits++] = iLit + 2 * iStartVar;
198 pLits[nLits++] = iLit;
200 if ( k < Vec_IntSize(vLevel) )
225 int RetValue, n, i, j, j2, k, k2, d, Count, nVars = 0;
226 for ( n = 0; n < N; n++ )
227 for ( i = 0; i <
M+N; i++ )
228 for ( k = 0; k < K; k++ )
230 for ( n = 0; n < N; n++ )
231 for ( i = 0; i <
M+n; i++ )
232 for ( k = 0; k < K; k++ )
233 pVars[n][i][k] = nVars++;
234 printf(
"Number of topo vars = %d.\n", nVars );
240 for ( i = 0; i <
M+N-1; i++ )
242 Vec_IntClear( vTemp );
243 for ( n = 0; n < N; n++ )
244 for ( k = 0; k < K; k++ )
245 if ( pVars[n][i][k] >= 0 )
246 Vec_IntPush( vTemp, Abc_Var2Lit(pVars[n][i][k], 0) );
250 printf(
"Added %d node connectivity constraints.\n", i );
253 for ( n = 0; n < N; n++ )
254 for ( k = 0; k < K; k++ )
257 Vec_IntClear( vTemp );
258 for ( i = 0; i <
M+n; i++ )
259 Vec_IntPush( vTemp, Abc_Var2Lit(pVars[n][i][k], 0) );
263 for ( i = 0; i <
M+n; i++ )
264 for ( j = i+1; j <
M+n; j++ )
266 Vec_IntFillTwo( vTemp, 2, Abc_Var2Lit(pVars[n][i][k], 1), Abc_Var2Lit(pVars[n][j][k], 1) );
272 printf(
"Added %d fanin connectivity constraints.\n", Count );
275 for ( n = 0; n < N; n++ )
276 for ( i = 0; i <
M+n; i++ )
277 for ( k = 0; k < K; k++ )
278 for ( j = i; j <
M+n; j++ )
279 for ( k2 = k+1; k2 < K; k2++ )
281 Vec_IntFillTwo( vTemp, 2, Abc_Var2Lit(pVars[n][i][k], 1), Abc_Var2Lit(pVars[n][j][k2], 1) );
286 printf(
"Added %d fanin exclusivity constraints.\n", Count );
289 for ( n = 1; n < N; n++ )
290 for ( i = 0; i <
M+n-1; i++ )
293 for ( j = i+1; j <
M+n-1; j++ )
295 Vec_IntFillTwo( vTemp, 2, Abc_Var2Lit(pVars[n][i][0], 1), Abc_Var2Lit(pVars[n-1][j][0], 1) );
301 Vec_IntFillTwo( vTemp, 2, Abc_Var2Lit(pVars[n][i][0], 1), Abc_Var2Lit(pVars[n-1][i][0], 1) );
302 for ( j = 0; j < i; j++ )
303 for ( j2 = j+1; j2 < i; j2++ )
305 Vec_IntPushTwo( vTemp, Abc_Var2Lit(pVars[n][j][1], 1), Abc_Var2Lit(pVars[n-1][j2][1], 1) );
308 Vec_IntShrink( vTemp, 2 );
312 printf(
"Added %d node ordering constraints.\n", Count );
316 for ( n = 1; n < N; n++ )
317 for ( i =
M; i <
M+n; i++ )
318 for ( j = 0; j < i; j++ )
319 for ( k = 0; k < K; k++ )
321 Vec_IntClear( vTemp );
322 Vec_IntPush( vTemp, Abc_Var2Lit(pVars[n][i][0], 1) );
323 Vec_IntPush( vTemp, Abc_Var2Lit(pVars[n][j][1], 1) );
324 Vec_IntPush( vTemp, Abc_Var2Lit(pVars[i-
M][j][k], 1) );
329 printf(
"Added %d two-node non-triviality constraints.\n", Count );
334 for ( i = 0; i <
M+N; i++ )
335 for ( d = 0; d <
MAX_D; d++ )
336 pVars2[i][d] = nVars++;
337 printf(
"Number of total vars = %d.\n", nVars );
339 for ( i = 0; i <
M; i++ )
342 Vec_IntFill( vTemp, 1, Abc_Var2Lit(pVars2[i][pDelays[i]], 0) );
347 for ( k = Req; k <
MAX_D; k++ )
349 Vec_IntFill( vTemp, 1, Abc_Var2Lit(pVars2[
M+N-1][Req+1], 1) );
354 for ( n = 0; n < N; n++ )
355 for ( i = 0; i <
M+n; i++ )
356 for ( k = 0; k < K; k++ )
357 for ( d = 0; d <
MAX_D-1; d++ )
359 Vec_IntFill( vTemp, 1, Abc_Var2Lit(pVars[n][i][k], 1) );
360 Vec_IntPush( vTemp, Abc_Var2Lit(pVars2[i][d], 1) );
361 Vec_IntPush( vTemp, Abc_Var2Lit(pVars2[
M+n][d+1], 0) );
367 Vec_IntFree( vTemp );
398 int status, v, nVars, nIter, nSols = 0;
401 int pDelays[
MAX_M] = {1,0,0,0,1};
405 for ( nIter = 0; nIter < 1000000; nIter++ )
419 Vec_IntClear( vLits );
420 for ( v = 0; v < nVars; v++ )
421 if ( sat_solver_var_value(pSat, v) )
422 Vec_IntPush( vLits, Abc_Var2Lit(v, 1) );
431 Vec_IntFree( vLits );
432 printf(
"Found %d solutions. ", nSols );
433 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
550 int i, k, v, nLutPars = (1 << K) - 1;
551 int nWords = Abc_TtWordNum(
M );
554 for ( i = 0; i < N; i++ )
556 word * pMint, * pTruth = pTruthsElem + (
M+i)*
nWords;
557 Abc_TtClear( pTruth,
nWords );
558 for ( k = 1; k <= nLutPars; k++ )
560 if ( !pValues[i*nLutPars+k-1] )
562 pMint = pTruthsElem + (
M+N)*
nWords;
563 Abc_TtFill( pMint,
nWords );
564 for ( v = 0; v < K; v++ )
566 word * pFanin = pTruthsElem + pLuts[i][v]*
nWords;
567 Abc_TtAndSharp( pMint, pMint, pFanin,
nWords, ((k >> v) & 1) == 0 );
569 Abc_TtOr( pTruth, pTruth, pMint,
nWords );
573 Abc_TtNot( pRes,
nWords );
597 int nLutPars = (1 << K) - 1, nVars = N * nLutPars;
598 int i, k, m, status, iMint, Iter, fCompl = (int)(pTruthInit[0] & 1);
601 Abc_TtElemInit2( pTruths,
M );
605 printf(
"Number of parameters %d x %d = %d.\n", N, nLutPars, nVars );
609 for ( Iter = 0; Iter < (1 <<
M); Iter++ )
617 for ( i = 0; i < N; i++ )
618 for ( m = 0; m <= nLutPars; m++ )
621 printf(
"i = %d. m = %d.\n", i, m );
624 for ( k = 0; k < K; k++ )
626 if ( pLuts[i][k] >=
M )
628 assert( pLuts[i][k] -
M < N - 1 );
629 pLits[nLits] = pLits2[nLits] = Abc_Var2Lit( nVarStart + pLuts[i][k] -
M, (m >> k) & 1 );
632 else if ( ((iMint >> pLuts[i][k]) & 1) != ((m >> k) & 1) )
640 pLits[nLits] = Abc_Var2Lit( i*nLutPars + m-1, 1 );
641 pLits2[nLits] = Abc_Var2Lit( i*nLutPars + m-1, 0 );
647 pLits[nLits] = Abc_Var2Lit( nVarStart + i, 0 );
648 pLits2[nLits] = Abc_Var2Lit( nVarStart + i, 1 );
652 if ( i != N - 1 || Abc_TtGetBit(pTruthInit, iMint) != fCompl )
661 if ( (i != N - 1 || Abc_TtGetBit(pTruthInit, iMint) == fCompl) && m > 0 )
684 for ( i = 0; i < nVars; i++ )
685 pValues[i] = sat_solver_var_value(pSat, i);
689 clkOther += Abc_Clock() - clk2;
693 for ( i = 0; i < nVars; i++ )
694 printf(
"%d=%d ", i, pValues[i] );
697 printf(
"%d=%d ", i, sat_solver_var_value(pSat, i) );
702 if ( Abc_TtEqual(pTruthInit, pTruthNew,
nWords) )
706 iMint = Abc_TtFindFirstDiffBit( pTruthInit, pTruthNew,
M );
712 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
713 Abc_PrintTime( 1,
"Time", clkOther );
765 int pLuts[
MAX_N][
MAX_K] = { {0,1}, {2,3}, {4,5}, {6,7}, {8,9}, {10,11}, {12,13} };
768 int Res, i, k, nLutPars = (1 << K) - 1;
775 printf(
"Solution does not exist.\n" );
778 printf(
"Result (compl = %d):\n", Res );
779 for ( i = 0; i < N; i++ )
781 for ( k = nLutPars-1; k >= 0; k-- )
782 printf(
"%d", pValues[i*nLutPars+k] );