00001
00002
00003
00004
00005
00006 #include "mdd.h"
00007
00008 static void mod_block_build (mdd_t ****, int, bvar_type *, bvar_type *);
00009 static void assert_zero (mdd_manager *, mdd_t **, bvar_type *);
00010 static void single_var_block_build (mdd_t ****, bvar_type *, int);
00011
00012 int
00013 getbit(int number, int position)
00014 {
00015 return ( (number >> position) & 1);
00016 }
00017
00018 static void
00019 assert_zero(
00020 mdd_manager *mgr,
00021 mdd_t **PINS_00_ptr,
00022 bvar_type *a_bit_i_ptr)
00023 {
00024 mdd_t *zero;
00025
00026 zero = mdd_zero(mgr);
00027
00028 (*PINS_00_ptr) = mdd_ite( a_bit_i_ptr->node, zero, (*PINS_00_ptr) , 1, 1, 1);
00029
00030 mdd_free(zero);
00031
00032 return;
00033 }
00034
00035 static void
00036 single_var_block_build(
00037 mdd_t ****PINS_ptr,
00038 bvar_type *b_bit_i_ptr,
00039 int M)
00040 {
00041 int i;
00042
00043 for (i=0; i < M; i++)
00044 (*PINS_ptr)[0][i] = mdd_ite( b_bit_i_ptr->node, (*PINS_ptr)[0][(2*i+1)%M], (*PINS_ptr)[0][(2*i)%M], 1, 1, 1);
00045
00046 }
00047
00048
00049 static void
00050 mod_block_build(
00051 mdd_t ****PINS_ptr,
00052 int M ,
00053 bvar_type *a_bit_i_ptr,
00054 bvar_type *b_bit_i_ptr)
00055 {
00056 int i, j;
00057 mdd_t *THEN, *ELSE;
00058
00059 for(i=0; i<M; i++)
00060 for (j=0; j<M; j++){
00061 THEN = mdd_ite(b_bit_i_ptr->node, (*PINS_ptr)[(2*i+1)%M][(2*j+1)%M],
00062 (*PINS_ptr)[(2*i+1)%M][(2*j)%M], 1, 1, 1);
00063
00064 ELSE = mdd_ite(b_bit_i_ptr->node, (*PINS_ptr)[(2*i)%M][(2*j+1)%M],
00065 (*PINS_ptr)[(2*i)%M][(2*j)%M], 1, 1, 1);
00066
00067 (*PINS_ptr)[i][j] = mdd_ite(a_bit_i_ptr->node, THEN, ELSE, 1, 1, 1);
00068 }
00069 }
00070
00071
00072 mdd_t *
00073 mdd_mod(
00074 mdd_manager *mgr,
00075 int a_mvar_id,
00076 int b_mvar_id,
00077 int M )
00078 {
00079 mdd_t ***PINS;
00080 int i, j;
00081 mvar_type a, b;
00082 array_t *mvar_list = mdd_ret_mvar_list(mgr);
00083 array_t *bvar_list = mdd_ret_bvar_list(mgr);
00084 bvar_type a_bit_i, b_bit_i;
00085 mdd_t *result, *less_than;
00086
00087 a = array_fetch ( mvar_type, mvar_list, a_mvar_id);
00088 b = array_fetch ( mvar_type, mvar_list, b_mvar_id);
00089
00090
00091 PINS = ALLOC(mdd_t **, M);
00092 for(i=0; i<M; i++) PINS[i] = ALLOC(mdd_t *, M);
00093
00094 for(i=0; i< M; i++)
00095 for(j=0; j< M; j++) PINS[i][j] = mdd_zero(mgr);
00096
00097 for(i=0; i< M; i++) PINS[i][i] = mdd_one(mgr);
00098
00099 for( i = 1 ; i <= (MIN(a.encode_length, b.encode_length)); i++){
00100 a_bit_i = mdd_ret_bvar( &a, (a.encode_length - i), bvar_list);
00101 b_bit_i = mdd_ret_bvar( &b, (b.encode_length - i), bvar_list);
00102
00103 mod_block_build(&PINS, M, &a_bit_i, &b_bit_i);
00104 }
00105
00106 if ( a.encode_length > b.encode_length )
00107 for ( i = MIN(a.encode_length, b.encode_length)+1; i <= a.encode_length; i++){
00108 a_bit_i = mdd_ret_bvar( &a, (a.encode_length - i), bvar_list);
00109 assert_zero( mgr, &(PINS[0][0]), &a_bit_i);
00110 }
00111
00112 if ( b.encode_length > a.encode_length )
00113 for ( i = MIN(a.encode_length, b.encode_length)+1; i <= b.encode_length; i++){
00114 b_bit_i = mdd_ret_bvar( &b, (b.encode_length - i), bvar_list);
00115 single_var_block_build( &PINS, &b_bit_i, M);
00116 }
00117
00118 less_than = build_lt_c(mgr, a_mvar_id, M);
00119
00120 result = mdd_and(PINS[0][0], less_than, 1, 1);
00121
00122 return result;
00123
00124
00125 }
00126
00127
00128
00129
00130