src/mdd/mdd_case.c File Reference

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

Go to the source code of this file.

Functions

mdd_tmdd_case (mdd_manager *mgr, int mvar, array_t *child_list)
mdd_tmdd_encode (mdd_manager *mgr, array_t *child_list, mvar_type *mv_ptr, int index)

Function Documentation

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 }


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