00001
00002
00003
00004 #include "bddint.h"
00005
00006
00007 static
00008 void
00009 chars(char c, int n, FILE *fp)
00010 {
00011 int i;
00012
00013 for (i=0; i < n; ++i)
00014 fputc(c, fp);
00015 }
00016
00017
00018 static
00019 void
00020 bdd_print_top_var(cmu_bdd_manager bddm,
00021 bdd f,
00022 char *(*var_naming_fn)(cmu_bdd_manager, bdd, pointer),
00023 pointer env,
00024 FILE *fp)
00025 {
00026 BDD_SETUP(f);
00027 fputs(bdd_var_name(bddm, BDD_IF(bddm, f), var_naming_fn, env), fp);
00028 fputc('\n', fp);
00029 }
00030
00031
00032 static
00033 void
00034 cmu_bdd_print_bdd_step(cmu_bdd_manager bddm,
00035 bdd f,
00036 char *(*var_naming_fn)(cmu_bdd_manager, bdd, pointer),
00037 char *(*terminal_id_fn)(cmu_bdd_manager, INT_PTR, INT_PTR, pointer),
00038 pointer env,
00039 FILE *fp,
00040 hash_table h,
00041 int indentation)
00042 {
00043 int negated;
00044 long *number;
00045
00046 BDD_SETUP(f);
00047 chars(' ', indentation, fp);
00048 switch (cmu_bdd_type_aux(bddm, f))
00049 {
00050 case BDD_TYPE_ZERO:
00051 case BDD_TYPE_ONE:
00052 case BDD_TYPE_CONSTANT:
00053 fputs(bdd_terminal_id(bddm, f, terminal_id_fn, env), fp);
00054 fputc('\n', fp);
00055 break;
00056 case BDD_TYPE_NEGVAR:
00057 fputc('!', fp);
00058
00059 case BDD_TYPE_POSVAR:
00060 bdd_print_top_var(bddm, f, var_naming_fn, env, fp);
00061 break;
00062 case BDD_TYPE_NONTERMINAL:
00063 if (bdd_lookup_in_hash_table(h, BDD_NOT(f)))
00064 {
00065 f=BDD_NOT(f);
00066 negated=1;
00067 }
00068 else
00069 negated=0;
00070 number=(long *)bdd_lookup_in_hash_table(h, f);
00071 if (number && *number < 0)
00072 {
00073 if (negated)
00074 fputc('!', fp);
00075 fprintf(fp, "subformula %ld\n", -*number-1);
00076 }
00077 else
00078 {
00079 if (number)
00080 {
00081 fprintf(fp, "%ld: ", *number);
00082 *number= -*number-1;
00083 }
00084 fputs("if ", fp);
00085 bdd_print_top_var(bddm, f, var_naming_fn, env, fp);
00086 cmu_bdd_print_bdd_step(bddm, BDD_THEN(f), var_naming_fn, terminal_id_fn, env, fp, h, indentation+2);
00087 chars(' ', indentation, fp);
00088 fputs("else if !", fp);
00089 bdd_print_top_var(bddm, f, var_naming_fn, env, fp);
00090 cmu_bdd_print_bdd_step(bddm, BDD_ELSE(f), var_naming_fn, terminal_id_fn, env, fp, h, indentation+2);
00091 chars(' ', indentation, fp);
00092 fputs("endif ", fp);
00093 bdd_print_top_var(bddm, f, var_naming_fn, env, fp);
00094 }
00095 break;
00096 default:
00097 cmu_bdd_fatal("cmu_bdd_print_bdd_step: unknown type returned by cmu_bdd_type");
00098 }
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113 void
00114 cmu_bdd_print_bdd(cmu_bdd_manager bddm,
00115 bdd f,
00116 char *(*var_naming_fn)(cmu_bdd_manager, bdd, pointer),
00117 char *(*terminal_id_fn)(cmu_bdd_manager, INT_PTR, INT_PTR, pointer),
00118 pointer env,
00119 FILE *fp)
00120 {
00121 long next;
00122 hash_table h;
00123
00124 if (!bdd_check_arguments(1, f))
00125 {
00126 fprintf(fp, "overflow\n");
00127 return;
00128 }
00129 bdd_mark_shared_nodes(bddm, f);
00130 h=bdd_new_hash_table(bddm, sizeof(long));
00131 next=0;
00132 bdd_number_shared_nodes(bddm, f, h, &next);
00133 cmu_bdd_print_bdd_step(bddm, f, var_naming_fn, terminal_id_fn, env, fp, h, 0);
00134 cmu_bdd_free_hash_table(h);
00135 }