Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
littleBu
OpenXG-RAN
Commits
9d844135
Commit
9d844135
authored
Feb 02, 2025
by
Laurent THOMAS
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
local dmrs_mux and unaligned mod_dmrs
parent
3ddb2d05
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
146 additions
and
152 deletions
+146
-152
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+146
-152
No files found.
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
View file @
9d844135
...
@@ -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_idx
2
=
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_idx
2
],
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_idx
2
++
;
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
++
)
{
int
8_t
l_prime
=
0
;
// single symbol layer 0
int
l_prime
=
0
;
// single symbol layer 0
int
8_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
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment