00001 #include "mdd.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 static void
00019 mdd_pr_cubes(mdd_manager *mgr)
00020 {
00021 int i, j;
00022 array_t *mvar_list = mdd_ret_mvar_list(mgr);
00023 mvar_type mv;
00024
00025 for (i=0; i<array_n(mvar_list); i++) {
00026 mv = array_fetch(mvar_type, mvar_list, i);
00027 (void) printf("\n%s = ", mv.name);
00028 for (j=0; j<mv.encode_length; j++)
00029 (void) printf("%d",mv.encoding[j]);
00030 }
00031 (void) printf("\n");
00032 }
00033
00034 static void
00035 mdd_pr_minterms(mdd_manager *mgr)
00036 {
00037
00038
00039 int i, j;
00040 mvar_type mv;
00041 array_t *mvar_list = mdd_ret_mvar_list(mgr);
00042
00043 for (i=0; i<array_n(mvar_list); i++) {
00044 mv = array_fetch(mvar_type, mvar_list, i);
00045 (void) printf("\n%s = ", mv.name);
00046 for (j=0; j<mv.encode_length; j++)
00047 (void) printf("%d",mv.encoding[j]);
00048 }
00049 (void) printf("\n");
00050 }
00051
00052 void
00053 mdd_search(
00054 mdd_manager *mgr,
00055 bdd_t *top,
00056 int phase,
00057 boolean minterms)
00058 {
00059 int is_complemented;
00060 bdd_t *child, *top_uncomp;
00061
00062 if (mdd_is_tautology(top,1)) {
00063 if (phase == 1) {
00064 if (minterms == 1) mdd_pr_minterms(mgr);
00065 else mdd_pr_cubes(mgr);
00066 }
00067 return;
00068 }
00069 if (mdd_is_tautology(top,0)) {
00070 if (phase == 0) {
00071 if (minterms == 1) mdd_pr_minterms(mgr);
00072 else mdd_pr_cubes(mgr);
00073 }
00074 return;
00075 }
00076
00077 (void)bdd_get_node(top,&is_complemented);
00078
00079 if (is_complemented != 0) {
00080 phase = toggle(phase);
00081 }
00082
00083 (void) mdd_mark(mgr, top, 1);
00084
00085 if (is_complemented) top_uncomp = bdd_not(top);
00086 else top_uncomp = mdd_dup(top);
00087
00088 child = bdd_then(top_uncomp);
00089 mdd_search(mgr, child, phase, minterms);
00090 mdd_free(child);
00091
00092
00093 child = bdd_else(top_uncomp);
00094 (void) mdd_mark(mgr, top, 0);
00095 mdd_search(mgr, child, phase, minterms);
00096 mdd_unmark(mgr, top);
00097
00098 mdd_free(top_uncomp);
00099 mdd_free(child);
00100 return;
00101 }
00102
00103
00104
00105
00106
00107