#include "mdd.h"
Go to the source code of this file.
Functions | |
static int | mdd_is_care_bit (mvar_type mvar, int index) |
mdd_t * | mdd_ineq_template_s (mdd_manager *mgr, int mvar1, int mvar2, int zero_then_val, int one_else_val, int bottom_val) |
mdd_t* mdd_ineq_template_s | ( | mdd_manager * | mgr, | |
int | mvar1, | |||
int | mvar2, | |||
int | zero_then_val, | |||
int | one_else_val, | |||
int | bottom_val | |||
) |
Definition at line 18 of file mdd_ineq_s.c.
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 }
static int mdd_is_care_bit | ( | mvar_type | mvar, | |
int | index | |||
) | [static] |
Definition at line 9 of file mdd_ineq_s.c.
00012 { 00013 return ( getbit( ( (int) pow(2.0, (double)mvar.encode_length) ) - mvar.values, mvar.encode_length-index-1)); 00014 }