00001 #include "mdd.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 mdd_t *
00019 mdd_case(
00020 mdd_manager *mgr,
00021 int mvar,
00022 array_t *child_list)
00023 {
00024 mvar_type mv;
00025 mdd_t *mnode;
00026 mdd_t *tmp;
00027 array_t *mvar_list = mdd_ret_mvar_list(mgr);
00028
00029 mv = array_fetch(mvar_type, mvar_list, mvar);
00030
00031 if (mv.values != array_n(child_list))
00032 fail("mdd_case: mvar.values different from length of child_list\n");
00033
00034 if (mv.status == MDD_BUNDLED) {
00035 (void) fprintf(stderr,
00036 "\nmdd_andsmooth: bundled variable %s used\n",mv.name);
00037 fail("");
00038 }
00039
00040 if (mv.values == 1) {
00041 tmp = array_fetch(mdd_t *, child_list, 0);
00042 mnode = mdd_dup(tmp);
00043 }
00044 else {
00045 mnode = mdd_encode(mgr, child_list, &mv, mv.encode_length-1);
00046 }
00047 return mnode;
00048 }
00049
00050
00051 mdd_t *
00052 mdd_encode(
00053 mdd_manager *mgr,
00054 array_t *child_list,
00055 mvar_type *mv_ptr,
00056 int index)
00057 {
00058 array_t *new_child_list;
00059 int i;
00060 int child_count = 0;
00061 int q = array_n(child_list);
00062 bvar_type bv;
00063 mdd_t *f, *g, *h, *t;
00064 mdd_t *one, *zero;
00065 array_t *bvar_list;
00066
00067 if (q == 1) {
00068 f = array_fetch(mdd_t *, child_list, 0);
00069 h = mdd_dup(f);
00070 if (!mdd_is_tautology(f,1) && !mdd_is_tautology(f,0)) mdd_free(f);
00071 return h;
00072 }
00073 one = mdd_one(mgr);
00074 zero = mdd_zero(mgr);
00075 bvar_list = mdd_ret_bvar_list(mgr);
00076
00077 new_child_list = array_alloc(mdd_t *, 0);
00078
00079 bv = mdd_ret_bvar(mv_ptr, index, bvar_list);
00080
00081 for (i=0; i<(q/2); i++) {
00082
00083 f = mdd_dup(bv.node);
00084 h = array_fetch(mdd_t *, child_list, child_count++);
00085 g = array_fetch(mdd_t *, child_list, child_count++);
00086 #if USE_ITE
00087 #if BYPASS
00088
00089
00090
00091
00092
00093
00094 if (mdd_is_tautology(g,0) && mdd_is_tautology(h,0)) {
00095 array_insert_last(mdd_t *, new_child_list, zero);
00096 }
00097 else if (mdd_is_tautology(g,0) && mdd_is_tautology(h,1)) {
00098 t = mdd_not(f);
00099 array_insert_last(mdd_t *, new_child_list, t);
00100 }
00101 else if (mdd_is_tautology(g,1) && mdd_is_tautology(h,1)) {
00102 array_insert_last(mdd_t *, new_child_list, one);
00103 }
00104 else if (mdd_is_tautology(g,1) && mdd_is_tautology(h,0)) {
00105 t = mdd_dup(f);
00106 array_insert_last(mdd_t *, new_child_list, t);
00107 }
00108 else if (mdd_equal(f,g)) {
00109 t = mdd_dup(f);
00110 array_insert_last(mdd_t *, new_child_list, t);
00111 }
00112 else {
00113 t = mdd_ite(f, g, h, 1, 1, 1);
00114 array_insert_last(mdd_t *, new_child_list, t);
00115 }
00116 if (!mdd_is_tautology(g,1) && !mdd_is_tautology(g,0)) mdd_free(g);
00117 if (!mdd_is_tautology(h,1) && !mdd_is_tautology(h,0)) mdd_free(h);
00118 #else
00119 t = mdd_ite(f, g, h, 1, 1, 1);
00120 if (!mdd_is_tautology(g,1) && !mdd_is_tautology(g,0)) mdd_free(g);
00121 if (!mdd_is_tautology(h,1) && !mdd_is_tautology(h,0)) mdd_free(h);
00122 array_insert_last(mdd_t *, new_child_list, t);
00123 #endif
00124 #else
00125 a1 = mdd_and(f,g,1,1);
00126 if (!mdd_is_tautology(g,1) && !mdd_is_tautology(g,0)) mdd_free(g);
00127 a2 = mdd_and(f,h,0,1);
00128 if (!mdd_is_tautology(h,1) && !mdd_is_tautology(h,0)) mdd_free(h);
00129 t = mdd_or(a1,a2,1,1);
00130
00131 if (!mdd_is_tautology(a1,1) && !mdd_is_tautology(a1,0)) mdd_free(a1);
00132 if (!mdd_is_tautology(a2,1) && !mdd_is_tautology(a2,0)) mdd_free(a2);
00133 array_insert_last(mdd_t *, new_child_list, t);
00134 #endif
00135
00136 mdd_free(f);
00137 }
00138
00139 if (q & 1) {
00140 t = array_fetch(mdd_t *, child_list, child_count);
00141 array_insert_last(mdd_t *, new_child_list, t);
00142 }
00143 f = mdd_encode(mgr, new_child_list, mv_ptr, index - 1);
00144 array_free(new_child_list);
00145 mdd_free(one);
00146 mdd_free(zero);
00147 return f;
00148 }
00149
00150
00151
00152
00153
00154
00155