From 1ec87df5a66fd389f0b847ff0f740c6084d5a773 Mon Sep 17 00:00:00 2001
From: Khalid Ahmed <ahmedkd@iis.fraunhofer.de>
Date: Wed, 3 Apr 2019 18:58:03 +0200
Subject: [PATCH] adding UL dmrs funtionalities to dmrs_nr.c in NR_UE_TRANSPORT

---
 openair1/PHY/MODULATION/nr_modulation.h |  2 ++
 openair1/PHY/NR_REFSIG/dmrs_nr.h        |  2 ++
 openair1/PHY/NR_TRANSPORT/nr_dlsch.c    |  2 +-
 openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c |  7 ++---
 openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h |  3 +-
 openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c  | 39 +++++++++++++++++++++++++
 openair1/SIMULATION/NR_PHY/ulsim.c      |  6 ++--
 7 files changed, 50 insertions(+), 11 deletions(-)

diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h
index e7cda27302..dbe6214ff4 100644
--- a/openair1/PHY/MODULATION/nr_modulation.h
+++ b/openair1/PHY/MODULATION/nr_modulation.h
@@ -25,6 +25,8 @@
 #include <stdint.h>
 #include "PHY/defs_nr_common.h"
 
+#define DMRS_MOD_ORDER 2
+
 /*! \brief Perform NR modulation. TS 38.211 V15.4.0 subclause 5.1
   @param[in] in, Pointer to input bits
   @param[in] length, size of input bits
diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.h b/openair1/PHY/NR_REFSIG/dmrs_nr.h
index a695006304..9b02d2b1af 100644
--- a/openair1/PHY/NR_REFSIG/dmrs_nr.h
+++ b/openair1/PHY/NR_REFSIG/dmrs_nr.h
@@ -54,6 +54,8 @@
 int pseudo_random_sequence(int M_PN, uint32_t *c, uint32_t cinit);
 void lte_gold_new(LTE_DL_FRAME_PARMS *frame_parms, uint32_t lte_gold_table[20][2][14], uint16_t Nid_cell);
 void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE], uint16_t Nid_cell);
+uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position);
+uint16_t get_dmrs_freq_idx_ul(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type);
 
 #undef EXTERN
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index 3316e507c6..9a4df38895 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -172,7 +172,7 @@ for (int l=0; l<rel15->nb_layers; l++)
   uint8_t dmrs_type = config->pdsch_config.dmrs_type.value;
   uint8_t mapping_type = config->pdsch_config.mapping_type.value;
 
-  l0 = get_l0(mapping_type, 2, 0);//config->pdsch_config.dmrs_typeA_position.value);
+  l0 = get_l0(mapping_type, 2);//config->pdsch_config.dmrs_typeA_position.value);
   nr_modulation(pdsch_dmrs[l0][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
 
 #ifdef DEBUG_DLSCH
diff --git a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c
index 1254ae67b6..8d9bf00639 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c
@@ -90,11 +90,8 @@ uint16_t get_dmrs_freq_idx(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dm
   return dmrs_idx;
 }
 
-uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position, int ul_flag) {
+uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position) {
 
-  if (ul_flag)
-    return ((mapping_type==NFAPI_NR_PDSCH_MAPPING_TYPE_A)?dmrs_typeA_position:0);
-  else
-    return ((mapping_type==typeA)?dmrs_typeA_position:0);
+  return ((mapping_type==NFAPI_NR_PDSCH_MAPPING_TYPE_A)?dmrs_typeA_position:0);
 
 }
diff --git a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h
index ab8f21395e..3351b63a0d 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h
@@ -34,7 +34,6 @@
 
 #define NR_PDSCH_DMRS_ANTENNA_PORT0 1000
 #define NR_PDSCH_DMRS_NB_ANTENNA_PORTS 12
-#define DMRS_MOD_ORDER 2
 
 void get_l_prime(uint8_t *l_prime, uint8_t n_symbs);
 
@@ -48,4 +47,4 @@ uint8_t get_delta(uint8_t ap, uint8_t config);
 
 uint16_t get_dmrs_freq_idx(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type);
 
-uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position, int ul_flag);
+uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c
index 1bccda4dc1..13a2246e69 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c
@@ -224,6 +224,45 @@ void lte_gold_new(LTE_DL_FRAME_PARMS *frame_parms, uint32_t lte_gold_table[20][2
 #endif
 }
 
+/*******************************************************************
+*
+* NAME :         get_l0_ul
+*
+* PARAMETERS :   mapping_type : PUSCH mapping type
+*                dmrs_typeA_position  : higher layer parameter
+*
+* RETURN :       demodulation reference signal for PUSCH
+*
+* DESCRIPTION :  see TS 38.211 V15.4.0 Demodulation reference signals for PUSCH
+*
+*********************************************************************/
+
+uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position) {
+
+  return ((mapping_type==typeA)?dmrs_typeA_position:0);
+
+}
+
+/*******************************************************************
+*
+* NAME :         get_dmrs_freq_idx_ul
+*
+* PARAMETERS :   n : index of DMRS symbol
+*                k_prime  : k_prime = {0,1}
+*                delta : given by Tables 6.4.1.1.3-1 and 6.4.1.1.3-2
+*                dmrs_type  : DMRS configuration type
+*
+* RETURN :       demodulation reference signal for PUSCH
+*
+* DESCRIPTION :  see TS 38.211 V15.4.0 Demodulation reference signals for PUSCH
+*
+*********************************************************************/
+
+uint16_t get_dmrs_freq_idx_ul(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;
+}
+
 /*******************************************************************
 *
 * NAME :         get_dmrs_pbch
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 47fec1f25b..e8d5d6973c 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -46,7 +46,7 @@
 #include "PHY/NR_TRANSPORT/nr_transport.h"
 #include "PHY/NR_TRANSPORT/nr_dlsch.h"
 #include "PHY/NR_TRANSPORT/nr_ulsch.h"
-#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
+#include "PHY/NR_REFSIG/dmrs_nr.h"
 #include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
 #include "PHY/NR_TRANSPORT/nr_transport_proto.h"
 #include "SCHED_NR/sched_nr.h"
@@ -592,7 +592,7 @@ int main(int argc, char **argv) {
   dmrs_type = UE->dmrs_UplinkConfig.pusch_dmrs_type;
   mapping_type = UE->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType;
 
-  l0 = get_l0(mapping_type, 2, 1);
+  l0 = get_l0_ul(mapping_type, 2);
   nr_modulation(pusch_dmrs[l0][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
 
 
@@ -642,7 +642,7 @@ int main(int argc, char **argv) {
       sample_offsetF = l*frame_parms->ofdm_symbol_size + k;
 
       for (i=0; i<nb_rb*NR_NB_SC_PER_RB; i++) {
-        if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_type))%(frame_parms->ofdm_symbol_size)))) {
+        if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx_ul(n, k_prime, delta, dmrs_type))%(frame_parms->ofdm_symbol_size)))) {
           ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15;
           ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
 #ifdef DEBUG_PUSCH_MAPPING
-- 
2.26.2