From 2a5109d670f633ee803f962385adbe08790d4e23 Mon Sep 17 00:00:00 2001
From: Francesco Mani <francesco.mani@eurecom.fr>
Date: Tue, 5 Nov 2019 12:47:32 +0100
Subject: [PATCH] crc ones added also ar UE side

---
 openair1/PHY/CODING/TESTBENCH/polartest.c     |  2 +-
 .../CODING/nrPolar_tools/nr_polar_decoder.c   | 49 ++++++++++++-------
 .../PHY/CODING/nrPolar_tools/nr_polar_defs.h  |  1 +
 openair1/PHY/NR_UE_TRANSPORT/dci_nr.c         |  1 +
 openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c        |  2 +-
 5 files changed, 36 insertions(+), 19 deletions(-)

diff --git a/openair1/PHY/CODING/TESTBENCH/polartest.c b/openair1/PHY/CODING/TESTBENCH/polartest.c
index 190c53e878..36b6bbf826 100644
--- a/openair1/PHY/CODING/TESTBENCH/polartest.c
+++ b/openair1/PHY/CODING/TESTBENCH/polartest.c
@@ -278,7 +278,7 @@ if (logFlag){
       start_meas(&timeDecoder);
 
       if (decoder_int16==1) {
-    	  decoderState = polar_decoder_int16(channelOutput_int16, (uint64_t *)estimatedOutput, currentPtr);
+    	  decoderState = polar_decoder_int16(channelOutput_int16, (uint64_t *)estimatedOutput, 0, currentPtr);
       } else { //0 --> PBCH, 1 --> DCI, -1 --> UCI
     	  if (polarMessageType == 0) {
     		  decoderState = polar_decoder(channelOutput,
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
index a847072a4c..7ec530242e 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
@@ -601,6 +601,7 @@ void init_polar_deinterleaver_table(t_nrPolar_params *polarParams) {
 
 uint32_t polar_decoder_int16(int16_t *input,
                              uint64_t *out,
+                             uint8_t ones_flag,
                              const t_nrPolar_params *polarParams)
 {
   int16_t d_tilde[polarParams->N];// = malloc(sizeof(double) * polarParams->N);
@@ -650,28 +651,42 @@ uint32_t polar_decoder_int16(int16_t *input,
   uint64_t Ar = 0;
   AssertFatal(len<65,"A must be less than 65 bits\n");
 
+  // appending 24 ones before a0 for DCI as stated in 38.212 7.3.2
+  uint8_t offset = 0;
+  if (ones_flag) offset = 3;
+
   if (len<=32) {
     Ar = (uint32_t)(B[0]>>crclen);
-    uint8_t A32_flip[4];
+    uint8_t A32_flip[4+offset];
+    if (ones_flag) {
+      A32_flip[0] = 0xff;
+      A32_flip[1] = 0xff;
+      A32_flip[2] = 0xff;
+    }
     uint32_t Aprime= (uint32_t)(Ar<<(32-len));
-    A32_flip[0]=((uint8_t *)&Aprime)[3];
-    A32_flip[1]=((uint8_t *)&Aprime)[2];
-    A32_flip[2]=((uint8_t *)&Aprime)[1];
-    A32_flip[3]=((uint8_t *)&Aprime)[0];
-    crc = (uint64_t)(crc24c(A32_flip,len)>>8);
+    A32_flip[0+offset]=((uint8_t *)&Aprime)[3];
+    A32_flip[1+offset]=((uint8_t *)&Aprime)[2];
+    A32_flip[2+offset]=((uint8_t *)&Aprime)[1];
+    A32_flip[3+offset]=((uint8_t *)&Aprime)[0];
+    crc = (uint64_t)(crc24c(A32_flip,8*offset+len)>>8);
   } else if (len<=64) {
     Ar = (B[0]>>crclen) | (B[1]<<(64-crclen));;
-    uint8_t A64_flip[8];
-    uint64_t Aprime= (uint32_t)(Ar<<(64-len));
-    A64_flip[0]=((uint8_t *)&Aprime)[7];
-    A64_flip[1]=((uint8_t *)&Aprime)[6];
-    A64_flip[2]=((uint8_t *)&Aprime)[5];
-    A64_flip[3]=((uint8_t *)&Aprime)[4];
-    A64_flip[4]=((uint8_t *)&Aprime)[3];
-    A64_flip[5]=((uint8_t *)&Aprime)[2];
-    A64_flip[6]=((uint8_t *)&Aprime)[1];
-    A64_flip[7]=((uint8_t *)&Aprime)[0];
-    crc = (uint64_t)(crc24c(A64_flip,len)>>8);
+    uint8_t A64_flip[8+offset];
+    if (ones_flag) {
+      A64_flip[0] = 0xff;
+      A64_flip[1] = 0xff;
+      A64_flip[2] = 0xff;
+    }
+    uint64_t Aprime= (uint64_t)(Ar<<(64-len));
+    A64_flip[0+offset]=((uint8_t *)&Aprime)[7];
+    A64_flip[1+offset]=((uint8_t *)&Aprime)[6];
+    A64_flip[2+offset]=((uint8_t *)&Aprime)[5];
+    A64_flip[3+offset]=((uint8_t *)&Aprime)[4];
+    A64_flip[4+offset]=((uint8_t *)&Aprime)[3];
+    A64_flip[5+offset]=((uint8_t *)&Aprime)[2];
+    A64_flip[6+offset]=((uint8_t *)&Aprime)[1];
+    A64_flip[7+offset]=((uint8_t *)&Aprime)[0];
+    crc = (uint64_t)(crc24c(A64_flip,8*offset+len)>>8);
   }
 
 #if 0
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h b/openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
index 9432ca0794..a130484c8e 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_defs.h
@@ -158,6 +158,7 @@ int8_t polar_decoder(double *input,
 
 uint32_t polar_decoder_int16(int16_t *input,
                              uint64_t *out,
+                             uint8_t ones_flag,
                              const t_nrPolar_params *polarParams);
 
 int8_t polar_decoder_dci(double *input,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
index c51309e3eb..de88858c2d 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
@@ -1338,6 +1338,7 @@ void nr_dci_decoding_procedure0(int s,
       const t_nrPolar_params *currentPtrDCI=nr_polar_params(1, sizeof_bits, L2);
       decoderState = polar_decoder_int16(&pdcch_vars[eNB_id]->e_rx[CCEind*9*6*2],
                                          dci_estimation,
+                                         1,
                                          currentPtrDCI);
       crc = decoderState;
       //crc = (crc16(&dci_decoded_output[current_thread_id][0], sizeof_bits) >> 16) ^ extract_crc(&dci_decoded_output[current_thread_id][0], sizeof_bits);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
index 3d8ec866c6..1e17f6dab0 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
@@ -538,7 +538,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
   nr_pbch_unscrambling(nr_ue_pbch_vars,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0);
   //polar decoding de-rate matching
   const t_nrPolar_params *currentPtr = nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL);
-  decoderState = polar_decoder_int16(pbch_e_rx,(uint64_t *)&nr_ue_pbch_vars->pbch_a_prime,currentPtr);
+  decoderState = polar_decoder_int16(pbch_e_rx,(uint64_t *)&nr_ue_pbch_vars->pbch_a_prime,0,currentPtr);
 
   if(decoderState) return(decoderState);
 
-- 
2.26.2