Commit 9d844135 authored by Laurent THOMAS's avatar Laurent THOMAS

local dmrs_mux and unaligned mod_dmrs

parent 3ddb2d05
...@@ -46,7 +46,6 @@ ...@@ -46,7 +46,6 @@
#ifdef __aarch64__ #ifdef __aarch64__
#define USE128BIT #define USE128BIT
#endif #endif
#define USE128BIT
static void nr_pdsch_codeword_scrambling(uint8_t *in, uint32_t size, uint8_t q, uint32_t Nid, uint32_t n_RNTI, uint32_t *out) static void nr_pdsch_codeword_scrambling(uint8_t *in, uint32_t size, uint8_t q, uint32_t Nid, uint32_t n_RNTI, uint32_t *out)
{ {
...@@ -57,7 +56,7 @@ static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15, ...@@ -57,7 +56,7 @@ static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15,
int start_sc, int start_sc,
int k, int k,
uint *cur_re, uint *cur_re,
NR_DL_FRAME_PARMS *frame_parms, int symbol_sz,
c16_t *output, c16_t *output,
c16_t *tx_layer, c16_t *tx_layer,
int amp, int amp,
...@@ -74,7 +73,7 @@ static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15, ...@@ -74,7 +73,7 @@ static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15,
rel15->rbSize, rel15->rbSize,
rel15->PTRSReOffset, rel15->PTRSReOffset,
start_sc, start_sc,
frame_parms->ofdm_symbol_size); symbol_sz);
if (is_ptrs_re) { if (is_ptrs_re) {
/* check if cuurent RE is PTRS RE*/ /* check if cuurent RE is PTRS RE*/
uint16_t beta_ptrs = 1; uint16_t beta_ptrs = 1;
...@@ -96,30 +95,26 @@ static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15, ...@@ -96,30 +95,26 @@ static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15,
#endif #endif
*cur_re = *cur_re + 1; *cur_re = *cur_re + 1;
} }
if (++k >= frame_parms->ofdm_symbol_size) if (++k >= symbol_sz)
k -= frame_parms->ofdm_symbol_size; k -= symbol_sz;
} }
return k; return k;
} }
static inline void dmrs_case1(c16_t *txF, static inline void
c16_t *dmrs_mux, dmrs_case1(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc, int upper_limit, int remaining_re)
c16_t *mod_dmrs,
const int amp_dmrs,
int sz,
int start_sc,
int upper_limit,
int remaining_re)
{ {
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 0 : d0 0 d1 0 ... dNm2 0 dNm1 0 (ul %d, rr %d)\n", upper_limit, remaining_re); printf("doing DMRS pattern for port 0 : d0 0 d1 0 ... dNm2 0 dNm1 0 (ul %d, rr %d)\n", upper_limit, remaining_re);
#endif #endif
#if defined(USE128BIT) // add filler to process all as SIMD
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
#if defined(USE128BIT)
simde__m128i d0, d2, d3, zeros = simde_mm_setzero_si128(), amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs); simde__m128i d0, d2, d3, zeros = simde_mm_setzero_si128(), amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 3; i++) { for (i = 0, j = 0; i < (sz) >> 3; i++) {
d0 = simde_mm_mulhrs_epi16(((simde__m128i *)mod_dmrs)[i], amp_dmrs128); d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)mod_dmrs+i), amp_dmrs128);
d2 = simde_mm_unpacklo_epi32(d0, zeros); d2 = simde_mm_unpacklo_epi32(d0, zeros);
d3 = simde_mm_unpackhi_epi32(d0, zeros); d3 = simde_mm_unpackhi_epi32(d0, zeros);
((simde__m128i *)dmrs_mux)[j++] = d2; ((simde__m128i *)dmrs_mux)[j++] = d2;
...@@ -141,7 +136,7 @@ static inline void dmrs_case1(c16_t *txF, ...@@ -141,7 +136,7 @@ static inline void dmrs_case1(c16_t *txF,
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 5; i++) { for (i = 0, j = 0; i < (sz) >> 5; i++) {
d0 = _mm512_mulhrs_epi16(((__m512i *)mod_dmrs)[i], amp_dmrs512); d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)mod_dmrs + i), amp_dmrs512);
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, perml, zeros); // ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, perml, zeros); //
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, permh, zeros); ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, permh, zeros);
} }
...@@ -159,7 +154,7 @@ static inline void dmrs_case1(c16_t *txF, ...@@ -159,7 +154,7 @@ static inline void dmrs_case1(c16_t *txF,
simde__m256i d0, d2, d3, zeros = simde_mm256_setzero_si256(), amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs); simde__m256i d0, d2, d3, zeros = simde_mm256_setzero_si256(), amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 4; i++) { for (i = 0, j = 0; i < (sz) >> 4; i++) {
d0 = simde_mm256_mulhrs_epi16(((simde__m256i *)mod_dmrs)[i], amp_dmrs256); d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)mod_dmrs + i), amp_dmrs256);
d2 = simde_mm256_unpacklo_epi32(d0, zeros); d2 = simde_mm256_unpacklo_epi32(d0, zeros);
d3 = simde_mm256_unpackhi_epi32(d0, zeros); d3 = simde_mm256_unpackhi_epi32(d0, zeros);
((simde__m256i *)dmrs_mux)[j++] = simde_mm256_permute2x128_si256(d2, d3, 32); ((simde__m256i *)dmrs_mux)[j++] = simde_mm256_permute2x128_si256(d2, d3, 32);
...@@ -181,18 +176,14 @@ static inline void dmrs_case1(c16_t *txF, ...@@ -181,18 +176,14 @@ static inline void dmrs_case1(c16_t *txF,
memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re); memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re);
} }
static inline void dmrs_case2(c16_t *txF, static inline void
c16_t *dmrs_mux, dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc, int upper_limit, int remaining_re)
c16_t *mod_dmrs,
const int amp_dmrs,
int sz,
int start_sc,
int upper_limit,
int remaining_re)
{ {
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 1 : d0 0 -d1 0 ...dNm2 0 -dNm1 0\n"); printf("doing DMRS pattern for port 1 : d0 0 -d1 0 ...dNm2 0 -dNm1 0\n");
#endif #endif
// add filler to process all as SIMD
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
#if defined(USE128BIT) #if defined(USE128BIT)
simde__m128i d0, d2, d3, simde__m128i d0, d2, d3,
...@@ -200,7 +191,7 @@ static inline void dmrs_case2(c16_t *txF, ...@@ -200,7 +191,7 @@ static inline void dmrs_case2(c16_t *txF,
amp_dmrs128 = simde_mm_set_epi16(-amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs, -amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs); amp_dmrs128 = simde_mm_set_epi16(-amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs, -amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 3; i++) { for (i = 0, j = 0; i < (sz) >> 3; i++) {
d0 = simde_mm_mulhrs_epi16(((simde__m128i *)mod_dmrs)[i], amp_dmrs128); d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)mod_dmrs + i), amp_dmrs128);
d2 = simde_mm_unpacklo_epi32(d0, zeros); d2 = simde_mm_unpacklo_epi32(d0, zeros);
d3 = simde_mm_unpackhi_epi32(d0, zeros); d3 = simde_mm_unpackhi_epi32(d0, zeros);
((simde__m128i *)dmrs_mux)[j++] = d2; ((simde__m128i *)dmrs_mux)[j++] = d2;
...@@ -260,7 +251,7 @@ static inline void dmrs_case2(c16_t *txF, ...@@ -260,7 +251,7 @@ static inline void dmrs_case2(c16_t *txF,
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 5; i++) { for (i = 0, j = 0; i < (sz) >> 5; i++) {
d0 = _mm512_mulhrs_epi16(((__m512i *)mod_dmrs)[i], amp_dmrs512); d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)mod_dmrs + i), amp_dmrs512);
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, perml, zeros); // ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, perml, zeros); //
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, permh, zeros); ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, permh, zeros);
} }
...@@ -295,7 +286,7 @@ static inline void dmrs_case2(c16_t *txF, ...@@ -295,7 +286,7 @@ static inline void dmrs_case2(c16_t *txF,
amp_dmrs); amp_dmrs);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 4; i++) { for (i = 0, j = 0; i < (sz) >> 4; i++) {
d0 = simde_mm256_mulhrs_epi16(((simde__m256i *)mod_dmrs)[i], amp_dmrs256); d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)mod_dmrs + i), amp_dmrs256);
d2 = simde_mm256_unpacklo_epi32(d0, zeros); d2 = simde_mm256_unpacklo_epi32(d0, zeros);
d3 = simde_mm256_unpackhi_epi32(d0, zeros); d3 = simde_mm256_unpackhi_epi32(d0, zeros);
((simde__m256i *)dmrs_mux)[j++] = simde_mm256_permute2x128_si256(d2, d3, 32); ((simde__m256i *)dmrs_mux)[j++] = simde_mm256_permute2x128_si256(d2, d3, 32);
...@@ -323,23 +314,21 @@ static inline void dmrs_case2(c16_t *txF, ...@@ -323,23 +314,21 @@ static inline void dmrs_case2(c16_t *txF,
memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re); memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re);
} }
static inline void dmrs_case3(c16_t *txF, static inline void
c16_t *dmrs_mux, dmrs_case3(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc, int upper_limit, int remaining_re)
c16_t *mod_dmrs,
const int amp_dmrs,
int sz,
int start_sc,
int upper_limit,
int remaining_re)
{ {
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 2 : 0 d0 0 d1 ... 0 dNm2 0 dNm1\n"); printf("doing DMRS pattern for port 2 : 0 d0 0 d1 ... 0 dNm2 0 dNm1\n");
#endif #endif
// add filler to process all as SIMD
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
#if defined(USE128BIT) #if defined(USE128BIT)
simde__m128i d0, d2, d3, zeros = simde_mm_setzero_si128(), amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs); simde__m128i d0, d2, d3, zeros = simde_mm_setzero_si128(), amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 3; i++) { for (i = 0, j = 0; i < (sz) >> 3; i++) {
d0 = simde_mm_mulhrs_epi16(((simde__m128i *)mod_dmrs)[i], amp_dmrs128); d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)mod_dmrs + i), amp_dmrs128);
d2 = simde_mm_unpacklo_epi32(zeros, d0); d2 = simde_mm_unpacklo_epi32(zeros, d0);
d3 = simde_mm_unpackhi_epi32(zeros, d0); d3 = simde_mm_unpackhi_epi32(zeros, d0);
((simde__m128i *)dmrs_mux)[j++] = d2; ((simde__m128i *)dmrs_mux)[j++] = d2;
...@@ -361,7 +350,7 @@ static inline void dmrs_case3(c16_t *txF, ...@@ -361,7 +350,7 @@ static inline void dmrs_case3(c16_t *txF,
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 5; i++) { for (i = 0, j = 0; i < (sz) >> 5; i++) {
d0 = _mm512_mulhrs_epi16(((__m512i *)mod_dmrs)[i], amp_dmrs512); d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)mod_dmrs + i), amp_dmrs512);
d2 = _mm512_unpacklo_epi32(zeros, d0); // 0 d0_0 0 d0_1 0 d0_4 0 d0_5 0 d0_8 0 d0_9 0 d0_12 0 d0_13 d2 = _mm512_unpacklo_epi32(zeros, d0); // 0 d0_0 0 d0_1 0 d0_4 0 d0_5 0 d0_8 0 d0_9 0 d0_12 0 d0_13
d3 = _mm512_unpackhi_epi32(zeros, d0); // 0 d0_2 0 d0_3 0 d0_6 0 d0_7 0 d0_10 0 d0_11 d0_14 0 d0_15 d3 = _mm512_unpackhi_epi32(zeros, d0); // 0 d0_2 0 d0_3 0 d0_6 0 d0_7 0 d0_10 0 d0_11 d0_14 0 d0_15
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d2, perml, d3); // ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d2, perml, d3); //
...@@ -382,7 +371,7 @@ static inline void dmrs_case3(c16_t *txF, ...@@ -382,7 +371,7 @@ static inline void dmrs_case3(c16_t *txF,
simde__m256i d0, d2, d3, zeros = simde_mm256_setzero_si256(), amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs); simde__m256i d0, d2, d3, zeros = simde_mm256_setzero_si256(), amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 4; i++) { for (i = 0, j = 0; i < (sz) >> 4; i++) {
d0 = simde_mm256_mulhrs_epi16(((simde__m256i *)mod_dmrs)[i], amp_dmrs256); d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)mod_dmrs + i), amp_dmrs256);
d2 = simde_mm256_unpacklo_epi32(zeros, d0); d2 = simde_mm256_unpacklo_epi32(zeros, d0);
d3 = simde_mm256_unpackhi_epi32(zeros, d0); d3 = simde_mm256_unpackhi_epi32(zeros, d0);
((simde__m256i *)dmrs_mux)[j++] = simde_mm256_permute2x128_si256(d2, d3, 32); ((simde__m256i *)dmrs_mux)[j++] = simde_mm256_permute2x128_si256(d2, d3, 32);
...@@ -404,25 +393,22 @@ static inline void dmrs_case3(c16_t *txF, ...@@ -404,25 +393,22 @@ static inline void dmrs_case3(c16_t *txF,
memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re); memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re);
} }
static inline void dmrs_case4(c16_t *txF, static inline void
c16_t *dmrs_mux, dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc, int upper_limit, int remaining_re)
c16_t *mod_dmrs,
const int amp_dmrs,
int sz,
int start_sc,
int upper_limit,
int remaining_re)
{ {
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 3 : 0 d0 0 -d1 ... 0 dNm2 0 -dNm1\n"); printf("doing DMRS pattern for port 3 : 0 d0 0 -d1 ... 0 dNm2 0 -dNm1\n");
#endif #endif
// add filler to process all as SIMD
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
#if defined(USE128BIT) #if defined(USE128BIT)
simde__m128i d0, d2, d3, simde__m128i d0, d2, d3,
zeros = simde_mm_setzero_si128(), zeros = simde_mm_setzero_si128(),
amp_dmrs128 = simde_mm_set_epi16(-amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs, -amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs); amp_dmrs128 = simde_mm_set_epi16(-amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs, -amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 3; i++) { for (i = 0, j = 0; i < (sz) >> 3; i++) {
d0 = simde_mm_mulhrs_epi16(((simde__m128i *)mod_dmrs)[i], amp_dmrs128); d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)mod_dmrs + i), amp_dmrs128);
d2 = simde_mm_unpacklo_epi32(zeros, d0); d2 = simde_mm_unpacklo_epi32(zeros, d0);
d3 = simde_mm_unpackhi_epi32(zeros, d0); d3 = simde_mm_unpackhi_epi32(zeros, d0);
((simde__m128i *)dmrs_mux)[j++] = d2; ((simde__m128i *)dmrs_mux)[j++] = d2;
...@@ -484,7 +470,7 @@ static inline void dmrs_case4(c16_t *txF, ...@@ -484,7 +470,7 @@ static inline void dmrs_case4(c16_t *txF,
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 5; i++) { for (i = 0, j = 0; i < (sz) >> 5; i++) {
d0 = _mm512_mulhrs_epi16(((__m512i *)mod_dmrs)[i], amp_dmrs512); d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)mod_dmrs + i), amp_dmrs512);
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(zeros, perml, d0); // ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(zeros, perml, d0); //
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(zeros, permh, d0); ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(zeros, permh, d0);
} }
...@@ -524,7 +510,7 @@ static inline void dmrs_case4(c16_t *txF, ...@@ -524,7 +510,7 @@ static inline void dmrs_case4(c16_t *txF,
amp_dmrs); amp_dmrs);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 4; i++) { for (i = 0, j = 0; i < (sz) >> 4; i++) {
d0 = simde_mm256_mulhrs_epi16(((simde__m256i *)mod_dmrs)[i], amp_dmrs256); d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)mod_dmrs + i), amp_dmrs256);
d2 = simde_mm256_unpacklo_epi32(zeros, d0); d2 = simde_mm256_unpacklo_epi32(zeros, d0);
d3 = simde_mm256_unpackhi_epi32(zeros, d0); d3 = simde_mm256_unpackhi_epi32(zeros, d0);
((simde__m256i *)dmrs_mux)[j++] = simde_mm256_permute2x128_si256(d2, d3, 32); ((simde__m256i *)dmrs_mux)[j++] = simde_mm256_permute2x128_si256(d2, d3, 32);
...@@ -556,7 +542,6 @@ static inline void dmrs_case4(c16_t *txF, ...@@ -556,7 +542,6 @@ static inline void dmrs_case4(c16_t *txF,
static inline void dmrs_case5(c16_t *txF, static inline void dmrs_case5(c16_t *txF,
c16_t *txl, c16_t *txl,
c16_t *dmrs_mux,
c16_t *mod_dmrs, c16_t *mod_dmrs,
const int amp_dmrs, const int amp_dmrs,
const int amp, const int amp,
...@@ -569,12 +554,15 @@ static inline void dmrs_case5(c16_t *txF, ...@@ -569,12 +554,15 @@ static inline void dmrs_case5(c16_t *txF,
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 0 : d0 X0 d1 X1 ... dNm2 XNm2 dNm1 XNm1\n"); printf("doing DMRS pattern for port 0 : d0 X0 d1 X1 ... dNm2 XNm2 dNm1 XNm1\n");
#endif #endif
// add filler to process all as SIMD
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
c16_t *txlc = txl + *cur_re; c16_t *txlc = txl + *cur_re;
#if defined(USE128BIT) #if defined(USE128BIT)
simde__m128i d0, d1, d2, d3, amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs), amp128 = simde_mm_set1_epi16(amp); simde__m128i d0, d1, d2, d3, amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs), amp128 = simde_mm_set1_epi16(amp);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 3; i++) { for (i = 0, j = 0; i < (sz) >> 3; i++) {
d0 = simde_mm_mulhrs_epi16(((simde__m128i *)mod_dmrs)[i], amp_dmrs128); d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)mod_dmrs + i), amp_dmrs128);
d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128(((simde__m128i *)txlc) + i), amp128); d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128(((simde__m128i *)txlc) + i), amp128);
d2 = simde_mm_unpacklo_epi32(d0, d1); d2 = simde_mm_unpacklo_epi32(d0, d1);
d3 = simde_mm_unpackhi_epi32(d0, d1); d3 = simde_mm_unpackhi_epi32(d0, d1);
...@@ -597,7 +585,7 @@ static inline void dmrs_case5(c16_t *txF, ...@@ -597,7 +585,7 @@ static inline void dmrs_case5(c16_t *txF,
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 5; i++) { for (i = 0, j = 0; i < (sz) >> 5; i++) {
d0 = _mm512_mulhrs_epi16(((__m512i *)mod_dmrs)[i], amp_dmrs512); d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)mod_dmrs + i), amp_dmrs512);
d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512(((__m512i *)txlc) + i), amp512); d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512(((__m512i *)txlc) + i), amp512);
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, perml, d1); // ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, perml, d1); //
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, permh, d1); ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, permh, d1);
...@@ -616,7 +604,7 @@ static inline void dmrs_case5(c16_t *txF, ...@@ -616,7 +604,7 @@ static inline void dmrs_case5(c16_t *txF,
simde__m256i d0, d1, d2, d3, amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs), amp256 = simde_mm256_set1_epi16(amp); simde__m256i d0, d1, d2, d3, amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs), amp256 = simde_mm256_set1_epi16(amp);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 4; i++) { for (i = 0, j = 0; i < (sz) >> 4; i++) {
d0 = simde_mm256_mulhrs_epi16(((simde__m256i *)mod_dmrs)[i], amp_dmrs256); d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)mod_dmrs + i), amp_dmrs256);
d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256(((simde__m256i *)txlc) + i), amp256); d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256(((simde__m256i *)txlc) + i), amp256);
d2 = simde_mm256_unpacklo_epi32(d0, d1); d2 = simde_mm256_unpacklo_epi32(d0, d1);
d3 = simde_mm256_unpackhi_epi32(d0, d1); d3 = simde_mm256_unpackhi_epi32(d0, d1);
...@@ -642,7 +630,6 @@ static inline void dmrs_case5(c16_t *txF, ...@@ -642,7 +630,6 @@ static inline void dmrs_case5(c16_t *txF,
static inline void dmrs_case6(c16_t *txF, static inline void dmrs_case6(c16_t *txF,
c16_t *txl, c16_t *txl,
c16_t *dmrs_mux,
c16_t *mod_dmrs, c16_t *mod_dmrs,
const int amp_dmrs, const int amp_dmrs,
const int amp, const int amp,
...@@ -655,6 +642,8 @@ static inline void dmrs_case6(c16_t *txF, ...@@ -655,6 +642,8 @@ static inline void dmrs_case6(c16_t *txF,
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 1 : d0 X0 -d1 X1 ...dNm2 XNm2 -dNm1 XNm1\n"); printf("doing DMRS pattern for port 1 : d0 X0 -d1 X1 ...dNm2 XNm2 -dNm1 XNm1\n");
#endif #endif
// add filler to process all as SIMD
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
c16_t *txlc = txl + *cur_re; c16_t *txlc = txl + *cur_re;
#if defined(USE128BIT) #if defined(USE128BIT)
simde__m128i d0, d1, d2, d3, simde__m128i d0, d1, d2, d3,
...@@ -662,7 +651,7 @@ static inline void dmrs_case6(c16_t *txF, ...@@ -662,7 +651,7 @@ static inline void dmrs_case6(c16_t *txF,
amp128 = simde_mm_set1_epi16(amp); amp128 = simde_mm_set1_epi16(amp);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 3; i++) { for (i = 0, j = 0; i < (sz) >> 3; i++) {
d0 = simde_mm_mulhrs_epi16(((simde__m128i *)mod_dmrs)[i], amp_dmrs128); d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)mod_dmrs + i), amp_dmrs128);
d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128(((simde__m128i *)txlc) + i), amp128); d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128(((simde__m128i *)txlc) + i), amp128);
d2 = simde_mm_unpacklo_epi32(d0, d1); d2 = simde_mm_unpacklo_epi32(d0, d1);
d3 = simde_mm_unpackhi_epi32(d0, d1); d3 = simde_mm_unpackhi_epi32(d0, d1);
...@@ -725,7 +714,7 @@ static inline void dmrs_case6(c16_t *txF, ...@@ -725,7 +714,7 @@ static inline void dmrs_case6(c16_t *txF,
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 5; i++) { for (i = 0, j = 0; i < (sz) >> 5; i++) {
d0 = _mm512_mulhrs_epi16(((__m512i *)mod_dmrs)[i], amp_dmrs512); d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)mod_dmrs + i), amp_dmrs512);
d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512(((__m512i *)txlc) + i), amp512); d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512(((__m512i *)txlc) + i), amp512);
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, perml, d1); // ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, perml, d1); //
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, permh, d1); ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d0, permh, d1);
...@@ -767,7 +756,7 @@ static inline void dmrs_case6(c16_t *txF, ...@@ -767,7 +756,7 @@ static inline void dmrs_case6(c16_t *txF,
amp256 = simde_mm256_set1_epi16(amp); amp256 = simde_mm256_set1_epi16(amp);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 4; i++) { for (i = 0, j = 0; i < (sz) >> 4; i++) {
d0 = simde_mm256_mulhrs_epi16(((simde__m256i *)mod_dmrs)[i], amp_dmrs256); d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)mod_dmrs + i), amp_dmrs256);
d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256(((simde__m256i *)txlc) + i), amp256); d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256(((simde__m256i *)txlc) + i), amp256);
d2 = simde_mm256_unpacklo_epi32(d0, d1); d2 = simde_mm256_unpacklo_epi32(d0, d1);
d3 = simde_mm256_unpackhi_epi32(d0, d1); d3 = simde_mm256_unpackhi_epi32(d0, d1);
...@@ -800,7 +789,6 @@ static inline void dmrs_case6(c16_t *txF, ...@@ -800,7 +789,6 @@ static inline void dmrs_case6(c16_t *txF,
static inline void dmrs_case7(c16_t *txF, static inline void dmrs_case7(c16_t *txF,
c16_t *txl, c16_t *txl,
c16_t *dmrs_mux,
c16_t *mod_dmrs, c16_t *mod_dmrs,
const int amp_dmrs, const int amp_dmrs,
const int amp, const int amp,
...@@ -813,13 +801,16 @@ static inline void dmrs_case7(c16_t *txF, ...@@ -813,13 +801,16 @@ static inline void dmrs_case7(c16_t *txF,
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 2 : X0 d0 X1 d1 ... XNm2 dNm2 XNm1 dNm1\n"); printf("doing DMRS pattern for port 2 : X0 d0 X1 d1 ... XNm2 dNm2 XNm1 dNm1\n");
#endif #endif
// add filler to process all as SIMD
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
c16_t *txlc = txl + *cur_re; c16_t *txlc = txl + *cur_re;
#if defined(USE128BIT) #if defined(USE128BIT)
simde__m128i d0, d1, d2, d3, amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs), amp128 = simde_mm_set1_epi16(amp); simde__m128i d0, d1, d2, d3, amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs), amp128 = simde_mm_set1_epi16(amp);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 3; i++) { for (i = 0, j = 0; i < (sz) >> 3; i++) {
d1 = simde_mm_mulhrs_epi16(((simde__m128i *)mod_dmrs)[i], amp_dmrs128); d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)mod_dmrs + i), amp_dmrs128);
d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128(((simde__m128i *)txlc) + i), amp128); d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128(((simde__m128i *)txlc) + i), amp128);
d2 = simde_mm_unpacklo_epi32(d0, d1); d2 = simde_mm_unpacklo_epi32(d0, d1);
d3 = simde_mm_unpackhi_epi32(d0, d1); d3 = simde_mm_unpackhi_epi32(d0, d1);
...@@ -842,7 +833,7 @@ static inline void dmrs_case7(c16_t *txF, ...@@ -842,7 +833,7 @@ static inline void dmrs_case7(c16_t *txF,
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 5; i++) { for (i = 0, j = 0; i < (sz) >> 5; i++) {
d0 = _mm512_mulhrs_epi16(((__m512i *)mod_dmrs)[i], amp_dmrs512); d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)mod_dmrs + i), amp_dmrs512);
d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512(((__m512i *)txlc) + i), amp512); d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512(((__m512i *)txlc) + i), amp512);
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d1, perml, d0); // ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d1, perml, d0); //
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d1, permh, d0); ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d1, permh, d0);
...@@ -861,7 +852,7 @@ static inline void dmrs_case7(c16_t *txF, ...@@ -861,7 +852,7 @@ static inline void dmrs_case7(c16_t *txF,
simde__m256i d0, d1, d2, d3, amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs), amp256 = simde_mm256_set1_epi16(amp); simde__m256i d0, d1, d2, d3, amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs), amp256 = simde_mm256_set1_epi16(amp);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 4; i++) { for (i = 0, j = 0; i < (sz) >> 4; i++) {
d1 = simde_mm256_mulhrs_epi16(((simde__m256i *)mod_dmrs)[i], amp_dmrs256); d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)mod_dmrs + i), amp_dmrs256);
d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256(((simde__m256i *)txlc) + i), amp256); d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256(((simde__m256i *)txlc) + i), amp256);
d2 = simde_mm256_unpacklo_epi32(d0, d1); d2 = simde_mm256_unpacklo_epi32(d0, d1);
d3 = simde_mm256_unpackhi_epi32(d0, d1); d3 = simde_mm256_unpackhi_epi32(d0, d1);
...@@ -887,7 +878,6 @@ static inline void dmrs_case7(c16_t *txF, ...@@ -887,7 +878,6 @@ static inline void dmrs_case7(c16_t *txF,
static inline void dmrs_case8(c16_t *txF, static inline void dmrs_case8(c16_t *txF,
c16_t *txl, c16_t *txl,
c16_t *dmrs_mux,
c16_t *mod_dmrs, c16_t *mod_dmrs,
const int amp_dmrs, const int amp_dmrs,
const int amp, const int amp,
...@@ -900,6 +890,10 @@ static inline void dmrs_case8(c16_t *txF, ...@@ -900,6 +890,10 @@ static inline void dmrs_case8(c16_t *txF,
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 3 : X0 d0 X1 -d1 ... XNm2 dNm2 XNm1 -dNm1\n"); printf("doing DMRS pattern for port 3 : X0 d0 X1 -d1 ... XNm2 dNm2 XNm1 -dNm1\n");
#endif #endif
// add filler to process all as SIMD
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
c16_t *txlc = txl + *cur_re; c16_t *txlc = txl + *cur_re;
#if defined(USE128BIT) #if defined(USE128BIT)
simde__m128i d0, d1, d2, d3, simde__m128i d0, d1, d2, d3,
...@@ -907,7 +901,7 @@ static inline void dmrs_case8(c16_t *txF, ...@@ -907,7 +901,7 @@ static inline void dmrs_case8(c16_t *txF,
amp128 = simde_mm_set1_epi16(amp); amp128 = simde_mm_set1_epi16(amp);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 3; i++) { for (i = 0, j = 0; i < (sz) >> 3; i++) {
d1 = simde_mm_mulhrs_epi16(((simde__m128i *)mod_dmrs)[i], amp_dmrs128); d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)mod_dmrs + i), amp_dmrs128);
d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128(((simde__m128i *)txlc) + i), amp128); d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128(((simde__m128i *)txlc) + i), amp128);
d2 = simde_mm_unpacklo_epi32(d0, d1); d2 = simde_mm_unpacklo_epi32(d0, d1);
d3 = simde_mm_unpackhi_epi32(d0, d1); d3 = simde_mm_unpackhi_epi32(d0, d1);
...@@ -969,7 +963,7 @@ static inline void dmrs_case8(c16_t *txF, ...@@ -969,7 +963,7 @@ static inline void dmrs_case8(c16_t *txF,
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 5; i++) { for (i = 0, j = 0; i < (sz) >> 5; i++) {
d0 = _mm512_mulhrs_epi16(((__m512i *)mod_dmrs)[i], amp_dmrs512); d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)mod_dmrs + i), amp_dmrs512);
d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512(((__m512i *)txlc) + i), amp512); d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512(((__m512i *)txlc) + i), amp512);
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d1, perml, d0); // ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d1, perml, d0); //
((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d1, permh, d0); ((__m512i *)dmrs_mux)[j++] = _mm512_permutex2var_epi32(d1, permh, d0);
...@@ -1012,7 +1006,7 @@ static inline void dmrs_case8(c16_t *txF, ...@@ -1012,7 +1006,7 @@ static inline void dmrs_case8(c16_t *txF,
amp256 = simde_mm256_set1_epi16(amp); amp256 = simde_mm256_set1_epi16(amp);
int i, j; int i, j;
for (i = 0, j = 0; i < (sz) >> 4; i++) { for (i = 0, j = 0; i < (sz) >> 4; i++) {
d1 = simde_mm256_mulhrs_epi16(((simde__m256i *)mod_dmrs)[i], amp_dmrs256); d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)mod_dmrs + i), amp_dmrs256);
d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256(((simde__m256i *)txlc) + i), amp256); d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256(((simde__m256i *)txlc) + i), amp256);
d2 = simde_mm256_unpacklo_epi32(d0, d1); d2 = simde_mm256_unpacklo_epi32(d0, d1);
d3 = simde_mm256_unpackhi_epi32(d0, d1); d3 = simde_mm256_unpackhi_epi32(d0, d1);
...@@ -1056,26 +1050,29 @@ static inline int dmrs_case9(int k, ...@@ -1056,26 +1050,29 @@ static inline int dmrs_case9(int k,
const int dmrs_Type, const int dmrs_Type,
uint8_t *k_prime, uint8_t *k_prime,
uint16_t *n, uint16_t *n,
NR_DL_FRAME_PARMS *frame_parms, int symbol_sz,
int l_prime, int l_prime,
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15) nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15)
{ {
// add filler to process all as SIMD
//c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
// DMRS params for this dmrs port // DMRS params for this dmrs port
int Wt[2], Wf[2]; int Wt[2], Wf[2];
get_Wt(Wt, dmrs_port, dmrs_Type); get_Wt(Wt, dmrs_port, dmrs_Type);
get_Wf(Wf, dmrs_port, dmrs_Type); get_Wf(Wf, dmrs_port, dmrs_Type);
const int8_t delta = get_delta(dmrs_port, dmrs_Type); const int8_t delta = get_delta(dmrs_port, dmrs_Type);
int dmrs_idx2 = 0; int dmrs_idx = 0;
for (int i = 0; i < sz; i++) { for (int i = 0; i < sz; i++) {
if (k == ((start_sc + get_dmrs_freq_idx(*n, *k_prime, delta, dmrs_Type)) % (frame_parms->ofdm_symbol_size))) { if (k == ((start_sc + get_dmrs_freq_idx(*n, *k_prime, delta, dmrs_Type)) % (symbol_sz))) {
txF[k] = c16mulRealShift(mod_dmrs[dmrs_idx2], Wt[l_prime] * Wf[*k_prime] * amp_dmrs, 15); txF[k] = c16mulRealShift(mod_dmrs[dmrs_idx], Wt[l_prime] * Wf[*k_prime] * amp_dmrs, 15);
dmrs_idx2++; dmrs_idx++;
*k_prime = (*k_prime + 1) & 1; *k_prime = (*k_prime + 1) & 1;
*n = *n + ((*k_prime) ? 0 : 1); *n = *n + ((*k_prime) ? 0 : 1);
} }
/* Map PTRS Symbol */ /* Map PTRS Symbol */
/* Map DATA Symbol */ /* Map DATA Symbol */
else if (allowed_xlsch_re_in_dmrs_symbol(k, start_sc, frame_parms->ofdm_symbol_size, rel15->numDmrsCdmGrpsNoData, dmrs_Type)) { else if (allowed_xlsch_re_in_dmrs_symbol(k, start_sc, symbol_sz, rel15->numDmrsCdmGrpsNoData, dmrs_Type)) {
txF[k] = c16mulRealShift(txl[*cur_re], amp, 15); txF[k] = c16mulRealShift(txl[*cur_re], amp, 15);
*cur_re = *cur_re + 1; *cur_re = *cur_re + 1;
} }
...@@ -1083,8 +1080,8 @@ static inline int dmrs_case9(int k, ...@@ -1083,8 +1080,8 @@ static inline int dmrs_case9(int k,
else { else {
txF[k] = (c16_t){0}; txF[k] = (c16_t){0};
} }
if (++k >= frame_parms->ofdm_symbol_size) if (++k >= symbol_sz)
k -= frame_parms->ofdm_symbol_size; k -= symbol_sz;
} // RE loop } // RE loop
return k; return k;
} }
...@@ -1101,12 +1098,11 @@ static inline int no_ptrs_dmrs_case(int k, ...@@ -1101,12 +1098,11 @@ static inline int no_ptrs_dmrs_case(int k,
int remaining_re, int remaining_re,
uint8_t *k_prime, uint8_t *k_prime,
uint16_t *n, uint16_t *n,
NR_DL_FRAME_PARMS *frame_parms, int symbol_sz,
int l_prime, int l_prime,
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15) nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15)
{ {
// Loop Over SCs: // Loop Over SCs:
#if defined(USE128BIT) #if defined(USE128BIT)
simde__m128i *txF128 = (simde__m128i *)&txF[start_sc]; simde__m128i *txF128 = (simde__m128i *)&txF[start_sc];
...@@ -1127,8 +1123,8 @@ static inline int no_ptrs_dmrs_case(int k, ...@@ -1127,8 +1123,8 @@ static inline int no_ptrs_dmrs_case(int k,
#endif #endif
/* handle this, mute RE */ /* handle this, mute RE */
/*else { /*else {
txdataF_precoding[layer][((l*frame_parms->ofdm_symbol_size + k)<<1) ] = 0; txdataF_precoding[layer][((l*symbol_sz + k)<<1) ] = 0;
txdataF_precoding[layer][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = 0; txdataF_precoding[layer][((l*symbol_sz + k)<<1) + 1] = 0;
}*/ }*/
} }
if (i * 4 != upper_limit) { if (i * 4 != upper_limit) {
...@@ -1161,8 +1157,8 @@ static inline int no_ptrs_dmrs_case(int k, ...@@ -1161,8 +1157,8 @@ static inline int no_ptrs_dmrs_case(int k,
#endif #endif
/* handle this, mute RE */ /* handle this, mute RE */
/*else { /*else {
txdataF_precoding[layer][((l*frame_parms->ofdm_symbol_size + k)<<1) ] = 0; txdataF_precoding[layer][((l*symbol_sz + k)<<1) ] = 0;
txdataF_precoding[layer][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = 0; txdataF_precoding[layer][((l*symbol_sz + k)<<1) + 1] = 0;
}*/ }*/
} // RE loop, second part } // RE loop, second part
if (i * 4 != remaining_re) { if (i * 4 != remaining_re) {
...@@ -1200,8 +1196,8 @@ static inline int no_ptrs_dmrs_case(int k, ...@@ -1200,8 +1196,8 @@ static inline int no_ptrs_dmrs_case(int k,
#endif #endif
/* handle this, mute RE */ /* handle this, mute RE */
/*else { /*else {
txdataF_precoding[layer][((l*frame_parms->ofdm_symbol_size + k)<<1) ] = 0; txdataF_precoding[layer][((l*symbol_sz + k)<<1) ] = 0;
txdataF_precoding[layer][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = 0; txdataF_precoding[layer][((l*symbol_sz + k)<<1) + 1] = 0;
}*/ }*/
} }
if (i * 16 != upper_limit) { if (i * 16 != upper_limit) {
...@@ -1243,8 +1239,8 @@ static inline int no_ptrs_dmrs_case(int k, ...@@ -1243,8 +1239,8 @@ static inline int no_ptrs_dmrs_case(int k,
#endif #endif
/* handle this, mute RE */ /* handle this, mute RE */
/*else { /*else {
txdataF_precoding[layer][((l*frame_parms->ofdm_symbol_size + k)<<1) ] = 0; txdataF_precoding[layer][((l*symbol_sz + k)<<1) ] = 0;
txdataF_precoding[layer][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = 0; txdataF_precoding[layer][((l*symbol_sz + k)<<1) + 1] = 0;
}*/ }*/
} // RE loop, second part } // RE loop, second part
if (i * 16 != remaining_re) { if (i * 16 != remaining_re) {
...@@ -1269,8 +1265,8 @@ static inline int no_ptrs_dmrs_case(int k, ...@@ -1269,8 +1265,8 @@ static inline int no_ptrs_dmrs_case(int k,
simde_mm256_storeu_si256(txF256 + i, simde_mm256_mulhrs_epi16(amp64, txL)); simde_mm256_storeu_si256(txF256 + i, simde_mm256_mulhrs_epi16(amp64, txL));
/* handle this, mute RE */ /* handle this, mute RE */
/*else { /*else {
txdataF_precoding[layer][((l*frame_parms->ofdm_symbol_size + k)<<1) ] = 0; txdataF_precoding[layer][((l*symbol_sz + k)<<1) ] = 0;
txdataF_precoding[layer][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = 0; txdataF_precoding[layer][((l*symbol_sz + k)<<1) + 1] = 0;
}*/ }*/
} }
if (i * 8 != upper_limit) { if (i * 8 != upper_limit) {
...@@ -1291,8 +1287,8 @@ static inline int no_ptrs_dmrs_case(int k, ...@@ -1291,8 +1287,8 @@ static inline int no_ptrs_dmrs_case(int k,
simde_mm256_storeu_si256(txF256 + i, simde_mm256_mulhrs_epi16(amp64, txL)); simde_mm256_storeu_si256(txF256 + i, simde_mm256_mulhrs_epi16(amp64, txL));
/* handle this, mute RE */ /* handle this, mute RE */
/*else { /*else {
txdataF_precoding[layer][((l*frame_parms->ofdm_symbol_size + k)<<1) ] = 0; txdataF_precoding[layer][((l*symbol_sz + k)<<1) ] = 0;
txdataF_precoding[layer][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = 0; txdataF_precoding[layer][((l*symbol_sz + k)<<1) + 1] = 0;
}*/ }*/
} // RE loop, second part } // RE loop, second part
if (i * 8 != remaining_re) { if (i * 8 != remaining_re) {
...@@ -1319,6 +1315,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1319,6 +1315,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
NR_DL_gNB_HARQ_t *harq = &dlsch->harq_process; NR_DL_gNB_HARQ_t *harq = &dlsch->harq_process;
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &harq->pdsch_pdu.pdsch_pdu_rel15; nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &harq->pdsch_pdu.pdsch_pdu_rel15;
const int layerSz = frame_parms->N_RB_DL * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB; const int layerSz = frame_parms->N_RB_DL * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB;
const int symbol_sz=frame_parms->ofdm_symbol_size;
const int dmrs_Type = rel15->dmrsConfigType; const int dmrs_Type = rel15->dmrsConfigType;
const int nb_re_dmrs = rel15->numDmrsCdmGrpsNoData * (rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4); const int nb_re_dmrs = rel15->numDmrsCdmGrpsNoData * (rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4);
const int amp_dmrs = (int)((double)amp * sqrt(rel15->numDmrsCdmGrpsNoData)); // 3GPP TS 38.214 Section 4.1: Table 4.1-1 const int amp_dmrs = (int)((double)amp * sqrt(rel15->numDmrsCdmGrpsNoData)); // 3GPP TS 38.214 Section 4.1: Table 4.1-1
...@@ -1377,8 +1374,6 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1377,8 +1374,6 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
start_meas(dlsch_scrambling_stats); start_meas(dlsch_scrambling_stats);
uint32_t scrambled_output[(encoded_length >> 5) + 4]; // modulator acces by 4 bytes in some cases uint32_t scrambled_output[(encoded_length >> 5) + 4]; // modulator acces by 4 bytes in some cases
memset(scrambled_output, 0, sizeof(scrambled_output)); memset(scrambled_output, 0, sizeof(scrambled_output));
if (encoded_length > rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * Qm * rel15->nrOfLayers)
abort();
nr_pdsch_codeword_scrambling(input_ptr, encoded_length, codeWord, rel15->dataScramblingId, rel15->rnti, scrambled_output); nr_pdsch_codeword_scrambling(input_ptr, encoded_length, codeWord, rel15->dataScramblingId, rel15->rnti, scrambled_output);
#ifdef DEBUG_DLSCH #ifdef DEBUG_DLSCH
...@@ -1410,11 +1405,11 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1410,11 +1405,11 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
/// Resource mapping /// Resource mapping
// Non interleaved VRB to PRB mapping // Non interleaved VRB to PRB mapping
uint16_t start_sc = frame_parms->first_carrier_offset + (rel15->rbStart + rel15->BWPStart) * NR_NB_SC_PER_RB; uint16_t start_sc = frame_parms->first_carrier_offset + (rel15->rbStart + rel15->BWPStart) * NR_NB_SC_PER_RB;
if (start_sc >= frame_parms->ofdm_symbol_size) if (start_sc >= symbol_sz)
start_sc -= frame_parms->ofdm_symbol_size; start_sc -= symbol_sz;
const uint32_t txdataF_offset = slot * frame_parms->samples_per_slot_wCP; const uint32_t txdataF_offset = slot * frame_parms->samples_per_slot_wCP;
c16_t txdataF_precoding[rel15->nrOfLayers][NR_NUMBER_OF_SYMBOLS_PER_SLOT][frame_parms->ofdm_symbol_size] c16_t txdataF_precoding[rel15->nrOfLayers][NR_NUMBER_OF_SYMBOLS_PER_SLOT][(symbol_sz+63)&~63]
__attribute__((aligned(64))); __attribute__((aligned(64)));
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
...@@ -1427,15 +1422,20 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1427,15 +1422,20 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
#endif #endif
AssertFatal(n_dmrs, "n_dmrs can't be 0\n"); AssertFatal(n_dmrs, "n_dmrs can't be 0\n");
c16_t mod_dmrs[n_dmrs] __attribute__((aligned(64))); // make a large enough tail to process all re with SIMD regardless a garbadge filler
unsigned int cur_re0 = 0; c16_t mod_dmrs[(n_dmrs+63)&~63] __attribute__((aligned(64)));
unsigned int re_beginning_of_symbol = 0;
start_meas(&gNB->dlsch_resource_mapping_stats); start_meas(&gNB->dlsch_resource_mapping_stats);
int layerSz2 = (layerSz + 63) & ~63;
c16_t tx_layers[rel15->nrOfLayers][layerSz2] __attribute__((aligned(64)));
nr_layer_mapping(rel15->NrOfCodewords, encoded_length, mod_symbs, rel15->nrOfLayers, layerSz2, nb_re, tx_layers);
// Loop Over OFDM symbols: // Loop Over OFDM symbols:
for (int l_symbol = rel15->StartSymbolIndex; l_symbol < rel15->StartSymbolIndex + rel15->NrOfSymbols; l_symbol++) { for (int l_symbol = rel15->StartSymbolIndex; l_symbol < rel15->StartSymbolIndex + rel15->NrOfSymbols; l_symbol++) {
int8_t l_prime = 0; // single symbol layer 0 int l_prime = 0; // single symbol layer 0
int8_t l_overline = get_l0(rel15->dlDmrsSymbPos); int l_overline = get_l0(rel15->dlDmrsSymbPos);
uint32_t dmrs_idx = 0;
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("PDSCH resource mapping symbol %d\n", l_symbol); printf("PDSCH resource mapping symbol %d\n", l_symbol);
#endif #endif
...@@ -1450,13 +1450,15 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1450,13 +1450,15 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
l_overline = l_symbol; l_overline = l_symbol;
l_prime = 0; l_prime = 0;
} }
/// DMRS QPSK modulation
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("dlDmrsScramblingId %d, SCID %d slot %d l_symbol %d\n", rel15->dlDmrsScramblingId, rel15->SCID, slot, l_symbol); printf("dlDmrsScramblingId %d, SCID %d slot %d l_symbol %d\n", rel15->dlDmrsScramblingId, rel15->SCID, slot, l_symbol);
#endif #endif
const uint32_t *gold = const uint32_t *gold = nr_gold_pdsch(frame_parms->N_RB_DL,
nr_gold_pdsch(fp->N_RB_DL, fp->symbols_per_slot, rel15->dlDmrsScramblingId, rel15->SCID, slot, l_symbol); frame_parms->symbols_per_slot,
rel15->dlDmrsScramblingId,
rel15->SCID,
slot,
l_symbol);
// Qm = 1 as DMRS is QPSK modulated // Qm = 1 as DMRS is QPSK modulated
nr_modulation(gold, n_dmrs * DMRS_MOD_ORDER, DMRS_MOD_ORDER, (int16_t *)mod_dmrs); nr_modulation(gold, n_dmrs * DMRS_MOD_ORDER, DMRS_MOD_ORDER, (int16_t *)mod_dmrs);
...@@ -1470,35 +1472,26 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1470,35 +1472,26 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
} }
#endif #endif
} }
uint32_t cur_re = re_beginning_of_symbol;
uint32_t cur_re = cur_re0; uint32_t dmrs_idx = rel15->rbStart;
int layerSz2 = layerSz;
if ((layerSz * sizeof(c16_t) & 63) > 0)
layerSz2 += (layerSz * sizeof(c16_t) - (((layerSz * sizeof(c16_t)) >> 6) << 6)) / sizeof(c16_t);
c16_t tx_layers[rel15->nrOfLayers][layerSz2] __attribute__((aligned(64)));
if (l_symbol == rel15->StartSymbolIndex)
nr_layer_mapping(rel15->NrOfCodewords, encoded_length, mod_symbs, rel15->nrOfLayers, layerSz2, nb_re, tx_layers);
dmrs_idx = rel15->rbStart;
if (rel15->rnti != SI_RNTI) if (rel15->rnti != SI_RNTI)
dmrs_idx += rel15->BWPStart; dmrs_idx += rel15->BWPStart;
dmrs_idx *= dmrs_Type == NFAPI_NR_DMRS_TYPE1 ? 6 : 4; dmrs_idx *= dmrs_Type == NFAPI_NR_DMRS_TYPE1 ? 6 : 4;
if (dmrs_idx > 0) c16_t *dmrs_start = mod_dmrs + dmrs_idx;
memmove(mod_dmrs,
mod_dmrs + dmrs_idx,
rel15->rbSize * (rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4) * sizeof(c16_t));
for (int layer = 0; layer < rel15->nrOfLayers; layer++) { for (int layer = 0; layer < rel15->nrOfLayers; layer++) {
uint8_t k_prime = 0; uint8_t k_prime = 0;
uint16_t n = 0; uint16_t n = 0;
cur_re = cur_re0; cur_re = re_beginning_of_symbol;
c16_t *txF = txdataF_precoding[layer][l_symbol]; c16_t *txF = txdataF_precoding[layer][l_symbol];
c16_t *txl = tx_layers[layer]; c16_t *txl = tx_layers[layer];
uint16_t k = start_sc; uint16_t k = start_sc;
const uint sz = rel15->rbSize * NR_NB_SC_PER_RB; const uint sz = rel15->rbSize * NR_NB_SC_PER_RB;
int upper_limit = sz; int upper_limit = sz;
int remaining_re = 0; int remaining_re = 0;
if (start_sc + upper_limit > frame_parms->ofdm_symbol_size) { if (start_sc + upper_limit > symbol_sz) {
remaining_re = upper_limit + start_sc - frame_parms->ofdm_symbol_size; remaining_re = upper_limit + start_sc - symbol_sz;
upper_limit = frame_parms->ofdm_symbol_size - start_sc; upper_limit = symbol_sz - start_sc;
} }
/* calculate if current symbol is PTRS symbols */ /* calculate if current symbol is PTRS symbols */
...@@ -1510,13 +1503,16 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1510,13 +1503,16 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
if (ptrs_symbol) { if (ptrs_symbol) {
/* PTRS QPSK Modulation for each OFDM symbol in a slot */ /* PTRS QPSK Modulation for each OFDM symbol in a slot */
LOG_D(PHY, "Doing ptrs modulation for symbol %d, n_ptrs %d\n", l_symbol, n_ptrs); LOG_D(PHY, "Doing ptrs modulation for symbol %d, n_ptrs %d\n", l_symbol, n_ptrs);
c16_t mod_ptrs[max(n_ptrs, 1)] c16_t mod_ptrs[max(n_ptrs, 1)]
__attribute__((aligned(64))); // max only to please sanitizer, that kills if 0 even if it is not a error __attribute__((aligned(64))); // max only to please sanitizer, that kills if 0 even if it is not a error
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; const uint32_t *gold = nr_gold_pdsch(frame_parms->N_RB_DL,
const uint32_t *gold = frame_parms->symbols_per_slot,
nr_gold_pdsch(fp->N_RB_DL, fp->symbols_per_slot, rel15->dlDmrsScramblingId, rel15->SCID, slot, l_symbol); rel15->dlDmrsScramblingId,
rel15->SCID,
slot,
l_symbol);
nr_modulation(gold, n_ptrs * DMRS_MOD_ORDER, DMRS_MOD_ORDER, (int16_t *)mod_ptrs); nr_modulation(gold, n_ptrs * DMRS_MOD_ORDER, DMRS_MOD_ORDER, (int16_t *)mod_ptrs);
k = do_ptrs_symbol(rel15, start_sc, k, &cur_re, frame_parms, txF, txl, amp, mod_ptrs); k = do_ptrs_symbol(rel15, start_sc, k, &cur_re, symbol_sz, txF, txl, amp, mod_ptrs);
} else if (dmrs_symbol_map & (1 << l_symbol)) { } else if (dmrs_symbol_map & (1 << l_symbol)) {
/* Map DMRS Symbol */ /* Map DMRS Symbol */
...@@ -1545,29 +1541,27 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1545,29 +1541,27 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
l_overline, l_overline,
dmrs_symbol); dmrs_symbol);
#endif #endif
c16_t dmrs_mux[sz] __attribute__((aligned(64)));
if (rel15->numDmrsCdmGrpsNoData == 2 && dmrs_Type == 0 && (dmrs_port & 3) == 0 && l_prime == 0) { if (rel15->numDmrsCdmGrpsNoData == 2 && dmrs_Type == 0 && (dmrs_port & 3) == 0 && l_prime == 0) {
dmrs_case1(txF, dmrs_mux, mod_dmrs, amp_dmrs, sz, start_sc, upper_limit, remaining_re); dmrs_case1(txF, dmrs_start, amp_dmrs, sz, start_sc, upper_limit, remaining_re);
} else if (rel15->numDmrsCdmGrpsNoData == 2 && dmrs_Type == 0 && (dmrs_port & 3) == 1 && l_prime == 0) { } else if (rel15->numDmrsCdmGrpsNoData == 2 && dmrs_Type == 0 && (dmrs_port & 3) == 1 && l_prime == 0) {
dmrs_case2(txF, dmrs_mux, mod_dmrs, amp_dmrs, sz, start_sc, upper_limit, remaining_re); dmrs_case2(txF, dmrs_start, amp_dmrs, sz, start_sc, upper_limit, remaining_re);
} else if (rel15->numDmrsCdmGrpsNoData == 2 && dmrs_Type == 0 && (dmrs_port & 3) == 2 && l_prime == 0) { } else if (rel15->numDmrsCdmGrpsNoData == 2 && dmrs_Type == 0 && (dmrs_port & 3) == 2 && l_prime == 0) {
dmrs_case3(txF, dmrs_mux, mod_dmrs, amp_dmrs, sz, start_sc, upper_limit, remaining_re); dmrs_case3(txF, dmrs_start, amp_dmrs, sz, start_sc, upper_limit, remaining_re);
} else if (rel15->numDmrsCdmGrpsNoData == 2 && dmrs_Type == 0 && (dmrs_port & 3) == 3 && l_prime == 0) { } else if (rel15->numDmrsCdmGrpsNoData == 2 && dmrs_Type == 0 && (dmrs_port & 3) == 3 && l_prime == 0) {
dmrs_case4(txF, dmrs_mux, mod_dmrs, amp_dmrs, sz, start_sc, upper_limit, remaining_re); dmrs_case4(txF, dmrs_start, amp_dmrs, sz, start_sc, upper_limit, remaining_re);
} else if (rel15->numDmrsCdmGrpsNoData == 1 && dmrs_Type == 0 && (dmrs_port & 3) == 0 && l_prime == 0) { } else if (rel15->numDmrsCdmGrpsNoData == 1 && dmrs_Type == 0 && (dmrs_port & 3) == 0 && l_prime == 0) {
dmrs_case5(txF, txl, dmrs_mux, mod_dmrs, amp_dmrs, amp, sz, &cur_re, start_sc, upper_limit, remaining_re); dmrs_case5(txF, txl, dmrs_start, amp_dmrs, amp, sz, &cur_re, start_sc, upper_limit, remaining_re);
} else if (rel15->numDmrsCdmGrpsNoData == 1 && dmrs_Type == 0 && (dmrs_port & 3) == 1 && l_prime == 0) { } else if (rel15->numDmrsCdmGrpsNoData == 1 && dmrs_Type == 0 && (dmrs_port & 3) == 1 && l_prime == 0) {
dmrs_case6(txF, txl, dmrs_mux, mod_dmrs, amp_dmrs, amp, sz, &cur_re, start_sc, upper_limit, remaining_re); dmrs_case6(txF, txl, dmrs_start, amp_dmrs, amp, sz, &cur_re, start_sc, upper_limit, remaining_re);
} else if (rel15->numDmrsCdmGrpsNoData == 1 && dmrs_Type == 0 && (dmrs_port & 3) == 2 && l_prime == 0) { } else if (rel15->numDmrsCdmGrpsNoData == 1 && dmrs_Type == 0 && (dmrs_port & 3) == 2 && l_prime == 0) {
dmrs_case7(txF, txl, dmrs_mux, mod_dmrs, amp_dmrs, amp, sz, &cur_re, start_sc, upper_limit, remaining_re); dmrs_case7(txF, txl, dmrs_start, amp_dmrs, amp, sz, &cur_re, start_sc, upper_limit, remaining_re);
} else if (rel15->numDmrsCdmGrpsNoData == 1 && dmrs_Type == 0 && (dmrs_port & 3) == 3 && l_prime == 0) { } else if (rel15->numDmrsCdmGrpsNoData == 1 && dmrs_Type == 0 && (dmrs_port & 3) == 3 && l_prime == 0) {
dmrs_case8(txF, txl, dmrs_mux, mod_dmrs, amp_dmrs, amp, sz, &cur_re, start_sc, upper_limit, remaining_re); dmrs_case8(txF, txl, dmrs_start, amp_dmrs, amp, sz, &cur_re, start_sc, upper_limit, remaining_re);
} else { } else {
k = dmrs_case9(k, k = dmrs_case9(k,
txF, txF,
txl, txl,
mod_dmrs, dmrs_start,
amp_dmrs, amp_dmrs,
amp, amp,
sz, sz,
...@@ -1578,7 +1572,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1578,7 +1572,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
dmrs_Type, dmrs_Type,
&k_prime, &k_prime,
&n, &n,
frame_parms, symbol_sz,
l_prime, l_prime,
rel15); rel15);
} // generic DMRS case } // generic DMRS case
...@@ -1586,7 +1580,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1586,7 +1580,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
k = no_ptrs_dmrs_case(k, k = no_ptrs_dmrs_case(k,
txF, txF,
txl, txl,
mod_dmrs, dmrs_start,
amp_dmrs, amp_dmrs,
amp, amp,
&cur_re, &cur_re,
...@@ -1595,12 +1589,12 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1595,12 +1589,12 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
remaining_re, remaining_re,
&k_prime, &k_prime,
&n, &n,
frame_parms, symbol_sz,
l_prime, l_prime,
rel15); rel15);
} // no DMRS/PTRS in symbol } // no DMRS/PTRS in symbol
} // layer loop } // layer loop
cur_re0 = cur_re; re_beginning_of_symbol = cur_re;
} // symbol loop } // symbol loop
stop_meas(&gNB->dlsch_resource_mapping_stats); stop_meas(&gNB->dlsch_resource_mapping_stats);
...@@ -1626,7 +1620,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1626,7 +1620,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
for (int ant = 0; ant < frame_parms->nb_antennas_tx; ant++) { for (int ant = 0; ant < frame_parms->nb_antennas_tx; ant++) {
for (int l_symbol = rel15->StartSymbolIndex; l_symbol < rel15->StartSymbolIndex + rel15->NrOfSymbols; l_symbol++) { for (int l_symbol = rel15->StartSymbolIndex; l_symbol < rel15->StartSymbolIndex + rel15->NrOfSymbols; l_symbol++) {
uint16_t subCarrier = start_sc; uint16_t subCarrier = start_sc;
const size_t txdataF_offset_per_symbol = l_symbol * frame_parms->ofdm_symbol_size + txdataF_offset; const size_t txdataF_offset_per_symbol = l_symbol * symbol_sz + txdataF_offset;
int rb = 0; int rb = 0;
while (rb < rel15->rbSize) { while (rb < rel15->rbSize) {
...@@ -1640,7 +1634,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1640,7 +1634,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
const int re_cnt = NR_NB_SC_PER_RB * rb_step; const int re_cnt = NR_NB_SC_PER_RB * rb_step;
if (pmi == 0) { // unitary Precoding if (pmi == 0) { // unitary Precoding
if (subCarrier + re_cnt <= frame_parms->ofdm_symbol_size) { // RB does not cross DC if (subCarrier + re_cnt <= symbol_sz) { // RB does not cross DC
if (ant < rel15->nrOfLayers) if (ant < rel15->nrOfLayers)
memcpy(&txdataF[ant][txdataF_offset_per_symbol + subCarrier], memcpy(&txdataF[ant][txdataF_offset_per_symbol + subCarrier],
&txdataF_precoding[ant][l_symbol][subCarrier], &txdataF_precoding[ant][l_symbol][subCarrier],
...@@ -1648,7 +1642,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1648,7 +1642,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
else else
memset(&txdataF[ant][txdataF_offset_per_symbol + subCarrier], 0, re_cnt * sizeof(**txdataF)); memset(&txdataF[ant][txdataF_offset_per_symbol + subCarrier], 0, re_cnt * sizeof(**txdataF));
} else { // RB does cross DC } else { // RB does cross DC
const int neg_length = frame_parms->ofdm_symbol_size - subCarrier; const int neg_length = symbol_sz - subCarrier;
const int pos_length = re_cnt - neg_length; const int pos_length = re_cnt - neg_length;
if (ant < rel15->nrOfLayers) { if (ant < rel15->nrOfLayers) {
memcpy(&txdataF[ant][txdataF_offset_per_symbol + subCarrier], memcpy(&txdataF[ant][txdataF_offset_per_symbol + subCarrier],
...@@ -1661,8 +1655,8 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1661,8 +1655,8 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
} }
} }
subCarrier += re_cnt; subCarrier += re_cnt;
if (subCarrier >= frame_parms->ofdm_symbol_size) { if (subCarrier >= symbol_sz) {
subCarrier -= frame_parms->ofdm_symbol_size; subCarrier -= symbol_sz;
} }
} else { // non-unitary Precoding } else { // non-unitary Precoding
AssertFatal(frame_parms->nb_antennas_tx > 1, "No precoding can be done with a single antenna port\n"); AssertFatal(frame_parms->nb_antennas_tx > 1, "No precoding can be done with a single antenna port\n");
...@@ -1677,10 +1671,10 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1677,10 +1671,10 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
"Number of layers %d doesn't match to the one in precoding matrix %d\n", "Number of layers %d doesn't match to the one in precoding matrix %d\n",
rel15->nrOfLayers, rel15->nrOfLayers,
pmi_pdu->numLayers); pmi_pdu->numLayers);
if ((subCarrier + re_cnt) < frame_parms->ofdm_symbol_size) { // within ofdm_symbol_size, use SIMDe if ((subCarrier + re_cnt) < symbol_sz) { // within ofdm_symbol_size, use SIMDe
nr_layer_precoder_simd(rel15->nrOfLayers, nr_layer_precoder_simd(rel15->nrOfLayers,
NR_SYMBOLS_PER_SLOT, NR_SYMBOLS_PER_SLOT,
frame_parms->ofdm_symbol_size, symbol_sz,
txdataF_precoding, txdataF_precoding,
ant, ant,
pmi_pdu, pmi_pdu,
...@@ -1693,7 +1687,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1693,7 +1687,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
for (int i = 0; i < re_cnt; i++) { for (int i = 0; i < re_cnt; i++) {
txdataF[ant][txdataF_offset_per_symbol + subCarrier] = nr_layer_precoder_cm(rel15->nrOfLayers, txdataF[ant][txdataF_offset_per_symbol + subCarrier] = nr_layer_precoder_cm(rel15->nrOfLayers,
NR_SYMBOLS_PER_SLOT, NR_SYMBOLS_PER_SLOT,
frame_parms->ofdm_symbol_size, symbol_sz,
txdataF_precoding, txdataF_precoding,
ant, ant,
pmi_pdu, pmi_pdu,
...@@ -1704,11 +1698,11 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1704,11 +1698,11 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
ant, ant,
l_symbol, l_symbol,
subCarrier, subCarrier,
txdataF[ant][l_symbol * frame_parms->ofdm_symbol_size + subCarrier + txdataF_offset].r, txdataF[ant][l_symbol * symbol_sz + subCarrier + txdataF_offset].r,
txdataF[ant][l_symbol * frame_parms->ofdm_symbol_size + subCarrier + txdataF_offset].i); txdataF[ant][l_symbol * symbol_sz + subCarrier + txdataF_offset].i);
#endif #endif
if (++subCarrier >= frame_parms->ofdm_symbol_size) { if (++subCarrier >= symbol_sz) {
subCarrier -= frame_parms->ofdm_symbol_size; subCarrier -= symbol_sz;
} }
} }
} // else{ // crossing ofdm_symbol_size, use simple arithmetic operations } // else{ // crossing ofdm_symbol_size, use simple arithmetic operations
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment