00001 #include "mdd.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 mdd_t *
00019 mdd_func2c_mod(
00020 mdd_manager *mgr,
00021 int mvar1,
00022 int mvar2,
00023 int constant,
00024 boolean (*func4)(int, int, int, int))
00025 {
00026 mvar_type x, y;
00027 array_t *child_list_x, *child_list_y;
00028 int i, j;
00029 mdd_t *tx, *ty;
00030 array_t *mvar_list = mdd_ret_mvar_list(mgr);
00031 mdd_t *one, *zero;
00032
00033 x = array_fetch(mvar_type, mvar_list, mvar1);
00034 y = array_fetch(mvar_type, mvar_list, mvar2);
00035
00036 if (x.status == MDD_BUNDLED) {
00037 (void) fprintf(stderr,
00038 "\nWarning: mdd_func2c, bundled variable %s is used\n", x.name);
00039 fail("");
00040 }
00041
00042 if (y.status == MDD_BUNDLED) {
00043 (void) fprintf(stderr,
00044 "\nWarning: mdd_func2c, bundled variable %s is used\n", y.name);
00045 fail("");
00046 }
00047
00048 if((x.values != y.values) || ( constant < 0) || ( constant >= x.values) ) {
00049 (void) fprintf(stderr, "\n mdd_func2c_mod: Cannot operate with two different ranges\n");
00050 exit(1);
00051 }
00052
00053
00054 one = mdd_one(mgr);
00055 zero = mdd_zero(mgr);
00056
00057 child_list_x = array_alloc(mdd_t *, 0);
00058 for (i=0; i<x.values; i++) {
00059 child_list_y = array_alloc(mdd_t *, 0);
00060 for (j=0; j<y.values; j++) {
00061 if (func4(i,j,constant,x.values))
00062 array_insert_last(mdd_t *, child_list_y, one);
00063 else
00064 array_insert_last(mdd_t *, child_list_y, zero);
00065 }
00066 ty = mdd_case(mgr, mvar2, child_list_y);
00067 array_insert_last(mdd_t *, child_list_x, ty);
00068 array_free(child_list_y);
00069 }
00070 tx = mdd_case(mgr, mvar1, child_list_x);
00071 array_free(child_list_x);
00072
00073 mdd_free(zero);
00074 mdd_free(one);
00075
00076 return tx;
00077 }
00078
00079
00080
00081
00082
00083 boolean
00084 eq_plus3mod(int x, int y, int z, int range)
00085 {
00086 return (x == (y + z) % range);
00087 }
00088
00089 boolean
00090 geq_plus3mod(int x, int y, int z, int range)
00091 {
00092 return (x >= (y + z) % range);
00093 }
00094
00095 boolean
00096 gt_plus3mod(int x, int y, int z, int range)
00097 {
00098 return (x > (y + z) % range);
00099 }
00100
00101 boolean
00102 leq_plus3mod(int x, int y, int z, int range)
00103 {
00104 return (x <= (y + z) % range);
00105 }
00106
00107 boolean
00108 lt_plus3mod(int x, int y, int z, int range)
00109 {
00110 return (x < (y + z) % range);
00111 }
00112
00113 boolean
00114 neq_plus3mod(int x, int y, int z, int range)
00115 {
00116 return (x != (y + z) % range);
00117 }
00118
00119 boolean
00120 eq_minus3mod(int x, int y, int z, int range)
00121 {
00122 return (x == (y - z) % range);
00123 }
00124
00125 boolean
00126 geq_minus3mod(int x, int y, int z, int range)
00127 {
00128 return (x >= (y - z) % range);
00129 }
00130
00131 boolean
00132 gt_minus3mod(int x, int y, int z, int range)
00133 {
00134 return (x > (y - z) % range);
00135 }
00136
00137 boolean
00138 leq_minus3mod(int x, int y, int z, int range)
00139 {
00140 return (x <= (y - z) % range);
00141 }
00142
00143 boolean
00144 lt_minus3mod(int x, int y, int z, int range)
00145 {
00146 return (x < (y - z) % range);
00147 }
00148
00149 boolean
00150 neq_minus3mod(int x, int y, int z, int range)
00151 {
00152 return (x != (y - z) % range);
00153 }
00154
00155
00156
00157
00158
00159