src/mdd/mdd_dot.c File Reference

#include "mdd.h"
Include dependency graph for mdd_dot.c:

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)

Function Documentation

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 */

void mdd_array_print_cover ( array_t mdds,
char *  name,
boolean  disjoint 
)

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 */

void mdd_print_cover ( mdd_t f,
char *  name,
boolean  disjoint 
)

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 */


Generated on Tue Jan 12 13:57:25 2010 for glu-2.2 by  doxygen 1.6.1