157 int nMintsL = (1 << nLutSize);
158 int nMintsF = (1 << (2 * nLutSize - 1));
159 int v, Value, m, mNew, nMintsFNew, nMintsLNew;
163 assert( nBSet + nSSet + nFSet == nVars );
165 assert( nSSet + nBSet <= nLutSize );
166 assert( nLutSize + nSSet + nFSet <= 2*nLutSize - 1 );
167 nMintsFNew = (1 << (nLutSize + nSSet + nFSet));
169 Vec_IntFill( vLits, nMintsF, -1 );
170 for ( m = 0; m < (1 << nVars); m++ )
172 mNew = iBSet = iSSet = iFSet = 0;
173 for ( v = 0; v < nVars; v++ )
175 Value = ((uSet >> (v << 1)) & 3);
178 if ( ((m >> v) & 1) )
179 mNew |= 1 << (nLutSize + nSSet + iFSet), pFSet[iFSet] = v;
182 else if ( Value == 1 )
184 if ( ((m >> v) & 1) )
185 mNew |= 1 << (nSSet + iBSet), pBSet[iBSet] = v;
188 else if ( Value == 3 )
190 if ( ((m >> v) & 1) )
193 mNew |= 1 << (nLutSize + iSSet);
198 else assert( Value == 0 );
200 assert( iBSet == nBSet && iFSet == nFSet );
201 assert( Vec_IntEntry(vLits, mNew) == -1 );
202 Vec_IntWriteEntry( vLits, mNew, Abc_TtGetBit(pTruth, m) );
210 Vec_IntWriteEntry( vLits, v++, Abc_Var2Lit(2 * nMintsL + m, !Value) );
212 Vec_IntShrink( vLits, v );
215 Value =
sat_solver_solve(
p, Vec_IntArray(vLits), Vec_IntArray(vLits) + Vec_IntSize(vLits), 0, 0, 0, 0 );
218 if ( pTBound && pTFree )
221 assert( nSSet + nBSet <= nLutSize );
223 nMintsLNew = (1 << (nSSet + nBSet));
224 for ( m = 0; m < nMintsLNew; m++ )
225 if ( sat_solver_var_value(
p, m) )
226 Abc_TtSetBit( pTBound, m );
227 *pTBound = Abc_Tt6Stretch( *pTBound, nSSet + nBSet );
229 assert( nSSet + nFSet + 1 <= nLutSize );
231 nMintsLNew = (1 << (1 + nSSet + nFSet));
232 for ( m = 0; m < nMintsLNew; m++ )
233 if ( sat_solver_var_value(
p, nMintsL+m) )
234 Abc_TtSetBit( pTFree, m );
235 *pTFree = Abc_Tt6Stretch( *pTFree, 1 + nSSet + nFSet );
236 if ( nVars != 6 || nLutSize != 4 )
239 Res =
If_ManSat6Truth( *pTBound, *pTFree, pBSet, nBSet, pSSet, nSSet, pFSet, nFSet );
240 if ( pTruth[0] != Res )
246 printf(
"Verification failed!\n" );
266 int nTotal = 2 * nLutSize - 1;
267 int nShared =
nTotal - nVars;
269 assert( nLutSize >= 2 && nLutSize <= 6 );
271 assert( nShared >= 0 && nShared < nLutSize - 1 );
275 for ( i[0] = 0; i[0] < nVars; i[0]++ )
276 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
278 uSet = (1 << (2*i[0])) | (1 << (2*i[1]));
279 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet, NULL, NULL, vLits) )
283 else if ( nLutSize == 3 )
285 for ( i[0] = 0; i[0] < nVars; i[0]++ )
286 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
287 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
289 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2]));
290 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet, NULL, NULL, vLits) )
295 for ( i[0] = 0; i[0] < nVars; i[0]++ )
296 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
297 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
299 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2]));
300 for ( s[0] = 0; s[0] < nLutSize; s[0]++ )
301 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])), NULL, NULL, vLits) )
302 return uSet | (3 << (2*i[s[0]]));
305 else if ( nLutSize == 4 )
307 for ( i[0] = 0; i[0] < nVars; i[0]++ )
308 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
309 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
310 for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ )
312 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3]));
313 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet, NULL, NULL, vLits) )
318 for ( i[0] = 0; i[0] < nVars; i[0]++ )
319 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
320 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
321 for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ )
323 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3]));
324 for ( s[0] = 0; s[0] < nLutSize; s[0]++ )
325 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])), NULL, NULL, vLits) )
326 return uSet | (3 << (2*i[s[0]]));
330 for ( i[0] = 0; i[0] < nVars; i[0]++ )
331 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
332 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
333 for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ )
335 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3]));
337 for ( s[0] = 0; s[0] < nLutSize; s[0]++ )
338 for ( s[1] = s[0]+1; s[1] < nLutSize; s[1]++ )
339 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])), NULL, NULL, vLits) )
340 return uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]]));
344 else if ( nLutSize == 5 )
346 for ( i[0] = 0; i[0] < nVars; i[0]++ )
347 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
348 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
349 for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ )
350 for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ )
352 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4]));
353 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet, NULL, NULL, vLits) )
358 for ( i[0] = 0; i[0] < nVars; i[0]++ )
359 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
360 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
361 for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ )
362 for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ )
364 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4]));
365 for ( s[0] = 0; s[0] < nLutSize; s[0]++ )
366 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])), NULL, NULL, vLits) )
367 return uSet | (3 << (2*i[s[0]]));
371 for ( i[0] = 0; i[0] < nVars; i[0]++ )
372 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
373 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
374 for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ )
375 for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ )
377 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4]));
378 for ( s[0] = 0; s[0] < nLutSize; s[0]++ )
379 for ( s[1] = s[0]+1; s[1] < nLutSize; s[1]++ )
380 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])), NULL, NULL, vLits) )
381 return uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]]));
385 for ( i[0] = 0; i[0] < nVars; i[0]++ )
386 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
387 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
388 for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ )
389 for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ )
391 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4]));
392 for ( s[0] = 0; s[0] < nLutSize; s[0]++ )
393 for ( s[1] = s[0]+1; s[1] < nLutSize; s[1]++ )
394 for ( s[2] = s[1]+1; s[2] < nLutSize; s[2]++ )
395 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])) | (3 << (2*i[s[2]])), NULL, NULL, vLits) )
396 return uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])) | (3 << (2*i[s[2]]));
399 else if ( nLutSize == 6 )
401 for ( i[0] = 0; i[0] < nVars; i[0]++ )
402 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
403 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
404 for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ )
405 for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ )
406 for ( i[5] = i[4]+1; i[5] < nVars; i[5]++ )
408 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])) | (1 << (2*i[5]));
409 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet, NULL, NULL, vLits) )
414 for ( i[0] = 0; i[0] < nVars; i[0]++ )
415 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
416 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
417 for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ )
418 for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ )
419 for ( i[5] = i[4]+1; i[5] < nVars; i[5]++ )
421 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])) | (1 << (2*i[5]));
422 for ( s[0] = 0; s[0] < nLutSize; s[0]++ )
423 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])), NULL, NULL, vLits) )
424 return uSet | (3 << (2*i[s[0]]));
428 for ( i[0] = 0; i[0] < nVars; i[0]++ )
429 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
430 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
431 for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ )
432 for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ )
433 for ( i[5] = i[4]+1; i[5] < nVars; i[5]++ )
435 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])) | (1 << (2*i[5]));
436 for ( s[0] = 0; s[0] < nLutSize; s[0]++ )
437 for ( s[1] = s[0]+1; s[1] < nLutSize; s[1]++ )
438 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])), NULL, NULL, vLits) )
439 return uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]]));
443 for ( i[0] = 0; i[0] < nVars; i[0]++ )
444 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
445 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
446 for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ )
447 for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ )
448 for ( i[5] = i[4]+1; i[5] < nVars; i[5]++ )
450 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])) | (1 << (2*i[5]));
451 for ( s[0] = 0; s[0] < nLutSize; s[0]++ )
452 for ( s[1] = s[0]+1; s[1] < nLutSize; s[1]++ )
453 for ( s[2] = s[1]+1; s[2] < nLutSize; s[2]++ )
454 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])) | (3 << (2*i[s[2]])), NULL, NULL, vLits) )
455 return uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])) | (3 << (2*i[s[2]]));
459 for ( i[0] = 0; i[0] < nVars; i[0]++ )
460 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
461 for ( i[2] = i[1]+1; i[2] < nVars; i[2]++ )
462 for ( i[3] = i[2]+1; i[3] < nVars; i[3]++ )
463 for ( i[4] = i[3]+1; i[4] < nVars; i[4]++ )
464 for ( i[5] = i[4]+1; i[5] < nVars; i[5]++ )
466 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3])) | (1 << (2*i[4])) | (1 << (2*i[5]));
467 for ( s[0] = 0; s[0] < nLutSize; s[0]++ )
468 for ( s[1] = s[0]+1; s[1] < nLutSize; s[1]++ )
469 for ( s[2] = s[1]+1; s[2] < nLutSize; s[2]++ )
470 for ( s[3] = s[1]+1; s[3] < nLutSize; s[3]++ )
471 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])) | (3 << (2*i[s[2]])) | (3 << (2*i[s[3]])), NULL, NULL, vLits) )
472 return uSet | (3 << (2*i[s[0]])) | (3 << (2*i[s[1]])) | (3 << (2*i[s[2]])) | (3 << (2*i[s[3]]));