From 860c99071d1f29ede117c8835c7148d9c336c245 Mon Sep 17 00:00:00 2001
From: Guy De Souza <desouza@eurecom.fr>
Date: Fri, 18 May 2018 09:23:15 +0200
Subject: [PATCH] Polar encoding init

---
 cmake_targets/CMakeLists.txt                  |  25 ++++
 .../PHY/CODING/nrPolar_tools/nr_crc_byte.c    | 116 +-----------------
 openair1/PHY/INIT/nr_init.c                   |   5 +
 openair1/PHY/defs_nr_common.h                 |   4 +
 4 files changed, 38 insertions(+), 112 deletions(-)

diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 87afa0450c..b4e2090dcd 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -1061,11 +1061,35 @@ set(PHY_LDPCSRC
   ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
   ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c
 )
+set(PHY_POLARSRC
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_init.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/get_3GPP_info_bit_pattern.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/get_crc_generator_matrix.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/get_PC_bit_pattern.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_bitwise_operations.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_crc_byte.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_bit_insertion_2.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_bit_insertion.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_channel_interleaver_pattern.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_crc.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_info_bit_pattern.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_interleave.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_kernal_operation.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_kronecker_power_matrices.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_matrix_and_array.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_output_length.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_rate_match.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_sequence_pattern.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
+  ${OPENAIR1_DIR}/PHY/CODING/nrPolar_tools/nr_polar_decoder.c
+)
 set(PHY_TURBOIF
   ${OPENAIR1_DIR}/PHY/CODING/coding_load.c
 )
 
 add_library(coding MODULE ${PHY_TURBOSRC} )
+
 set(PHY_SRC_COMMON
   # depend on code generation from asn1c
   ${RRC_FULL_DIR}/asn1_constants.h
@@ -1214,6 +1238,7 @@ set(PHY_SRC_UE
   ${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c
   ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c
   ${OPENAIR1_DIR}/PHY/TOOLS/lut.c
+  ${PHY_POLARSRC}
   )
 
   set(PHY_NR_UE_SRC
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c b/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
index abe918bc3f..1d3fa5ebf4 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c
@@ -1,108 +1,16 @@
 #include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
 
-/*ref 38-212 v15.0.0, pp 8-9 */
-/* the highest degree is set by default */
-unsigned int poly24a = 0x864cfb00; // 1000 0110 0100 1100 1111 1011 D^24 + D^23 + D^18 + D^17 + D^14 + D^11 + D^10 + D^7 + D^6 + D^5 + D^4 + D^3 + D + 1
-unsigned int poly24b = 0x80006300; // 1000 0000 0000 0000 0110 0011 D^24 + D^23 + D^6 + D^5 + D + 1
-unsigned int poly24c = 0xb2b11700; // 1011 0010 1011 0001 0001 0111 D^24 + D^23 + D^21 + D^20 + D^17 + D^15 + D^13 + D^12 + D^8 + D^4 + D^2 + D + 1
-unsigned int poly16 = 0x10210000;  // 0001 0000 0010 0001           D^16 + D^12 + D^5 + 1
-unsigned int poly11 = 0xe2100000;  // 1110 0010 0001 				D^11 + D^10 + D^9 + D^5 + 1
-unsigned int poly6 = 0x61000000;   // 0110 0001 					D^6 + D^5 + 1
-/*********************************************************
-
-For initialization && verification purposes,
-   bit by bit implementation with any polynomial
-
-The first bit is in the MSB of each byte
-
-*********************************************************/
-unsigned int crcbit (unsigned char * inputptr, int octetlen, unsigned int poly)
-{
-  unsigned int i, crc = 0, c;
-
-  while (octetlen-- > 0) {
-    c = (*inputptr++) << 24;
 
-    for (i = 8; i != 0; i--) {
-      if ((1 << 31) & (c ^ crc))
-        crc = (crc << 1) ^ poly;
-      else
-        crc <<= 1;
-
-      c <<= 1;
-    }
-  }
-
-  return crc;
-}
 
 /*********************************************************
 
 crc table initialization
 
 *********************************************************/
-static unsigned int      crc24aTable[256];
-static unsigned int      crc24bTable[256];
-static unsigned int      crc24cTable[256];
-static unsigned short    crc16Table[256];
+/*static unsigned int      crc24cTable[256];
 static unsigned short    crc11Table[256];
 static unsigned char     crc6Table[256];
 
-void crcTableInit (void)
-{
-  unsigned char c = 0;
-
-  do {
-    crc24aTable[c] = crcbit (&c, 1, poly24a);
-    crc24bTable[c] = crcbit (&c, 1, poly24b);
-    crc24cTable[c] = crcbit (&c, 1, poly24c);
-    crc16Table[c] = (unsigned short) (crcbit (&c, 1, poly16) >> 16);
-    crc11Table[c] = (unsigned short) (crcbit (&c, 1, poly11) >> 16);
-    crc6Table[c] = (unsigned char) (crcbit (&c, 1, poly6) >> 24);
-  } while (++c);
-}
-/*********************************************************
-
-Byte by byte implementations,
-assuming initial byte is 0 padded (in MSB) if necessary
-
-*********************************************************/
-unsigned int crc24a (unsigned char * inptr, int bitlen)
-{
-
-  int octetlen, resbit;
-  unsigned int crc = 0;
-  octetlen = bitlen / 8;        /* Change in octets */
-  resbit = (bitlen % 8);
-
-  while (octetlen-- > 0) {
-    //    printf("in %x => crc %x\n",crc,*inptr);
-    crc = (crc << 8) ^ crc24aTable[(*inptr++) ^ (crc >> 24)];
-  }
-
-  if (resbit > 0)
-    crc = (crc << resbit) ^ crc24aTable[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))];
-
-  return crc;
-}
-
-unsigned int crc24b (unsigned char * inptr, int bitlen)
-{
-
-  int octetlen, resbit;
-  unsigned int crc = 0;
-  octetlen = bitlen / 8;
-  resbit = (bitlen % 8);
-
-  while (octetlen-- > 0) {
-    crc = (crc << 8) ^ crc24bTable[(*inptr++) ^ (crc >> 24)];
-  }
-
-  if (resbit > 0)
-    crc = (crc << resbit) ^ crc24bTable[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))];
-
-  return crc;
-}
 
 unsigned int crc24c (unsigned char * inptr, int bitlen)
 {
@@ -122,29 +30,13 @@ unsigned int crc24c (unsigned char * inptr, int bitlen)
   return crc;
 }
 
-unsigned int crc16 (unsigned char * inptr, int bitlen)
-{
-  int octetlen, resbit;
-  unsigned int crc = 0;
-  octetlen = bitlen / 8;        /* Change in octets */
-  resbit = (bitlen % 8);
 
-  while (octetlen-- > 0) {
-
-    crc = (crc << 8) ^ (crc16Table[(*inptr++) ^ (crc >> 24)] << 16);
-  }
-
-  if (resbit > 0)
-    crc = (crc << resbit) ^ (crc16Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))] << 16);
-
-  return crc;
-}
 
 unsigned int crc11 (unsigned char * inptr, int bitlen)
 {
   int octetlen, resbit;
   unsigned int             crc = 0;
-  octetlen = bitlen / 8;        /* Change in octets */
+  octetlen = bitlen / 8;        // Change in octets
   resbit = (bitlen % 8);
 
   while (octetlen-- > 0) {
@@ -161,7 +53,7 @@ unsigned int crc6 (unsigned char * inptr, int bitlen)
 {
   int octetlen, resbit;
   unsigned int crc = 0;
-  octetlen = bitlen / 8;        /* Change in octets */
+  octetlen = bitlen / 8;        // Change in octets
   resbit = (bitlen % 8);
 
   while (octetlen-- > 0) {
@@ -237,7 +129,7 @@ uint8_t check_crc(uint8_t *decoded_bytes, uint16_t len, uint8_t crc_type)
 
       printf("old CRC %x, CRC %x \n",oldcrc,crc);
       return (crc == oldcrc); 
-}
+}*/
 
 uint8_t **crc24c_generator_matrix(uint16_t payloadSizeBits){
 
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 920939654f..00e1f67873 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -23,6 +23,7 @@
 #include "SCHED/sched_eNB.h"
 #include "PHY/phy_extern.h"
 #include "PHY/INIT/phy_init.h"
+#include "PHY/CODING/nrPolar_tools/nr_polar_pbch_defs.h"
 #include "RadioResourceConfigCommonSIB.h"
 #include "RadioResourceConfigDedicated.h"
 #include "TDD-Config.h"
@@ -112,7 +113,11 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
         );*/
   LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_gNB][MOD %02"PRIu8"][]\n", gNB->Mod_id);
 
+  // PBCH DMRS gold sequences generation
   nr_init_pbch_dmrs(gNB);
+  // Polar encoder init for PBCH
+  nr_polar_init(&fp->pbch_polar_params, 1);
+
 /*
   lte_gold(fp,gNB->lte_gold_table,fp->Nid_cell);
   generate_pcfich_reg_mapping(fp);
diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h
index e25fdf8768..65168dfb8c 100644
--- a/openair1/PHY/defs_nr_common.h
+++ b/openair1/PHY/defs_nr_common.h
@@ -34,6 +34,7 @@
 #define __PHY_DEFS_NR_COMMON__H__
 
 #include "defs_common.h"
+#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
 
 #define nr_subframe_t lte_subframe_t
 
@@ -110,7 +111,10 @@ typedef struct NR_DL_FRAME_PARMS {
     //SSB related params
   /// Start in Subcarrier index of the SSB block
   uint16_t ssb_start_subcarrier;
+  /// SSB type
   nr_ssb_type_e ssb_type;
+  /// PBCH polar encoder params
+  t_nrPolar_params pbch_polar_params;
 
 } NR_DL_FRAME_PARMS;
 
-- 
GitLab