00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #include "mdd.h"
00048
00049
00050
00051
00052
00053 void
00054 mdd_array_dump_dot(
00055 array_t *mdds ,
00056 char *name ,
00057 FILE *fp
00058 )
00059 {
00060 mdd_manager *mgr;
00061 array_t *mvar_list;
00062 int i, n_mvar, k;
00063 int n_outputs = array_n(mdds);
00064 int n_inputs = 0;
00065 bdd_node **outputs = NULL;
00066 char **onames = NULL;
00067 char **inames = NULL;
00068
00069 if (mdds == NIL(array_t) || n_outputs == 0) return;
00070
00071 mgr = mdd_get_manager(array_fetch(mdd_t *, mdds, 0));
00072 n_inputs = bdd_num_vars(mgr);
00073 mvar_list = mdd_ret_mvar_list(mgr);
00074 n_mvar = array_n(mvar_list);
00075
00076 outputs = ALLOC(bdd_node *, n_outputs);
00077 onames = ALLOC(char *, n_outputs);
00078 if (n_outputs == 1) {
00079 outputs[0] = array_fetch(mdd_t *, mdds, 0);
00080 onames[0] = strdup(name == NIL(char) ? "" : name);
00081 } else {
00082 for (i = 0; i < n_outputs; i++) {
00083 mdd_t *mdd = array_fetch(mdd_t *, mdds, i);
00084 outputs[i] = bdd_extract_node_as_is(mdd);
00085 if (name == NIL(char)) {
00086 onames[i] = ALLOC(char, integer_get_num_of_digits(i) + 1);
00087 sprintf(onames[i], "%d", i);
00088 } else {
00089 onames[i] = ALLOC(char, strlen(name) +
00090 integer_get_num_of_digits(i) + 2);
00091 sprintf(onames[i], "%s %d", name, i);
00092 }
00093 }
00094 }
00095 inames = ALLOC(char *, n_inputs);
00096
00097 k = 0;
00098 for (i = 0; i < n_mvar; i++) {
00099 int j;
00100 mvar_type mv = array_fetch(mvar_type, mvar_list, i);
00101 if (mv.encode_length == 1) {
00102 inames[k] = strdup(mv.name);
00103 k++;
00104 } else {
00105 for (j = 0; j < mv.encode_length; j++, k++) {
00106 inames[k] = ALLOC(char, strlen(mv.name) +
00107 integer_get_num_of_digits(j) + 2);
00108 sprintf(inames[k], "%s %d", mv.name, j);
00109 }
00110 }
00111 }
00112
00113 bdd_dump_dot(mgr, n_outputs, outputs, inames, onames,
00114 fp == NIL(FILE) ? stdout: fp);
00115
00116 FREE(outputs);
00117 for (i = 0; i < n_outputs; i++) {
00118 FREE(onames[i]);
00119 }
00120 FREE(onames);
00121 for (i = 0; i < n_inputs; i++) {
00122 FREE(inames[i]);
00123 }
00124 FREE(inames);
00125
00126 }
00127
00128
00129
00130 void
00131 mdd_dump_dot(
00132 mdd_t *mdd ,
00133 char *name ,
00134 FILE *fp
00135 )
00136 {
00137 array_t *arr = array_alloc(mdd_t *, 1);
00138
00139 array_insert_last(mdd_t *, arr, mdd);
00140 mdd_array_dump_dot(arr, name, fp);
00141 array_free(arr);
00142
00143 }
00144
00145
00146
00147
00148
00149 void
00150 mdd_array_print_cover(
00151 array_t *mdds ,
00152 char *name ,
00153 boolean disjoint
00154 )
00155 {
00156 mdd_manager *mgr;
00157 mdd_t *f;
00158 array_t *mvar_list;
00159 int i, n_mvar, n_bvar;
00160 int n_inputs = 0;
00161 char **inames = NULL;
00162 int height;
00163
00164 if (mdds == NIL(array_t) || array_n(mdds) == 0) return;
00165
00166 mgr = mdd_get_manager(array_fetch(mdd_t *, mdds, 0));
00167 n_inputs = bdd_num_vars(mgr);
00168 mvar_list = mdd_ret_mvar_list(mgr);
00169 n_mvar = array_n(mvar_list);
00170 n_bvar = array_n(mdd_ret_bvar_list(mgr));
00171 height = name == NIL(char) ? 0 : strlen(name);
00172 inames = ALLOC(char *, n_inputs);
00173 for (i = 0; i < n_inputs; i++) inames[i] = NIL(char);
00174
00175 for (i = 0; i < n_mvar; i++) {
00176 mvar_type mv = array_fetch(mvar_type, mvar_list, i);
00177 if (mv.encode_length == 1) {
00178 int k = array_fetch(int, mv.bvars, 0);
00179 inames[k] = strdup(mv.name);
00180 height = MAX(height,strlen(inames[k]));
00181 } else {
00182 int j;
00183 for (j = 0; j < mv.encode_length; j++) {
00184 int k = array_fetch(int, mv.bvars, j);
00185 inames[k] = ALLOC(char, strlen(mv.name) +
00186 integer_get_num_of_digits(j) + 2);
00187 sprintf(inames[k], "%s %d", mv.name, j);
00188 height = MAX(height,strlen(inames[k]));
00189 }
00190 }
00191 }
00192
00193
00194 for (i = 0; i < height; i++) {
00195 int j;
00196 for (j = 0; j < n_inputs; j++) {
00197 if (inames[j] == NIL(char) || i >= strlen(inames[j])) {
00198 printf(" ");
00199 } else {
00200 printf("%c", inames[j][i]);
00201 }
00202 }
00203 if (disjoint) printf(" ");
00204 printf(" %c\n", name == NIL(char) || i >= strlen(name) ? ' ' : name[i]);
00205 }
00206 printf("\n");
00207 arrayForEachItem(mdd_t *, mdds, i, f) {
00208 if (disjoint) {
00209 bdd_print_minterm(f);
00210 printf("\n");
00211 } else {
00212 bdd_print_cover(f);
00213 }
00214 }
00215
00216 for (i = 0; i < n_inputs; i++) {
00217 if (inames[i] != NIL(char)) FREE(inames[i]);
00218 }
00219 FREE(inames);
00220
00221 }
00222
00223
00224
00225
00226
00227 void
00228 mdd_print_cover(
00229 mdd_t *f ,
00230 char *name ,
00231 boolean disjoint
00232 )
00233 {
00234 array_t *arr = array_alloc(mdd_t *, 1);
00235
00236 array_insert_last(mdd_t *, arr, f);
00237 mdd_array_print_cover(arr, name, disjoint);
00238 array_free(arr);
00239
00240 }