212 int d,
p, n, s, v, h, w;
220 if ( !Cudd_bddLeq( dd, OnSet, Cudd_Not(OffSet) ) )
222 fprintf( Output,
"PrintKMap(): The on-set and the off-set overlap\n" );
226 { printf(
"Function is constant %d.\n", !Cudd_IsComplement(OnSet) );
return; }
231 DdNode * bCube, * bPart;
232 printf(
"Truth table: " );
234 printf(
"Constant" );
235 else if ( nVars == 1 )
236 printf(
"1-var function" );
240 for ( d = (1<<(nVars-2)) - 1; d >= 0; d-- )
243 for ( s = 0; s < 4; s++ )
246 bPart = Cudd_Cofactor( dd, OnSet, bCube ); Cudd_Ref( bPart );
247 Value |= ((int)(bPart ==
b1) << s);
248 Cudd_RecursiveDeref( dd, bPart );
249 Cudd_RecursiveDeref( dd, bCube );
252 fprintf( stdout,
"%d", Value );
254 fprintf( stdout,
"%c",
'a' + Value-10 );
273 if ( nVars < 0 || nVars >
MAXVARS )
275 fprintf( Output,
"PrintKMap(): The number of variables is less than zero or more than %d\n",
MAXVARS );
282 if ( fSuppType == 0 )
285 for ( v = 0; v < nVars; v++ )
286 s_XVars[v] = Cudd_bddIthVar( dd, v );
288 else if ( fSuppType == 1 )
291 for ( v = 0; v < nVars; v++ )
292 s_XVars[v] = Cudd_bddIthVar( dd, dd->invperm[v] );
296 DdNode * SuppOn, * SuppOff, * Supp;
301 SuppOn = Cudd_Support( dd, OnSet ); Cudd_Ref( SuppOn );
302 SuppOff = Cudd_Support( dd, OffSet ); Cudd_Ref( SuppOff );
303 Supp = Cudd_bddAnd( dd, SuppOn, SuppOff ); Cudd_Ref( Supp );
304 Cudd_RecursiveDeref( dd, SuppOn );
305 Cudd_RecursiveDeref( dd, SuppOff );
307 nVars = Cudd_SupportSize( dd, Supp );
310 fprintf( Output,
"PrintKMap(): The number of variables is more than %d\n",
MAXVARS );
311 Cudd_RecursiveDeref( dd, Supp );
316 for ( TempSupp = Supp; TempSupp != dd->one; TempSupp = Cudd_T(TempSupp), cVars++ )
317 s_XVars[cVars] = Cudd_bddIthVar( dd, TempSupp->index );
319 Cudd_RecursiveDeref( dd, TempSupp );
326 for ( v = 0; v < nVars; v++ )
327 s_XVars[v] = XVars[v];
333 nVarsHor = nVars - nVarsVer;
335 nCellsVer = (1<<nVarsVer);
336 nCellsHor = (1<<nVarsHor);
337 nSkipSpaces = nVarsVer + 1;
341 fprintf( Output,
"\n" );
342 for ( w = 0; w < nVarsVer; w++ )
343 if ( pVarNames == NULL )
344 fprintf( Output,
"%c",
'a'+nVarsHor+w );
346 fprintf( Output,
" %s", pVarNames[nVarsHor+w] );
348 if ( fHorizontalVarNamesPrintedAbove )
350 fprintf( Output,
" \\ " );
351 for ( w = 0; w < nVarsHor; w++ )
352 if ( pVarNames == NULL )
353 fprintf( Output,
"%c",
'a'+w );
355 fprintf( Output,
"%s ", pVarNames[w] );
357 fprintf( Output,
"\n" );
359 if ( fHorizontalVarNamesPrintedAbove )
363 for ( d = 0; d < nVarsHor; d++ )
365 for (
p = 0;
p < nSkipSpaces + 2;
p++, fprintf( Output,
" " ) );
366 for ( n = 0; n < nCellsHor; n++ )
367 if (
GrayCode(n) & (1<<(nVarsHor-1-d)) )
368 fprintf( Output,
"1 " );
370 fprintf( Output,
"0 " );
371 fprintf( Output,
"\n" );
377 for (
p = 0;
p < nSkipSpaces;
p++, fprintf( Output,
" " ) );
379 for ( s = 0; s < nCellsHor; s++ )
384 if ( s != nCellsHor-1 )
393 fprintf( Output,
"\n" );
397 for ( v = 0; v < nCellsVer; v++ )
403 for ( n = 0; n < nVarsVer; n++ )
404 if (
GrayCode(v) & (1<<(nVarsVer-1-n)) )
405 fprintf( Output,
"1" );
407 fprintf( Output,
"0" );
408 fprintf( Output,
" " );
415 for ( h = 0; h < nCellsHor; h++ )
417 DdNode * CubeHorBDD, * Prod, * ValueOnSet, * ValueOffSet;
419 fprintf( Output,
" " );
424 Prod = Cudd_bddAnd( dd, CubeHorBDD, CubeVerBDD ); Cudd_Ref( Prod );
425 Cudd_RecursiveDeref( dd, CubeHorBDD );
427 ValueOnSet = Cudd_Cofactor( dd, OnSet, Prod ); Cudd_Ref( ValueOnSet );
428 ValueOffSet = Cudd_Cofactor( dd, OffSet, Prod ); Cudd_Ref( ValueOffSet );
429 Cudd_RecursiveDeref( dd, Prod );
433 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
434 char Symb = 0, Color = 0;
435 if ( ValueOnSet ==
b1 && ValueOffSet ==
b0 )
437 else if ( ValueOnSet ==
b0 && ValueOffSet ==
b1 )
439 else if ( ValueOnSet ==
b0 && ValueOffSet ==
b0 )
441 else if ( ValueOnSet ==
b1 && ValueOffSet ==
b1 )
445 SetConsoleTextAttribute( hConsole, Color );
446 fprintf( Output,
"%c", Symb );
447 SetConsoleTextAttribute( hConsole, 7 );
451 if ( ValueOnSet ==
b1 && ValueOffSet ==
b0 )
453 else if ( ValueOnSet ==
b0 && ValueOffSet ==
b1 )
455 else if ( ValueOnSet ==
b0 && ValueOffSet ==
b0 )
457 else if ( ValueOnSet ==
b1 && ValueOffSet ==
b1 )
464 Cudd_RecursiveDeref( dd, ValueOnSet );
465 Cudd_RecursiveDeref( dd, ValueOffSet );
467 fprintf( Output,
" " );
469 if ( h != nCellsHor-1 )
478 fprintf( Output,
"\n" );
480 Cudd_RecursiveDeref( dd, CubeVerBDD );
482 if ( v != nCellsVer-1 )
485 for (
p = 0;
p < nSkipSpaces;
p++, fprintf( Output,
" " ) );
489 for ( s = 0; s < nCellsHor; s++ )
494 if ( s != nCellsHor-1 )
507 for ( s = 0; s < nCellsHor; s++ )
512 if ( s != nCellsHor-1 )
522 fprintf( Output,
"\n" );
528 for (
p = 0;
p < nSkipSpaces;
p++, fprintf( Output,
" " ) );
530 for ( s = 0; s < nCellsHor; s++ )
535 if ( s != nCellsHor-1 )
544 fprintf( Output,
"\n" );
546 if ( !fHorizontalVarNamesPrintedAbove )
550 for ( d = 0; d < nVarsHor; d++ )
552 for (
p = 0;
p < nSkipSpaces + 2;
p++, fprintf( Output,
" " ) );
553 for ( n = 0; n < nCellsHor; n++ )
554 if (
GrayCode(n) & (1<<(nVarsHor-1-d)) )
555 fprintf( Output,
"1 " );
557 fprintf( Output,
"0 " );
560 fprintf( Output,
"%c", (
char)(
'a'+d) );
562 fprintf( Output,
"\n" );
591 int d,
p, n, s, v, h, w;
600 if ( !Cudd_bddLeq( dd, OnSet, Cudd_Not(OffSet) ) )
602 fprintf( Output,
"PrintKMap(): The on-set and the off-set overlap\n" );
608 fprintf( Output,
"PrintKMap(): Constant 1\n" );
613 fprintf( Output,
"PrintKMap(): Constant 0\n" );
617 nVars = nXVars + nYVars;
618 if ( nVars < 0 || nVars >
MAXVARS )
620 fprintf( Output,
"PrintKMap(): The number of variables is less than zero or more than %d\n",
MAXVARS );
629 nCellsVer = (1<<nVarsVer);
630 nCellsHor = (1<<nVarsHor);
631 nSkipSpaces = nVarsVer + 1;
635 fprintf( Output,
"\n" );
636 for ( w = 0; w < nVarsVer; w++ )
637 fprintf( Output,
"%c",
'a'+nVarsHor+w );
638 if ( fHorizontalVarNamesPrintedAbove )
640 fprintf( Output,
" \\ " );
641 for ( w = 0; w < nVarsHor; w++ )
642 fprintf( Output,
"%c",
'a'+w );
644 fprintf( Output,
"\n" );
646 if ( fHorizontalVarNamesPrintedAbove )
650 for ( d = 0; d < nVarsHor; d++ )
652 for (
p = 0;
p < nSkipSpaces + 2;
p++, fprintf( Output,
" " ) );
653 for ( n = 0; n < nCellsHor; n++ )
654 if (
GrayCode(n) & (1<<(nVarsHor-1-d)) )
655 fprintf( Output,
"1 " );
657 fprintf( Output,
"0 " );
658 fprintf( Output,
"\n" );
664 for (
p = 0;
p < nSkipSpaces;
p++, fprintf( Output,
" " ) );
666 for ( s = 0; s < nCellsHor; s++ )
671 if ( s != nCellsHor-1 )
680 fprintf( Output,
"\n" );
684 for ( v = 0; v < nCellsVer; v++ )
690 for ( n = 0; n < nVarsVer; n++ )
691 if (
GrayCode(v) & (1<<(nVarsVer-1-n)) )
692 fprintf( Output,
"1" );
694 fprintf( Output,
"0" );
695 fprintf( Output,
" " );
703 for ( h = 0; h < nCellsHor; h++ )
705 DdNode * CubeHorBDD, * Prod, * ValueOnSet, * ValueOffSet;
707 fprintf( Output,
" " );
713 Prod = Cudd_bddAnd( dd, CubeHorBDD, CubeVerBDD ); Cudd_Ref( Prod );
714 Cudd_RecursiveDeref( dd, CubeHorBDD );
716 ValueOnSet = Cudd_Cofactor( dd, OnSet, Prod ); Cudd_Ref( ValueOnSet );
717 ValueOffSet = Cudd_Cofactor( dd, OffSet, Prod ); Cudd_Ref( ValueOffSet );
718 Cudd_RecursiveDeref( dd, Prod );
720 if ( ValueOnSet ==
b1 && ValueOffSet ==
b0 )
722 else if ( ValueOnSet ==
b0 && ValueOffSet ==
b1 )
724 else if ( ValueOnSet ==
b0 && ValueOffSet ==
b0 )
726 else if ( ValueOnSet ==
b1 && ValueOffSet ==
b1 )
731 Cudd_RecursiveDeref( dd, ValueOnSet );
732 Cudd_RecursiveDeref( dd, ValueOffSet );
734 fprintf( Output,
" " );
736 if ( h != nCellsHor-1 )
745 fprintf( Output,
"\n" );
747 Cudd_RecursiveDeref( dd, CubeVerBDD );
749 if ( v != nCellsVer-1 )
752 for (
p = 0;
p < nSkipSpaces;
p++, fprintf( Output,
" " ) );
756 for ( s = 0; s < nCellsHor; s++ )
761 if ( s != nCellsHor-1 )
774 for ( s = 0; s < nCellsHor; s++ )
779 if ( s != nCellsHor-1 )
789 fprintf( Output,
"\n" );
795 for (
p = 0;
p < nSkipSpaces;
p++, fprintf( Output,
" " ) );
797 for ( s = 0; s < nCellsHor; s++ )
802 if ( s != nCellsHor-1 )
811 fprintf( Output,
"\n" );
813 if ( !fHorizontalVarNamesPrintedAbove )
817 for ( d = 0; d < nVarsHor; d++ )
819 for (
p = 0;
p < nSkipSpaces + 2;
p++, fprintf( Output,
" " ) );
820 for ( n = 0; n < nCellsHor; n++ )
821 if (
GrayCode(n) & (1<<(nVarsHor-1-d)) )
822 fprintf( Output,
"1 " );
824 fprintf( Output,
"0 " );
827 fprintf( Output,
"%c", (
char)(
'a'+d) );
829 fprintf( Output,
"\n" );