#include "mdd.h"
Go to the source code of this file.
Functions | |
mdd_t * | mdd_case (mdd_manager *mgr, int mvar, array_t *child_list) |
mdd_t * | mdd_encode (mdd_manager *mgr, array_t *child_list, mvar_type *mv_ptr, int index) |
mdd_t* mdd_case | ( | mdd_manager * | mgr, | |
int | mvar, | |||
array_t * | child_list | |||
) |
Definition at line 19 of file mdd_case.c.
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 }
mdd_t* mdd_encode | ( | mdd_manager * | mgr, | |
array_t * | child_list, | |||
mvar_type * | mv_ptr, | |||
int | index | |||
) |
Definition at line 52 of file mdd_case.c.
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 /* bypasses cases */ 00089 /* 1 = ite(F,1,1) */ 00090 /* 0 = ite(F,0,0) */ 00091 /* F = ite(F,1,0) */ 00092 /* !F = ite(F,0,1) */ 00093 /* G = ite(F,G,G) */ 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 /* t = mdd_or(mdd_and(f,g,1,1), mdd_and(f,h,0,1), 1, 1); */ 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) { /* if q is odd */ 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 }