From 73db162804afcfc348868cfbbe37afd9e5b390a3 Mon Sep 17 00:00:00 2001
From: Khalid Ahmed <ahmedkd@iis.fraunhofer.de>
Date: Fri, 8 Mar 2019 10:03:05 +0100
Subject: [PATCH] Renaming and moving nr_layer_mapping to a common liberary
 between UE and gNB

---
 openair1/PHY/MODULATION/nr_modulation.c | 70 ++++++++++++++++++++++++
 openair1/PHY/MODULATION/nr_modulation.h | 12 ++++
 openair1/PHY/NR_TRANSPORT/nr_dlsch.c    | 73 +------------------------
 openair1/PHY/NR_TRANSPORT/nr_dlsch.h    |  5 --
 4 files changed, 83 insertions(+), 77 deletions(-)

diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c
index 8a6a5550ca..6c4d9c85ca 100644
--- a/openair1/PHY/MODULATION/nr_modulation.c
+++ b/openair1/PHY/MODULATION/nr_modulation.c
@@ -49,4 +49,74 @@ void nr_modulation(uint32_t *in,
     out[i<<1] = nr_mod_table[(offset+idx)<<1];
     out[(i<<1)+1] = nr_mod_table[((offset+idx)<<1)+1];
   }
+}
+
+void nr_layer_mapping(int16_t **mod_symbs,
+                         uint8_t n_layers,
+                         uint16_t n_symbs,
+                         int16_t **tx_layers) {
+
+  switch (n_layers) {
+
+    case 1:
+      memcpy((void*)tx_layers[0], (void*)mod_symbs[0], (n_symbs<<1)*sizeof(int16_t));
+    break;
+
+    case 2:
+    case 3:
+    case 4:
+      for (int i=0; i<n_symbs/n_layers; i++)
+        for (int l=0; l<n_layers; l++) {
+          tx_layers[l][i<<1] = mod_symbs[0][(n_layers*i+l)<<1];
+          tx_layers[l][(i<<1)+1] = mod_symbs[0][((n_layers*i+l)<<1)+1];
+        }
+    break;
+
+    case 5:
+      for (int i=0; i<n_symbs>>1; i++)
+        for (int l=0; l<2; l++) {
+          tx_layers[l][i<<1] = mod_symbs[0][((i<<1)+l)<<1];
+          tx_layers[l][(i<<1)+1] = mod_symbs[0][(((i<<1)+l)<<1)+1];
+        }
+      for (int i=0; i<n_symbs/3; i++)
+        for (int l=2; l<5; l++) {
+          tx_layers[l][i<<1] = mod_symbs[1][(3*i+l)<<1];
+          tx_layers[l][(i<<1)+1] = mod_symbs[1][((3*i+l)<<1)+1];
+      }
+    break;
+
+    case 6:
+      for (int q=0; q<2; q++)
+        for (int i=0; i<n_symbs/3; i++)
+          for (int l=0; l<3; l++) {
+            tx_layers[l][i<<1] = mod_symbs[q][(3*i+l)<<1];
+            tx_layers[l][(i<<1)+1] = mod_symbs[q][((3*i+l)<<1)+1];
+          }
+    break;
+
+    case 7:
+      for (int i=0; i<n_symbs/3; i++)
+        for (int l=0; l<3; l++) {
+          tx_layers[l][i<<1] = mod_symbs[1][(3*i+l)<<1];
+          tx_layers[l][(i<<1)+1] = mod_symbs[1][((3*i+l)<<1)+1];
+        }
+      for (int i=0; i<n_symbs/4; i++)
+        for (int l=3; l<7; l++) {
+          tx_layers[l][i<<1] = mod_symbs[0][((i<<2)+l)<<1];
+          tx_layers[l][(i<<1)+1] = mod_symbs[0][(((i<<2)+l)<<1)+1];
+        }
+    break;
+
+    case 8:
+      for (int q=0; q<2; q++)
+        for (int i=0; i<n_symbs>>2; i++)
+          for (int l=0; l<3; l++) {
+            tx_layers[l][i<<1] = mod_symbs[q][((i<<2)+l)<<1];
+            tx_layers[l][(i<<1)+1] = mod_symbs[q][(((i<<2)+l)<<1)+1];
+          }
+    break;
+
+  default:
+  AssertFatal(0, "Invalid number of layers %d\n", n_layers);
+  }
 }
\ No newline at end of file
diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h
index 8f4e5f3761..e7cda27302 100644
--- a/openair1/PHY/MODULATION/nr_modulation.h
+++ b/openair1/PHY/MODULATION/nr_modulation.h
@@ -37,4 +37,16 @@ void nr_modulation(uint32_t *in,
                    uint16_t mod_order,
                    int16_t *out);
 
+/*! \brief Perform NR layer mapping. TS 38.211 V15.4.0 subclause 7.3.1.3
+  @param[in] mod_symbs, double Pointer to modulated symbols for each codeword
+  @param[in] n_layers, number of layers
+  @param[in] n_symbs, number of modulated symbols
+  @param[out] tx_layers, modulated symbols for each layer
+*/
+
+void nr_layer_mapping(int16_t **mod_symbs,
+                         uint8_t n_layers,
+                         uint16_t n_symbs,
+                         int16_t **tx_layers);
+
 #endif
\ No newline at end of file
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index 8428483153..8f6cbd7055 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -65,77 +65,6 @@ void nr_pdsch_codeword_scrambling(uint8_t *in,
 
 }
 
-
-void nr_pdsch_layer_mapping(int16_t **mod_symbs,
-                         uint8_t n_layers,
-                         uint16_t n_symbs,
-                         int16_t **tx_layers) {
-
-  switch (n_layers) {
-
-    case 1:
-      memcpy((void*)tx_layers[0], (void*)mod_symbs[0], (n_symbs<<1)*sizeof(int16_t));
-    break;
-
-    case 2:
-    case 3:
-    case 4:
-      for (int i=0; i<n_symbs/n_layers; i++)
-        for (int l=0; l<n_layers; l++) {
-          tx_layers[l][i<<1] = mod_symbs[0][(n_layers*i+l)<<1];
-          tx_layers[l][(i<<1)+1] = mod_symbs[0][((n_layers*i+l)<<1)+1];
-        }
-    break;
-
-    case 5:
-      for (int i=0; i<n_symbs>>1; i++)
-        for (int l=0; l<2; l++) {
-          tx_layers[l][i<<1] = mod_symbs[0][((i<<1)+l)<<1];
-          tx_layers[l][(i<<1)+1] = mod_symbs[0][(((i<<1)+l)<<1)+1];
-        }
-      for (int i=0; i<n_symbs/3; i++)
-        for (int l=2; l<5; l++) {
-          tx_layers[l][i<<1] = mod_symbs[1][(3*i+l)<<1];
-          tx_layers[l][(i<<1)+1] = mod_symbs[1][((3*i+l)<<1)+1];
-      }
-    break;
-
-    case 6:
-      for (int q=0; q<2; q++)
-        for (int i=0; i<n_symbs/3; i++)
-          for (int l=0; l<3; l++) {
-            tx_layers[l][i<<1] = mod_symbs[q][(3*i+l)<<1];
-            tx_layers[l][(i<<1)+1] = mod_symbs[q][((3*i+l)<<1)+1];
-          }
-    break;
-
-    case 7:
-      for (int i=0; i<n_symbs/3; i++)
-        for (int l=0; l<3; l++) {
-          tx_layers[l][i<<1] = mod_symbs[1][(3*i+l)<<1];
-          tx_layers[l][(i<<1)+1] = mod_symbs[1][((3*i+l)<<1)+1];
-        }
-      for (int i=0; i<n_symbs/4; i++)
-        for (int l=3; l<7; l++) {
-          tx_layers[l][i<<1] = mod_symbs[0][((i<<2)+l)<<1];
-          tx_layers[l][(i<<1)+1] = mod_symbs[0][(((i<<2)+l)<<1)+1];
-        }
-    break;
-
-    case 8:
-      for (int q=0; q<2; q++)
-        for (int i=0; i<n_symbs>>2; i++)
-          for (int l=0; l<3; l++) {
-            tx_layers[l][i<<1] = mod_symbs[q][((i<<2)+l)<<1];
-            tx_layers[l][(i<<1)+1] = mod_symbs[q][(((i<<2)+l)<<1)+1];
-          }
-    break;
-
-  default:
-  AssertFatal(0, "Invalid number of layers %d\n", n_layers);
-  }
-}
-
 static inline uint16_t get_pdsch_dmrs_idx(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type) {
   uint16_t dmrs_idx = (dmrs_type)? (6*n+k_prime+delta):((n<<2)+(k_prime<<1)+delta);
   return dmrs_idx;
@@ -223,7 +152,7 @@ for (int i=0; i<nb_symbols>>3; i++) {
 
 
   /// Layer mapping
-  nr_pdsch_layer_mapping(mod_symbs,
+  nr_layer_mapping(mod_symbs,
                          rel15->nb_layers,
                          nb_symbols,
                          tx_layers);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
index 22ae2a49ca..b5a954a730 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
@@ -68,11 +68,6 @@ void nr_pdsch_codeword_scrambling(uint8_t *in,
                          uint32_t n_RNTI,
                          uint32_t* out);
 
-void nr_pdsch_layer_mapping(int16_t **mod_symbs,
-                         uint8_t n_layers,
-                         uint16_t n_symbs,
-                         int16_t **tx_layers);
-
 void nr_fill_dlsch(PHY_VARS_gNB *gNB,
                    int frame,
                    int slot,
-- 
2.26.2