From f2c5ebd4cdc078c77fd86d20fa5b1487e7e583be Mon Sep 17 00:00:00 2001
From: Francesco Mani <francesco.mani@eurecom.fr>
Date: Tue, 22 Oct 2019 15:26:44 +0200
Subject: [PATCH] Zc fix in LDPC encoder

---
 openair1/PHY/CODING/TESTBENCH/ldpctest.c      |  6 +-
 openair1/PHY/CODING/nrLDPC_encoder/defs.h     |  6 +-
 .../PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c | 56 ++-----------------
 .../ldpc_generate_coefficient.c               | 35 +-----------
 openair1/PHY/CODING/nr_segmentation.c         |  2 +-
 openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c   | 37 ++++++------
 .../PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c     | 20 +++----
 7 files changed, 41 insertions(+), 121 deletions(-)

diff --git a/openair1/PHY/CODING/TESTBENCH/ldpctest.c b/openair1/PHY/CODING/TESTBENCH/ldpctest.c
index 9d6a9775f01..7f806e6f797 100644
--- a/openair1/PHY/CODING/TESTBENCH/ldpctest.c
+++ b/openair1/PHY/CODING/TESTBENCH/ldpctest.c
@@ -130,9 +130,9 @@ int test_ldpc(short No_iteration,
   double *modulated_input[MAX_NUM_DLSCH_SEGMENTS];
   char *channel_output_fixed[MAX_NUM_DLSCH_SEGMENTS];
   unsigned int i,j,trial=0;
-  short BG=0,Zc,Kb=0,nrows=0;//,ncols;
+  short BG=0,nrows=0;//,ncols;
   int no_punctured_columns,removed_bit;
-  int i1;
+  int i1,Zc,Kb=0;
   int R_ind = 0;
   //Table of possible lifting sizes
   //short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384};
@@ -308,7 +308,7 @@ int test_ldpc(short No_iteration,
 
     for(j=0;j<(n_segments%8+1);j++) {
     	start_meas(time_optim);
-    	ldpc_encoder_optim_8seg_multi(test_input,channel_input_optim,block_length, BG, n_segments,j,&tinput,&tprep,&tparity,&toutput);
+    	ldpc_encoder_optim_8seg_multi(test_input,channel_input_optim,Zc,Kb,block_length, BG, n_segments,j,&tinput,&tprep,&tparity,&toutput);
     	stop_meas(time_optim);
     }
     
diff --git a/openair1/PHY/CODING/nrLDPC_encoder/defs.h b/openair1/PHY/CODING/nrLDPC_encoder/defs.h
index 4230056f314..54a31adc2d4 100644
--- a/openair1/PHY/CODING/nrLDPC_encoder/defs.h
+++ b/openair1/PHY/CODING/nrLDPC_encoder/defs.h
@@ -36,12 +36,12 @@ int encode_parity_check_part_orig(unsigned char *c,unsigned char *d, short BG,sh
 
 /*ldpc_encoder2.c*/
 void encode_parity_check_part_optim(uint8_t *c,uint8_t *d, short BG,short Zc,short Kb);
-int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,short block_length,short BG,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput);
-int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_input,short block_length,short BG,int n_segments,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput);
+int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,int Zc,int Kb,short block_length,short BG,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput);
+int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_input,int Zc,int Kb,short block_length,short BG,int n_segments,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput);
 int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **channel_input,short block_length, short BG, int n_segments,unsigned int macro_num, time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput);
 
 /*ldpc_generate_coefficient.c*/
-int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,short block_length,short BG,unsigned char gen_code);
+int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,int Zc,int Kb,short block_length,short BG,unsigned char gen_code);
 
 /*
 int encode_parity_check_part(unsigned char *c,unsigned char *d, short BG,short Zc,short Kb);
diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
index 4c50df26362..20231c1c42e 100644
--- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
+++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
@@ -198,16 +198,13 @@ void encode_parity_check_part_optim(uint8_t *c,uint8_t *d, short BG,short Zc,sho
 }
 
 
-int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,short block_length,short BG,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput)
+int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,int Zc,int Kb,short block_length,short BG,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput)
 {
 
-  short Zc,Kb=0,nrows=0,ncols=0;
+  short nrows=0,ncols=0;
   int i,i1;
   int no_punctured_columns,removed_bit;
 
-  //Table of possible lifting sizes
-  short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384};
-
   int simd_size;
 
   //determine number of bits in codeword
@@ -215,7 +212,6 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
    if (BG==1)
      {
        //BG=1;
-       Kb = 22;
        nrows=46; //parity check bits
        ncols=22; //info bits
      }
@@ -226,28 +222,8 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
        nrows=42; //parity check bits
        ncols=10; // info bits
 
-       if (block_length>640)
- 	Kb = 10;
-       else if (block_length>560)
- 	Kb = 9;
-       else if (block_length>192)
-       Kb = 8;
-     else
-       Kb = 6;
        }
 
-  //find minimum value in all sets of lifting size
-  Zc=0;
-  for (i1=0; i1 < 51; i1++)
-  {
-    if (lift_size[i1] >= (double) block_length/Kb)
-    {
-      Zc = lift_size[i1];
-      //printf("%d\n",Zc);
-      break;
-    }
-  }
-  AssertFatal(Zc>0,"no valid Zc found for block length %d\n",block_length);
 
 #ifdef DEBUG_LDPC
   LOG_D(PHY,"ldpc_encoder_optim_8seg: BG %d, Zc %d, Kb %d, block_length %d\n",BG,Zc,Kb,block_length);
@@ -317,14 +293,12 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
   return 0;
 }
 
-int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_input,short block_length,short BG,int n_segments,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput)
+int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_input,int Zc,int Kb,short block_length,short BG,int n_segments,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput)
 {
 
-  short Zc,Kb=0,nrows=0,ncols=0;
+  short nrows=0,ncols=0;
   int i,i1,j;
   int no_punctured_columns,removed_bit;
-  //Table of possible lifting sizes
-  short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384};
   char temp;
   int simd_size;
 
@@ -350,8 +324,6 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
   //if (block_length>3840)
   if (BG==1)
     {
-      //BG=1;
-      Kb = 22;
       nrows=46; //parity check bits
       ncols=22; //info bits
     }
@@ -362,28 +334,8 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
       nrows=42; //parity check bits
       ncols=10; // info bits
       
-      if (block_length>640)
-	Kb = 10;
-      else if (block_length>560)
-	Kb = 9;
-      else if (block_length>192)
-      Kb = 8;
-    else
-      Kb = 6;
       }
 
-  //find minimum value in all sets of lifting size
-  Zc=0;
-  for (i1=0; i1 < 51; i1++)
-  {
-    if (lift_size[i1] >= (double) block_length/Kb)
-    {
-      Zc = lift_size[i1];
-      //printf("%d\n",Zc);
-      break;
-    }
-  }
-
 #ifdef DEBUG_LDPC
   LOG_D(PHY,"ldpc_encoder_optim_8seg: BG %d, Zc %d, Kb %d, block_length %d, segments %d\n",BG,Zc,Kb,block_length,n_segments);
   LOG_D(PHY,"ldpc_encoder_optim_8seg: PDU (seg 0) %x %x %x %x\n",test_input[0][0],test_input[0][1],test_input[0][2],test_input[0][3]);
diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c
index faac0210880..235badc2e0e 100644
--- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c
+++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c
@@ -361,24 +361,19 @@ short *choose_generator_matrix(short BG,short Zc)
   return Gen_shift_values;
 }
 
-int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,short block_length, short BG,unsigned char gen_code)
+int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,int Zc,int Kb,short block_length, short BG,unsigned char gen_code)
 {
   unsigned char c[22*384]; //padded input, unpacked, max size
   unsigned char d[68*384]; //coded output, unpacked, max size
   unsigned char channel_temp,temp;
   short *Gen_shift_values, *no_shift_values, *pointer_shift_values;
-  short Zc;
-  //initialize for BG == 1
-  short Kb = 22;
+
   short nrows = 46;//parity check bits
   short ncols = 22;//info bits
 
 
   int i,i1,i2,i3,i4,i5,temp_prime,var;
   int no_punctured_columns,removed_bit;
-  //Table of possible lifting sizes
-  short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384};
-
   int nind=0;
   int indlist[1000];
   int indlist2[1000];
@@ -387,8 +382,6 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,sho
   //if (block_length>3840)
      if (BG==1)
        {
-         //BG=1;
-         Kb = 22;
          nrows=46; //parity check bits
          ncols=22; //info bits
        }
@@ -399,32 +392,8 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,sho
          nrows=42; //parity check bits
          ncols=10; // info bits
 
-         if (block_length>640)
-   	Kb = 10;
-         else if (block_length>560)
-   	Kb = 9;
-         else if (block_length>192)
-         Kb = 8;
-       else
-         Kb = 6;
          }
 
-  //find minimum value in all sets of lifting size
-  Zc=0;
-  for (i1=0; i1 < 51; i1++)
-  {
-    if (lift_size[i1] >= (double) block_length/Kb)
-    {
-      Zc = lift_size[i1];
-      //printf("%d\n",Zc);
-      break;
-    }
-  }
-  if (Zc==0) {
-    printf("ldpc_encoder_orig: could not determine lifting size\n");
-    return(-1);
-  }
-
   Gen_shift_values=choose_generator_matrix(BG,Zc);
   if (Gen_shift_values==NULL) {
     printf("ldpc_encoder_orig: could not find generator matrix\n");
diff --git a/openair1/PHY/CODING/nr_segmentation.c b/openair1/PHY/CODING/nr_segmentation.c
index f0a72d2877e..90586e24d4a 100644
--- a/openair1/PHY/CODING/nr_segmentation.c
+++ b/openair1/PHY/CODING/nr_segmentation.c
@@ -185,7 +185,7 @@ else
     }
   }
 
-  return 0;
+  return Kb;
 }
 
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index 2f4a9099043..d8428047a5d 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -283,8 +283,8 @@ int nr_dlsch_encoding(unsigned char *a,
   nfapi_nr_dl_config_dlsch_pdu_rel15_t rel15 = dlsch->harq_processes[harq_pid]->dlsch_pdu.dlsch_pdu_rel15;
   uint16_t nb_rb = rel15.n_prb;
   uint8_t nb_symb_sch = rel15.nb_symbols;
-  uint32_t A, Z, F=0;
-  uint32_t *pz = &Z;
+  uint32_t A, Z, Kb, F=0;
+  uint32_t *Zc = &Z;
   uint8_t mod_order = rel15.modulation_order;
   uint16_t Kr=0,r,r_offset=0;
   //uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS];
@@ -294,7 +294,6 @@ int nr_dlsch_encoding(unsigned char *a,
   uint32_t Tbslbrm = 950984; //max tbs
   uint8_t nb_re_dmrs = rel15.nb_re_dmrs;
   uint16_t R=rel15.coding_rate;
-  uint16_t Qm=rel15.modulation_order;
   uint16_t length_dmrs = 1;
   float Coderate = 0.0;
   uint8_t Nl = 4;
@@ -368,14 +367,14 @@ int nr_dlsch_encoding(unsigned char *a,
     else
 		BG = 1;
 
-    nr_segmentation(dlsch->harq_processes[harq_pid]->b,
-		    dlsch->harq_processes[harq_pid]->c,
-		    dlsch->harq_processes[harq_pid]->B,
-		    &dlsch->harq_processes[harq_pid]->C,
-		    &dlsch->harq_processes[harq_pid]->K,
-		    pz, // [hna] pz is Zc
-		    &dlsch->harq_processes[harq_pid]->F,
-                    BG);
+    Kb = nr_segmentation(dlsch->harq_processes[harq_pid]->b,
+		         dlsch->harq_processes[harq_pid]->c,
+		         dlsch->harq_processes[harq_pid]->B,
+		         &dlsch->harq_processes[harq_pid]->C,
+		         &dlsch->harq_processes[harq_pid]->K,
+		         Zc, 
+		         &dlsch->harq_processes[harq_pid]->F,
+                         BG);
 
     F = dlsch->harq_processes[harq_pid]->F;
 
@@ -385,7 +384,7 @@ int nr_dlsch_encoding(unsigned char *a,
     Kr_bytes = Kr>>3;
 #endif
 
-    //printf("segment Z %d k %d Kr %d BG %d\n", *pz,dlsch->harq_processes[harq_pid]->K,Kr,BG);
+    //printf("segment Z %d k %d Kr %d BG %d\n", *Zc,dlsch->harq_processes[harq_pid]->K,Kr,BG);
 
     for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
       //d_tmp[r] = &dlsch->harq_processes[harq_pid]->d[r][0];
@@ -394,14 +393,14 @@ int nr_dlsch_encoding(unsigned char *a,
       printf("Encoder: B %d F %d \n",dlsch->harq_processes[harq_pid]->B, dlsch->harq_processes[harq_pid]->F);
       printf("start ldpc encoder segment %d/%d\n",r,dlsch->harq_processes[harq_pid]->C);
       printf("input %d %d %d %d %d \n", dlsch->harq_processes[harq_pid]->c[r][0], dlsch->harq_processes[harq_pid]->c[r][1], dlsch->harq_processes[harq_pid]->c[r][2],dlsch->harq_processes[harq_pid]->c[r][3], dlsch->harq_processes[harq_pid]->c[r][4]);
-      for (int cnt =0 ; cnt < 22*(*pz)/8; cnt ++){
+      for (int cnt =0 ; cnt < 22*(*Zc)/8; cnt ++){
       printf("%d ", dlsch->harq_processes[harq_pid]->c[r][cnt]);
       }
       printf("\n");
 
 #endif
-      //ldpc_encoder_orig((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],dlsch->harq_processes[harq_pid]->d[r],Kr,BG,0);
-      //ldpc_encoder_optim((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],(unsigned char*)&dlsch->harq_processes[harq_pid]->d[r][0],Kr,BG,NULL,NULL,NULL,NULL);
+      //ldpc_encoder_orig((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],dlsch->harq_processes[harq_pid]->d[r],*Zc,Kb,Kr,BG,0);
+      //ldpc_encoder_optim((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],(unsigned char*)&dlsch->harq_processes[harq_pid]->d[r][0],*Zc,Kb,Kr,BG,NULL,NULL,NULL,NULL);
     }
 
     //for (int i=0;i<68*384;i++)
@@ -410,13 +409,13 @@ int nr_dlsch_encoding(unsigned char *a,
 
 
     /*printf("output %d %d %d %d %d \n", dlsch->harq_processes[harq_pid]->d[0][0], dlsch->harq_processes[harq_pid]->d[0][1], dlsch->harq_processes[harq_pid]->d[r][2],dlsch->harq_processes[harq_pid]->d[0][3], dlsch->harq_processes[harq_pid]->d[0][4]);
-    	for (int cnt =0 ; cnt < 66*(*pz); cnt ++){
+    	for (int cnt =0 ; cnt < 66*(*Zc); cnt ++){
     	printf("%d \n",  dlsch->harq_processes[harq_pid]->d[0][cnt]);
     	}
     	printf("\n");*/
 
     //ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL);
-    ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,dlsch->harq_processes[harq_pid]->d,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL);
+    ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,dlsch->harq_processes[harq_pid]->d,*Zc,Kb,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL);
 
     //printf("end ldpc encoder -- output\n");
 
@@ -430,7 +429,7 @@ int nr_dlsch_encoding(unsigned char *a,
   for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
 
     if (dlsch->harq_processes[harq_pid]->F>0) {
-      for (int k=(Kr-F-2*(*pz)); k<Kr-2*(*pz); k++) {
+      for (int k=(Kr-F-2*(*Zc)); k<Kr-2*(*Zc); k++) {
         dlsch->harq_processes[harq_pid]->d[r][k] = NR_NULL;
 	//if (k<(Kr-F+8))
 	//printf("r %d filler bits [%d] = %d \n", r,k, dlsch->harq_processes[harq_pid]->d[r][k]);
@@ -460,7 +459,7 @@ int nr_dlsch_encoding(unsigned char *a,
     nr_rate_matching_ldpc(Ilbrm,
                           Tbslbrm,
                           BG,
-                          *pz,
+                          *Zc,
                           dlsch->harq_processes[harq_pid]->d[r],
                           dlsch->harq_processes[harq_pid]->e+r_offset,
                           dlsch->harq_processes[harq_pid]->C,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
index 21d0a4cc6f5..78cb3097a00 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
@@ -202,7 +202,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
   uint8_t mod_order; 
   uint16_t Kr,r,r_offset,R;
   uint8_t BG;
-  uint32_t E;
+  uint32_t E,Kb;
   uint8_t Ilbrm; 
   uint32_t Tbslbrm; 
   uint8_t nb_re_dmrs; 
@@ -294,14 +294,14 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
       BG = 1;
     }
 
-    nr_segmentation(harq_process->b,
-        harq_process->c,
-        harq_process->B,
-        &harq_process->C,
-        &harq_process->K,
-        pz,
-        &harq_process->F,
-        BG);
+    Kb=nr_segmentation(harq_process->b,
+                       harq_process->c,
+                       harq_process->B,
+                       &harq_process->C,
+                       &harq_process->K,
+                       pz,
+                       &harq_process->F,
+                       BG);
 
     F = harq_process->F;
 
@@ -349,7 +349,7 @@ opp_enabled=0;
       }
       printf("\n");*/
 
-    ldpc_encoder_optim_8seg(harq_process->c,harq_process->d,Kr,BG,harq_process->C,NULL,NULL,NULL,NULL);
+    ldpc_encoder_optim_8seg(harq_process->c,harq_process->d,*pz,Kb,Kr,BG,harq_process->C,NULL,NULL,NULL,NULL);
 
     //stop_meas(te_stats);
     //printf("end ldpc encoder -- output\n");
-- 
GitLab