00001
00002
00003
00004
00005
00006 #include "mdd.h"
00007
00008 static int
00009 mdd_is_care_bit(
00010 mvar_type mvar,
00011 int index)
00012 {
00013 return ( getbit( ( (int) pow(2.0, (double)mvar.encode_length) ) - mvar.values, mvar.encode_length-index-1));
00014 }
00015
00016
00017 mdd_t *
00018 mdd_ineq_template_s(
00019 mdd_manager *mgr,
00020 int mvar1,
00021 int mvar2,
00022 int zero_then_val ,
00023 int one_else_val ,
00024 int bottom_val )
00025 {
00026 mvar_type x, y;
00027 bvar_type bx, by;
00028 mdd_t *one_top, *zero_top, *zero_then, *one_else,
00029 *one_top_else = mdd_one(mgr);
00030 mdd_t *one_top_then = mdd_one(mgr);
00031 mdd_t *zero_top_else = mdd_one(mgr);
00032 mdd_t *zero_top_then = mdd_one(mgr);
00033 mdd_t *compare;
00034 int i;
00035
00036 array_t *mvar_list = mdd_ret_mvar_list(mgr);
00037 array_t *bvar_list = mdd_ret_bvar_list(mgr);
00038
00039 if (zero_then_val == 0)
00040 zero_then = mdd_zero(mgr);
00041 else
00042 zero_then = mdd_one(mgr);
00043
00044
00045 if (one_else_val == 0)
00046 one_else = mdd_zero(mgr);
00047 else
00048 one_else = mdd_one(mgr);
00049
00050 if (bottom_val == 0) {
00051 one_top = mdd_zero(mgr);
00052 zero_top = mdd_zero(mgr);
00053 }
00054 else {
00055 one_top = mdd_one(mgr);
00056 zero_top = mdd_one(mgr);
00057 }
00058
00059
00060 x = array_fetch(mvar_type, mvar_list, mvar1);
00061 y = array_fetch(mvar_type, mvar_list, mvar2);
00062
00063 if (x.values != y.values)
00064 fail("mdd_ineq: 2 mvars have incompatible value ranges\n");
00065
00066 if (x.status == MDD_BUNDLED) {
00067 (void) fprintf(stderr,
00068 "\nWarning: mdd_ineq, bundled variable %s is used\n", x.name);
00069 fail("");
00070 }
00071
00072 if (y.status == MDD_BUNDLED) {
00073 (void) fprintf(stderr,
00074 "\nWarning: mdd_ineq, bundled variable %s is used\n", y.name);
00075 fail("");
00076 }
00077
00078
00079 for (i=(x.encode_length-1); i>=0; i--) {
00080
00081 bx = mdd_ret_bvar(&x, i, bvar_list);
00082 by = mdd_ret_bvar(&y, i, bvar_list);
00083
00084 mdd_free(zero_top_else);
00085 zero_top_else = mdd_ite(by.node, zero_then, zero_top, 1, 1, 1);
00086 mdd_free(zero_top_then);
00087 zero_top_then = mdd_ite(by.node, zero_top, one_else, 1, 1, 1);
00088
00089 if (mdd_is_care_bit(x,i) == 0) {
00090
00091 mdd_free(one_top_else);
00092 one_top_else = mdd_ite(by.node, zero_then, zero_top, 1, 1, 1);
00093 mdd_free(one_top_then);
00094 one_top_then = mdd_ite(by.node, one_top, one_else, 1, 1, 1);
00095
00096 mdd_free(one_top);
00097
00098 one_top = mdd_ite(bx.node, one_top_then, one_top_else, 1, 1, 1);
00099 }
00100
00101 mdd_free(zero_top);
00102 zero_top = mdd_ite(bx.node, zero_top_then, zero_top_else, 1, 1, 1);
00103
00104 }
00105
00106 mdd_free(zero_then);
00107 mdd_free(one_else);
00108
00109 mdd_free(zero_top_else);
00110 mdd_free(zero_top_then);
00111 mdd_free(one_top_else);
00112 mdd_free(one_top_then);
00113
00114 mdd_free(zero_top);
00115
00116 compare = mdd_eq(mgr, mvar1, mvar2);
00117
00118 if ( ( bdd_equal(compare, one_top) == 0) && (zero_then_val == 0) && (one_else_val == 0) && (bottom_val == 1) )
00119 printf("Error \n");
00120
00121 mdd_free(compare);
00122
00123 return one_top;
00124 }
00125
00126
00127
00128
00129
00130