src/mdd/mdd_mod.c File Reference

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

Go to the source code of this file.

Functions

static void mod_block_build (mdd_t ****, int, bvar_type *, bvar_type *)
static void assert_zero (mdd_manager *, mdd_t **, bvar_type *)
static void single_var_block_build (mdd_t ****, bvar_type *, int)
int getbit (int number, int position)
mdd_tmdd_mod (mdd_manager *mgr, int a_mvar_id, int b_mvar_id, int M)

Function Documentation

static void assert_zero ( mdd_manager mgr,
mdd_t **  PINS_00_ptr,
bvar_type a_bit_i_ptr 
) [static]

Definition at line 19 of file mdd_mod.c.

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 }

int getbit ( int  number,
int  position 
)

Definition at line 13 of file mdd_mod.c.

00014 {
00015 return ( (number >> position) & 1);
00016 }

mdd_t* mdd_mod ( mdd_manager mgr,
int  a_mvar_id,
int  b_mvar_id,
int  M 
)

Definition at line 73 of file mdd_mod.c.

00078 {
00079         mdd_t ***PINS;          /* Two dimensional array of mdd_t*'s used in forming the mdd */
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         /* Allocate two dimensional array PINS[0..M-1][0..M-1] of mdd_t *'s */
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 }

static void mod_block_build ( mdd_t ****  PINS_ptr,
int  M,
bvar_type a_bit_i_ptr,
bvar_type b_bit_i_ptr 
) [static]

Definition at line 50 of file mdd_mod.c.

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 }

static void single_var_block_build ( mdd_t ****  PINS_ptr,
bvar_type b_bit_i_ptr,
int  M 
) [static]

Definition at line 36 of file mdd_mod.c.

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 }


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