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_func3(
00020 mdd_manager *mgr,
00021 int mvar1,
00022 int mvar2,
00023 int mvar3,
00024 boolean (*func3)(int, int, int))
00025 {
00026 mvar_type x, y, z;
00027 array_t *child_list_x, *child_list_y, *child_list_z;
00028 int i, j, k;
00029 mdd_t *tx, *ty, *tz;
00030 array_t *mvar_list = mdd_ret_mvar_list(mgr);
00031 mdd_t *one, *zero;
00032
00033 one = mdd_one(mgr);
00034 zero = mdd_zero(mgr);
00035
00036 x = array_fetch(mvar_type, mvar_list, mvar1);
00037 y = array_fetch(mvar_type, mvar_list, mvar2);
00038 z = array_fetch(mvar_type, mvar_list, mvar3);
00039
00040 if (x.status == MDD_BUNDLED) {
00041 (void) fprintf(stderr,
00042 "\nWarning: mdd_func3, bundled variable %s is used\n", x.name);
00043 fail("");
00044 }
00045
00046 if (y.status == MDD_BUNDLED) {
00047 (void) fprintf(stderr,
00048 "\nWarning: mdd_func3, bundled variable %s is used\n", y.name);
00049 fail("");
00050 }
00051
00052 if (z.status == MDD_BUNDLED) {
00053 (void) fprintf(stderr,
00054 "\nWarning: mdd_func3, bundled variable %s is used\n", z.name);
00055 fail("");
00056 }
00057
00058
00059 child_list_x = array_alloc(mdd_t *, 0);
00060 for (i=0; i<x.values; i++) {
00061 child_list_y = array_alloc(mdd_t *, 0);
00062 for (j=0; j<y.values; j++) {
00063 child_list_z = array_alloc(mdd_t *, 0);
00064 for (k=0; k<z.values; k++) {
00065 if (func3(i,j,k))
00066 array_insert_last(mdd_t *, child_list_z, one);
00067 else
00068 array_insert_last(mdd_t *, child_list_z, zero);
00069 }
00070 tz = mdd_case(mgr, mvar3, child_list_z);
00071 array_insert_last(mdd_t *, child_list_y, tz);
00072 array_free(child_list_z);
00073 }
00074 ty = mdd_case(mgr, mvar2, child_list_y);
00075 array_insert_last(mdd_t *, child_list_x, ty);
00076 array_free(child_list_y);
00077 }
00078 tx = mdd_case(mgr, mvar1, child_list_x);
00079 array_free(child_list_x);
00080
00081 mdd_free(one);
00082 mdd_free(zero);
00083
00084 return tx;
00085 }
00086
00087
00088
00089 boolean
00090 eq_plus3(int x, int y, int z)
00091 {
00092 return (x == y + z);
00093 }
00094
00095 boolean
00096 geq_plus3(int x, int y, int z)
00097 {
00098 return (x >= y + z);
00099 }
00100
00101 boolean
00102 gt_plus3(int x, int y, int z)
00103 {
00104 return (x > y + z);
00105 }
00106
00107 boolean
00108 leq_plus3(int x, int y, int z)
00109 {
00110 return (x <= y + z);
00111 }
00112
00113 boolean
00114 lt_plus3(int x, int y, int z)
00115 {
00116 return (x < y + z);
00117 }
00118
00119 boolean
00120 neq_plus3(int x, int y, int z)
00121 {
00122 return (x != y + z);
00123 }
00124
00125 boolean
00126 eq_minus3(int x, int y, int z)
00127 {
00128 return (x == y - z);
00129 }
00130
00131 boolean
00132 geq_minus3(int x, int y, int z)
00133 {
00134 return (x >= y - z);
00135 }
00136
00137 boolean
00138 gt_minus3(int x, int y, int z)
00139 {
00140 return (x > y - z);
00141 }
00142
00143 boolean
00144 leq_minus3(int x, int y, int z)
00145 {
00146 return (x <= y - z);
00147 }
00148
00149 boolean
00150 lt_minus3(int x, int y, int z)
00151 {
00152 return (x < y - z);
00153 }
00154
00155 boolean
00156 neq_minus3(int x, int y, int z)
00157 {
00158 return (x != y - z);
00159 }
00160
00161
00162
00163
00164
00165
00166