264{
265 unsigned uSet = 0;
266 int nTotal = 2 * nLutSize - 1;
267 int nShared =
nTotal - nVars;
268 int i[6], s[4];
269 assert( nLutSize >= 2 && nLutSize <= 6 );
271 assert( nShared >= 0 && nShared < nLutSize - 1 );
272 if ( nLutSize == 2 )
273 {
275 for ( i[0] = 0; i[0] < nVars; i[0]++ )
276 for ( i[1] = i[0]+1; i[1] < nVars; i[1]++ )
277 {
278 uSet = (1 << (2*i[0])) | (1 << (2*i[1]));
279 if (
If_ManSatCheckXY(pSat, nLutSize, pTruth, nVars, uSet, NULL, NULL, vLits) )
280 return uSet;
281 }
282 }
283 else if ( nLutSize == 3 )
284 {
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]++ )
288 {
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) )
291 return uSet;
292 }
293 if ( nShared < 1 )
294 return 0;
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]++ )
298 {
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]]));
303 }
304 }
305 else if ( nLutSize == 4 )
306 {
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]++ )
311 {
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) )
314 return uSet;
315 }
316 if ( nShared < 1 )
317 return 0;
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]++ )
322 {
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]]));
327 }
328 if ( nShared < 2 )
329 return 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]++ )
334 {
335 uSet = (1 << (2*i[0])) | (1 << (2*i[1])) | (1 << (2*i[2])) | (1 << (2*i[3]));
336 {
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]]));
341 }
342 }
343 }
344 else if ( nLutSize == 5 )
345 {
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]++ )
351 {
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) )
354 return uSet;
355 }
356 if ( nShared < 1 )
357 return 0;
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]++ )
363 {
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]]));
368 }
369 if ( nShared < 2 )
370 return 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]++ )
376 {
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]]));
382 }
383 if ( nShared < 3 )
384 return 0;
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]++ )
390 {
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]]));
397 }
398 }
399 else if ( nLutSize == 6 )
400 {
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]++ )
407 {
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) )
410 return uSet;
411 }
412 if ( nShared < 1 )
413 return 0;
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]++ )
420 {
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]]));
425 }
426 if ( nShared < 2 )
427 return 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]++ )
434 {
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]]));
440 }
441 if ( nShared < 3 )
442 return 0;
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]++ )
449 {
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]]));
456 }
457 if ( nShared < 4 )
458 return 0;
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]++ )
465 {
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]]));
473 }
474 }
475 return 0;
476}
int nTotal
DECLARATIONS ///.
int If_ManSatCheckXY(void *pSat, int nLutSize, word *pTruth, int nVars, unsigned uSet, word *pTBound, word *pTFree, Vec_Int_t *vLits)