#include "mdd.h"
Go to the source code of this file.
Functions | |
static void | mdd_traverse (mdd_manager *mgr, bdd_t *top, boolean *mvar_present) |
static array_t * | mvars_extract (mdd_manager *mgr, mdd_t *fn) |
mdd_t * | mdd_cofactor (mdd_manager *mgr, mdd_t *fn, mdd_t *cube) |
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 }