module: lut_dpa_10bit_5bit
description: Look-Up-Table for PPA 15bit. Coded by Min Park 03/16/09
             (converted 10/08/10)
parameters:  
inputs:  double in, double_interp clk
outputs:  double bit10, double bit5
classes: List list1() EdgeDetect pedge_clk() 
static_variables: double luttmp[1024] int nn int in_int double min_err
                  int min_index double tmp double max_lut double min_lut  
init:  
   list1.load("c:/CppSim/SimRuns/Pwm_polar_tx/distortion_dpa_10bit_tst/table.dat");
   list1.reset();
   max_lut=-1e6;
   min_lut=1e6;
   for(nn=1023; nn>=0; nn--){
      luttmp[nn] = list1.read();
      if( luttmp[nn] > max_lut )
         max_lut = luttmp[nn];
      if( luttmp[nn] < min_lut )
         min_lut = luttmp[nn];
   }

end:  
code:  
   if( pedge_clk.inp(clk) ){
      if( in<min_lut || in>max_lut ){
         printf("Error!! in is out of range.\n");
      }

      min_err = 1e9;
      min_index = 0;
      for(nn=0; nn<1024; nn++){
         if( fabs(in-luttmp[nn]) < min_err ){
            min_err = fabs(in-luttmp[nn]);
            min_index = nn;
         }
      }
      
      if( luttmp[min_index] > in ){
         min_index--;
      }
      if( luttmp[min_index] > in ){
         printf("Error! LUT is not monotonic.\n");
      }

      bit10 = min_index;
      tmp = (in-luttmp[min_index])/(luttmp[min_index+1]-luttmp[min_index]);
      bit5 = floor(32*tmp);
      //  0 <= bit5 <= 31
   }


functions:  
custom_classes_definition:  
custom_classes_code:  
