00001 #include "mdd.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 static void mdd_traverse(mdd_manager *mgr, bdd_t *top, boolean *mvar_present);
00025 static array_t * mvars_extract(mdd_manager *mgr, mdd_t *fn);
00026
00027
00028
00029
00030
00031 mdd_t *
00032 mdd_cofactor(
00033 mdd_manager *mgr,
00034 mdd_t *fn,
00035 mdd_t *cube)
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 }
00045
00046
00047
00048
00049
00050 static void
00051 mdd_traverse(
00052 mdd_manager *mgr,
00053 bdd_t *top,
00054 boolean *mvar_present)
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 }
00102
00103
00104 static array_t *
00105 mvars_extract(
00106 mdd_manager *mgr,
00107 mdd_t *fn)
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 }