#include "mdd.h"
Go to the source code of this file.
Functions | |
void | mdd_array_dump_dot (array_t *mdds, char *name, FILE *fp) |
void | mdd_dump_dot (mdd_t *mdd, char *name, FILE *fp) |
void | mdd_array_print_cover (array_t *mdds, char *name, boolean disjoint) |
void | mdd_print_cover (mdd_t *f, char *name, boolean disjoint) |
void mdd_array_dump_dot | ( | array_t * | mdds, | |
char * | name, | |||
FILE * | fp | |||
) |
Definition at line 54 of file mdd_dot.c.
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 /* Collect output nodes and names. */ 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 /* Set BDD variable names. */ 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 /* Get the job done. */ 00113 bdd_dump_dot(mgr, n_outputs, outputs, inames, onames, 00114 fp == NIL(FILE) ? stdout: fp); 00115 /* Clean up */ 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 } /* mdd_array_dump_dot */
Definition at line 150 of file mdd_dot.c.
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 /* Set BDD variable names. */ 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 /* First print header and then BDDs. */ 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 /* Clean up. */ 00216 for (i = 0; i < n_inputs; i++) { 00217 if (inames[i] != NIL(char)) FREE(inames[i]); 00218 } 00219 FREE(inames); 00220 00221 } /* mdd_array_print_cover */
void mdd_dump_dot | ( | mdd_t * | mdd, | |
char * | name, | |||
FILE * | fp | |||
) |
Definition at line 131 of file mdd_dot.c.
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 } /* mdd_dump_dot */
Definition at line 228 of file mdd_dot.c.
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 } /* mdd_array_print_cover */