src/mdd/mdd_cofactor.c File Reference

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

Go to the source code of this file.

Functions

static void mdd_traverse (mdd_manager *mgr, bdd_t *top, boolean *mvar_present)
static array_tmvars_extract (mdd_manager *mgr, mdd_t *fn)
mdd_tmdd_cofactor (mdd_manager *mgr, mdd_t *fn, mdd_t *cube)

Function Documentation

mdd_t* mdd_cofactor ( mdd_manager mgr,
mdd_t fn,
mdd_t cube 
)

Definition at line 32 of file mdd_cofactor.c.

00036 {
00037     array_t *mvars;
00038     mdd_t *top;
00039 
00040     mvars = mvars_extract(mgr, cube);
00041     top = mdd_and_smooth(mgr, fn, cube, mvars);
00042     array_free(mvars);
00043     return top;
00044 }

static void mdd_traverse ( mdd_manager mgr,
bdd_t top,
boolean mvar_present 
) [static]

Definition at line 51 of file mdd_cofactor.c.

00055 {
00056     bvar_type bv;
00057     array_t *bvar_list = mdd_ret_bvar_list(mgr);
00058     int is_complemented;
00059     bdd_t *uncomp_top, *child, *temp_child;
00060 
00061     if (bdd_is_tautology(top,1)) {
00062         return;
00063     }
00064     if (bdd_is_tautology(top,0)) {
00065         return;
00066     }
00067 
00068     (void)bdd_get_node(top,&is_complemented);
00069 
00070     bv = array_fetch(bvar_type, bvar_list, bdd_top_var_id(top));
00071     mvar_present[bv.mvar_id] = 1;
00072 
00073     if (is_complemented) uncomp_top = bdd_not(top);
00074     else uncomp_top = mdd_dup(top);
00075 
00076     child = bdd_then(uncomp_top);
00077     (void) bdd_get_node(child,&is_complemented);
00078     if (is_complemented) {
00079         temp_child = child;
00080         child = bdd_not(temp_child);
00081         mdd_free(temp_child);
00082     }
00083     
00084     mdd_traverse(mgr, child , mvar_present);
00085     mdd_free(child);
00086 
00087     child = bdd_else(uncomp_top);
00088     (void) bdd_get_node(child,&is_complemented);
00089     if (is_complemented) {
00090         temp_child = child;
00091         child = bdd_not(temp_child);
00092         mdd_free(temp_child);
00093     }
00094 
00095     mdd_traverse(mgr, child, mvar_present);
00096     
00097  
00098     mdd_free(child);
00099     mdd_free(uncomp_top);
00100     return;    
00101 }

static array_t * mvars_extract ( mdd_manager mgr,
mdd_t fn 
) [static]

Definition at line 105 of file mdd_cofactor.c.

00108 {
00109     int i, no_mvar;
00110     boolean *mvar_present;
00111     array_t *mvar_list = mdd_ret_mvar_list(mgr);
00112     array_t *mvars;
00113                                                                           
00114 
00115     mvars = array_alloc(int, 0);
00116     no_mvar = array_n(mvar_list);
00117     mvar_present = ALLOC(boolean, no_mvar);
00118     for (i=0; i<no_mvar; i++) mvar_present[i] = 0;
00119     mdd_traverse(mgr, fn, mvar_present);
00120     for (i=0; i<no_mvar; i++) 
00121         if (mvar_present[i] == 1) array_insert_last(int, mvars, i);
00122     FREE(mvar_present);
00123     return mvars;
00124 }


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