src/mdd/mdd_ineq_s.c File Reference

#include "mdd.h"
Include dependency graph for mdd_ineq_s.c:

Go to the source code of this file.

Functions

static int mdd_is_care_bit (mvar_type mvar, int index)
mdd_tmdd_ineq_template_s (mdd_manager *mgr, int mvar1, int mvar2, int zero_then_val, int one_else_val, int bottom_val)

Function Documentation

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 }


Generated on Tue Jan 12 13:57:26 2010 for glu-2.2 by  doxygen 1.6.1