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_func2(
00020 mdd_manager *mgr,
00021 int mvar1,
00022 int mvar2,
00023 boolean (*func2)(int, int))
00024 {
00025 mvar_type x, y;
00026 array_t *child_list_x, *child_list_y;
00027 int i, j;
00028 mdd_t *tx, *ty;
00029 array_t *mvar_list = mdd_ret_mvar_list(mgr);
00030 mdd_t *one, *zero;
00031
00032 one = mdd_one(mgr);
00033 zero = mdd_zero(mgr);
00034
00035 x = array_fetch(mvar_type, mvar_list, mvar1);
00036 y = array_fetch(mvar_type, mvar_list, mvar2);
00037
00038 if (x.status == MDD_BUNDLED) {
00039 (void) fprintf(stderr,
00040 "\nWarning: mdd_func2, bundled variable %s is used\n", x.name);
00041 fail("");
00042 }
00043
00044 if (y.status == MDD_BUNDLED) {
00045 (void) fprintf(stderr,
00046 "\nWarning: mdd_func2 bundled variable %s is used\n", y.name);
00047 fail("");
00048 }
00049
00050 child_list_x = array_alloc(mdd_t *, 0);
00051 for (i=0; i<x.values; i++) {
00052 child_list_y = array_alloc(mdd_t *, 0);
00053 for (j=0; j<y.values; j++) {
00054 if (func2(i,j))
00055 array_insert_last(mdd_t *, child_list_y, one);
00056 else
00057 array_insert_last(mdd_t *, child_list_y, zero);
00058 }
00059 ty = mdd_case(mgr, mvar2, child_list_y);
00060 array_insert_last(mdd_t *, child_list_x, ty);
00061 array_free(child_list_y);
00062 }
00063 tx = mdd_case(mgr, mvar1, child_list_x);
00064 array_free(child_list_x);
00065 mdd_free(one);
00066 mdd_free(zero);
00067 return tx;
00068 }
00069
00070
00071
00072
00073 boolean
00074 eq2(int x, int y)
00075 {
00076 return (x == y);
00077 }
00078
00079 boolean
00080 geq2(int x, int y)
00081 {
00082 return (x >= y);
00083 }
00084
00085 boolean
00086 gt2(int x, int y)
00087 {
00088 return (x > y);
00089 }
00090
00091 boolean
00092 leq2(int x, int y)
00093 {
00094 return (x <= y);
00095 }
00096
00097 boolean
00098 lt2(int x, int y)
00099 {
00100 return (x < y);
00101 }
00102
00103 boolean
00104 neq2(int x, int y)
00105 {
00106 return (x != y);
00107 }
00108
00109 boolean
00110 unary_minus2(int x, int y)
00111 {
00112 return (x+y == 0);
00113 }
00114
00115
00116
00117
00118
00119