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
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
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
OpenXG
OpenXG-RAN
Commits
eb0dda59
Commit
eb0dda59
authored
Feb 06, 2025
by
Laurent THOMAS
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
remove intermediate buffer and memory copy, continue to simplify nr pdsch computation
parent
2fad8796
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
218 additions
and
327 deletions
+218
-327
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+218
-327
No files found.
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
View file @
eb0dda59
...
@@ -52,15 +52,15 @@ static void nr_pdsch_codeword_scrambling(uint8_t *in, uint32_t size, uint8_t q,
...
@@ -52,15 +52,15 @@ static void nr_pdsch_codeword_scrambling(uint8_t *in, uint32_t size, uint8_t q,
static
int
do_ptrs_symbol
(
nfapi_nr_dl_tti_pdsch_pdu_rel15_t
*
rel15
,
static
int
do_ptrs_symbol
(
nfapi_nr_dl_tti_pdsch_pdu_rel15_t
*
rel15
,
int
start_sc
,
int
start_sc
,
int
k
,
uint
*
cur_re
,
int
symbol_sz
,
int
symbol_sz
,
c16_t
*
output
,
c16_t
*
txF
,
c16_t
*
tx_layer
,
c16_t
*
tx_layer
,
int
amp
,
int
amp
,
c16_t
*
mod_ptrs
)
c16_t
*
mod_ptrs
)
{
{
int
ptrs_idx
=
0
;
int
ptrs_idx
=
0
;
int
k
=
start_sc
;
c16_t
*
in
=
tx_layer
;
for
(
int
i
=
0
;
i
<
rel15
->
rbSize
*
NR_NB_SC_PER_RB
;
i
++
)
{
for
(
int
i
=
0
;
i
<
rel15
->
rbSize
*
NR_NB_SC_PER_RB
;
i
++
)
{
/* check for PTRS symbol and set flag for PTRS RE */
/* check for PTRS symbol and set flag for PTRS RE */
bool
is_ptrs_re
=
bool
is_ptrs_re
=
...
@@ -68,40 +68,36 @@ static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15,
...
@@ -68,40 +68,36 @@ static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15,
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
;
output
[
k
]
=
c16mulRealShift
(
mod_ptrs
[
ptrs_idx
],
beta_ptrs
*
amp
,
15
);
txF
[
k
]
=
c16mulRealShift
(
mod_ptrs
[
ptrs_idx
],
beta_ptrs
*
amp
,
15
);
#ifdef DEBUG_DLSCH_MAPPING
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"ptrs_idx %d
\t
\t
k %d
\t
\t
txdataF: %d %d, mod_ptrs: %d %d
\n
"
,
printf
(
"ptrs_idx %d
\t
\t
k %d
\t
\t
txdataF: %d %d, mod_ptrs: %d %d
\n
"
,
ptrs_idx
,
ptrs_idx
,
k
,
k
,
output
[
k
].
r
,
txF
[
k
].
r
,
output
[
k
].
i
,
txF
[
k
].
i
,
mod_ptrs
[
ptrs_idx
].
r
,
mod_ptrs
[
ptrs_idx
].
r
,
mod_ptrs
[
ptrs_idx
].
i
);
mod_ptrs
[
ptrs_idx
].
i
);
#endif
#endif
ptrs_idx
++
;
ptrs_idx
++
;
}
else
{
}
else
{
output
[
k
]
=
c16mulRealShift
(
tx_layer
[
*
cur_re
]
,
amp
,
15
);
txF
[
k
]
=
c16mulRealShift
(
*
in
++
,
amp
,
15
);
#ifdef DEBUG_DLSCH_MAPPING
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"
re %u
\t
k %d
\t
txdataF: %d %d
\n
"
,
*
cur_re
,
k
,
output
[
k
].
r
,
output
[
k
].
i
);
printf
(
"
k %d
\t
txdataF: %d %d
\n
"
,
k
,
txF
[
k
].
r
,
txF
[
k
].
i
);
#endif
#endif
*
cur_re
=
*
cur_re
+
1
;
}
}
if
(
++
k
>=
symbol_sz
)
if
(
++
k
>=
symbol_sz
)
k
-=
symbol_sz
;
k
-=
symbol_sz
;
}
}
return
k
;
return
in
-
tx_layer
;
}
}
static
inline
void
static
inline
int
dmrs_case20
(
c16_t
*
txF
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
int
sz
)
dmrs_case1
(
c16_t
*
txF
,
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
// add filler to process all as SIMD
// add filler to process all as SIMD
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
out
=
txF
;
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
#if defined(__AVX512BW__)
#if defined(__AVX512BW__)
...
@@ -109,60 +105,51 @@ dmrs_case1(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -109,60 +105,51 @@ dmrs_case1(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__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
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
perml
,
zeros512
));
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
perml
,
zeros512
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
permh
,
zeros512
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
permh
,
zeros512
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
#if defined(__AVX2__)
#if defined(__AVX2__)
simde__m256i
zeros256
=
simde_mm256_setzero_si256
(),
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
);
simde__m256i
zeros256
=
simde_mm256_setzero_si256
(),
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
zeros256
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
zeros256
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
zeros256
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
zeros256
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
#if defined(USE128BIT)
#if defined(USE128BIT)
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
);
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
zeros
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
zeros
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
zeros
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
zeros
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
++
)
{
for
(;
i
<
end
;
i
++
)
{
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
in
++
;
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){};
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
0
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
static
inline
int
dmrs_case21
(
c16_t
*
txF
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
int
sz
)
dmrs_case2
(
c16_t
*
txF
,
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
// add filler to process all as SIMD
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
out
=
txF
;
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
...
@@ -202,11 +189,10 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -202,11 +189,10 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__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
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
perml
,
zeros512
));
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
perml
,
zeros512
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
permh
,
zeros512
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
permh
,
zeros512
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
...
@@ -228,13 +214,12 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -228,13 +214,12 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
amp_dmrs
,
amp_dmrs
,
amp_dmrs
);
amp_dmrs
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
zeros256
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
zeros256
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
zeros256
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
zeros256
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
...
@@ -242,39 +227,32 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -242,39 +227,32 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
simde__m128i
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
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
zeros
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
zeros
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
zeros
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
zeros
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
+=
2
)
{
for
(;
i
<
end
;)
{
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){
-
(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){
-
(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){};
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
0
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
static
inline
int
dmrs_case22
(
c16_t
*
txF
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
int
sz
)
dmrs_case3
(
c16_t
*
txF
,
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
*
out
=
txF
;
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
#if defined(__AVX512BW__)
#if defined(__AVX512BW__)
...
@@ -282,63 +260,52 @@ dmrs_case3(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -282,63 +260,52 @@ dmrs_case3(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__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
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
__m512i
d2
=
_mm512_unpacklo_epi32
(
zeros512
,
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
__m512i
d2
=
_mm512_unpacklo_epi32
(
zeros512
,
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
__m512i
d3
=
_mm512_unpackhi_epi32
(
zeros512
,
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
d3
=
_mm512_unpackhi_epi32
(
zeros512
,
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
*
)
out
=
_mm512_permutex2var_epi32
(
d2
,
perml
,
d3
);
//
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d2
,
perml
,
d3
)
);
//
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d2
,
permh
,
d3
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d2
,
permh
,
d3
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
#if defined(__AVX2__)
#if defined(__AVX2__)
simde__m256i
zeros256
=
simde_mm256_setzero_si256
(),
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
);
simde__m256i
zeros256
=
simde_mm256_setzero_si256
(),
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
zeros256
,
d0
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
zeros256
,
d0
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
zeros256
,
d0
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
zeros256
,
d0
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
#if defined(USE128BIT)
#if defined(USE128BIT)
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
);
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
zeros
,
d0
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
zeros
,
d0
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
zeros
,
d0
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
zeros
,
d0
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
++
)
{
for
(;
i
<
end
;
i
++
)
{
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
in
++
;
}
}
return
0
;
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
static
inline
int
dmrs_case23
(
c16_t
*
txF
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
int
sz
)
dmrs_case4
(
c16_t
*
txF
,
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
*
out
=
txF
;
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
...
@@ -378,11 +345,10 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -378,11 +345,10 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__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
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
zeros512
,
perml
,
d0
));
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
zeros512
,
perml
,
d0
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
zeros512
,
permh
,
d0
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
zeros512
,
permh
,
d0
)
);
out
+=
16
;
out
+=
16
;
}
}
...
@@ -405,13 +371,12 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -405,13 +371,12 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
amp_dmrs
,
amp_dmrs
,
amp_dmrs
);
amp_dmrs
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
zeros256
,
d0
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
zeros256
,
d0
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
zeros256
,
d0
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
zeros256
,
d0
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
...
@@ -419,46 +384,33 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -419,46 +384,33 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
simde__m128i
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
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
zeros
,
d0
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
zeros
,
d0
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
zeros
,
d0
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
zeros
,
d0
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
+=
2
)
{
for
(;
i
<
end
;)
{
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){
-
(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){
-
(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
0
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
dmrs_case5
(
c16_t
*
txF
,
static
inline
int
dmrs_case10
(
c16_t
*
txF
,
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
int
sz
)
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
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 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
// add filler to process all as SIMD
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
out
=
txF
;
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
c16_t
*
txlc
=
txl
;
c16_t
*
txlc
=
txl
;
...
@@ -468,74 +420,58 @@ static inline void dmrs_case5(c16_t *txF,
...
@@ -468,74 +420,58 @@ static inline void dmrs_case5(c16_t *txF,
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__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
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
txlc
+=
16
;
txlc
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
perml
,
d1
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
perml
,
d1
)
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
permh
,
d1
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
permh
,
d1
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
#if defined(__AVX2__)
#if defined(__AVX2__)
simde__m256i
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
),
amp256
=
simde_mm256_set1_epi16
(
amp
);
simde__m256i
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
),
amp256
=
simde_mm256_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
txlc
+=
8
;
txlc
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
#if defined(USE128BIT)
#if defined(USE128BIT)
simde__m128i
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
),
amp128
=
simde_mm_set1_epi16
(
amp
);
simde__m128i
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
),
amp128
=
simde_mm_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
txlc
+=
4
;
txlc
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
++
)
{
for
(;
i
<
end
;
i
++
)
{
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
in
++
;
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
txlc
++
;
txlc
++
;
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
sz
/
2
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
dmrs_case6
(
c16_t
*
txF
,
static
inline
int
dmrs_case11
(
c16_t
*
txF
,
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
int
sz
)
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
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 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
// add filler to process all as SIMD
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
out
=
txF
;
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
c16_t
*
txlc
=
txl
;
c16_t
*
txlc
=
txl
;
...
@@ -577,13 +513,12 @@ static inline void dmrs_case6(c16_t *txF,
...
@@ -577,13 +513,12 @@ static inline void dmrs_case6(c16_t *txF,
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__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
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
txlc
+=
16
;
txlc
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
perml
,
d1
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
perml
,
d1
)
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
permh
,
d1
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
permh
,
d1
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
...
@@ -606,15 +541,14 @@ static inline void dmrs_case6(c16_t *txF,
...
@@ -606,15 +541,14 @@ static inline void dmrs_case6(c16_t *txF,
amp_dmrs
),
amp_dmrs
),
amp256
=
simde_mm256_set1_epi16
(
amp
);
amp256
=
simde_mm256_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
txlc
+=
8
;
txlc
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
...
@@ -622,50 +556,36 @@ static inline void dmrs_case6(c16_t *txF,
...
@@ -622,50 +556,36 @@ static inline void dmrs_case6(c16_t *txF,
simde__m128i
amp_dmrs128
=
simde_mm_set_epi16
(
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
,
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
),
simde__m128i
amp_dmrs128
=
simde_mm_set_epi16
(
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
,
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
),
amp128
=
simde_mm_set1_epi16
(
amp
);
amp128
=
simde_mm_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
txlc
+=
4
;
txlc
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
+=
2
)
{
for
(;
i
<
end
;)
{
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
txlc
++
;
txlc
++
;
*
out
++
=
(
c16_t
){
-
(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){
-
(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
txlc
++
;
txlc
++
;
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
sz
/
2
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
dmrs_case7
(
c16_t
*
txF
,
static
inline
int
dmrs_case12
(
c16_t
*
txF
,
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
int
sz
)
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
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 : 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
*
out
=
txF
;
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
c16_t
*
txlc
=
txl
;
c16_t
*
txlc
=
txl
;
...
@@ -675,74 +595,57 @@ static inline void dmrs_case7(c16_t *txF,
...
@@ -675,74 +595,57 @@ static inline void dmrs_case7(c16_t *txF,
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__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
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
txlc
+=
16
;
txlc
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d1
,
perml
,
d0
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d1
,
perml
,
d0
)
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d1
,
permh
,
d0
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d1
,
permh
,
d0
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
#if defined(__AVX2__)
#if defined(__AVX2__)
simde__m256i
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
),
amp256
=
simde_mm256_set1_epi16
(
amp
);
simde__m256i
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
),
amp256
=
simde_mm256_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
txlc
+=
8
;
txlc
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
#if defined(USE128BIT)
#if defined(USE128BIT)
simde__m128i
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
),
amp128
=
simde_mm_set1_epi16
(
amp
);
simde__m128i
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
),
amp128
=
simde_mm_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
txlc
+=
4
;
txlc
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
++
)
{
for
(;
i
<
end
;
i
++
)
{
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
txlc
++
;
txlc
++
;
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
in
++
;
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
sz
/
2
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
dmrs_case8
(
c16_t
*
txF
,
static
inline
int
dmrs_case13
(
c16_t
*
txF
,
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
int
sz
)
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
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 : 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
*
out
=
txF
;
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
c16_t
*
txlc
=
txl
;
c16_t
*
txlc
=
txl
;
...
@@ -784,13 +687,12 @@ static inline void dmrs_case8(c16_t *txF,
...
@@ -784,13 +687,12 @@ static inline void dmrs_case8(c16_t *txF,
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__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
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
txlc
+=
16
;
txlc
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d1
,
perml
,
d0
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d1
,
perml
,
d0
)
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d1
,
permh
,
d0
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d1
,
permh
,
d0
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
...
@@ -813,15 +715,14 @@ static inline void dmrs_case8(c16_t *txF,
...
@@ -813,15 +715,14 @@ static inline void dmrs_case8(c16_t *txF,
amp_dmrs
),
amp_dmrs
),
amp256
=
simde_mm256_set1_epi16
(
amp
);
amp256
=
simde_mm256_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
txlc
+=
8
;
txlc
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
...
@@ -830,41 +731,36 @@ static inline void dmrs_case8(c16_t *txF,
...
@@ -830,41 +731,36 @@ static inline void dmrs_case8(c16_t *txF,
simde__m128i
amp_dmrs128
=
simde_mm_set_epi16
(
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
,
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
),
simde__m128i
amp_dmrs128
=
simde_mm_set_epi16
(
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
,
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
),
amp128
=
simde_mm_set1_epi16
(
amp
);
amp128
=
simde_mm_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
txlc
+=
4
;
txlc
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
+=
2
)
{
for
(;
i
<
end
;)
{
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
txlc
++
;
txlc
++
;
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
txlc
++
;
txlc
++
;
*
out
++
=
(
c16_t
){
-
(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){
-
(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
sz
/
2
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
int
dmrs_case9
(
int
k
,
static
inline
int
dmrs_case00
(
c16_t
*
txF
,
c16_t
*
txF
,
c16_t
*
txl
,
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
const
int
amp
,
int
sz
,
int
sz
,
uint
*
cur_re
,
int
start_sc
,
int
start_sc
,
int
remaining_re
,
int
remaining_re
,
int
dmrs_port
,
int
dmrs_port
,
...
@@ -873,7 +769,7 @@ static inline int dmrs_case9(int k,
...
@@ -873,7 +769,7 @@ static inline int dmrs_case9(int k,
uint16_t
*
n
,
uint16_t
*
n
,
int
symbol_sz
,
int
symbol_sz
,
int
l_prime
,
int
l_prime
,
nfapi_nr_dl_tti_pdsch_pdu_rel15_t
*
rel15
)
uint8_t
numDmrsCdmGrpsNoData
)
{
{
// add filler to process all as SIMD
// add filler to process all as SIMD
//c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
//c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
...
@@ -884,6 +780,8 @@ static inline int dmrs_case9(int k,
...
@@ -884,6 +780,8 @@ static inline int dmrs_case9(int k,
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
=
0
;
int
dmrs_idx
=
0
;
int
k
=
start_sc
;
c16_t
*
in
=
txl
;
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
))
%
(
symbol_sz
)))
{
if
(
k
==
((
start_sc
+
get_dmrs_freq_idx
(
*
n
,
*
k_prime
,
delta
,
dmrs_Type
))
%
(
symbol_sz
)))
{
txF
[
k
]
=
c16mulRealShift
(
mod_dmrs
[
dmrs_idx
],
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
);
...
@@ -893,9 +791,8 @@ static inline int dmrs_case9(int k,
...
@@ -893,9 +791,8 @@ static inline int dmrs_case9(int k,
}
}
/* Map PTRS Symbol */
/* Map PTRS Symbol */
/* Map DATA Symbol */
/* Map DATA Symbol */
else
if
(
allowed_xlsch_re_in_dmrs_symbol
(
k
,
start_sc
,
symbol_sz
,
rel15
->
numDmrsCdmGrpsNoData
,
dmrs_Type
))
{
else
if
(
allowed_xlsch_re_in_dmrs_symbol
(
k
,
start_sc
,
symbol_sz
,
numDmrsCdmGrpsNoData
,
dmrs_Type
))
{
txF
[
k
]
=
c16mulRealShift
(
txl
[
*
cur_re
],
amp
,
15
);
txF
[
k
]
=
c16mulRealShift
(
*
in
++
,
amp
,
15
);
*
cur_re
=
*
cur_re
+
1
;
}
}
/* mute RE */
/* mute RE */
else
{
else
{
...
@@ -904,7 +801,7 @@ static inline int dmrs_case9(int k,
...
@@ -904,7 +801,7 @@ static inline int dmrs_case9(int k,
if
(
++
k
>=
symbol_sz
)
if
(
++
k
>=
symbol_sz
)
k
-=
symbol_sz
;
k
-=
symbol_sz
;
}
// RE loop
}
// RE loop
return
k
;
return
in
-
txl
;
}
}
static
inline
int
no_ptrs_dmrs_case
(
c16_t
*
txF
,
c16_t
*
txl
,
const
int
amp_dmrs
,
const
int
amp
,
const
int
sz
)
static
inline
int
no_ptrs_dmrs_case
(
c16_t
*
txF
,
c16_t
*
txl
,
const
int
amp_dmrs
,
const
int
amp
,
const
int
sz
)
...
@@ -1119,7 +1016,6 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
...
@@ -1119,7 +1016,6 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
cur_re
=
re_beginning_of_symbol
;
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
];
int
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
;
...
@@ -1146,64 +1042,59 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
...
@@ -1146,64 +1042,59 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
slot
,
slot
,
l_symbol
);
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
,
symbol_sz
,
txF
,
txl
,
amp
,
mod_ptrs
);
cur_re
+=
do_ptrs_symbol
(
rel15
,
start_sc
,
symbol_sz
,
txF
,
txl
+
cur_re
,
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 */
int
dmrs_port
=
get_dmrs_port
(
layer
,
rel15
->
dmrsPorts
);
int
dmrs_port
=
get_dmrs_port
(
layer
,
rel15
->
dmrsPorts
);
if
(
l_prime
==
0
&&
dmrs_Type
==
NFAPI_NR_DMRS_TYPE1
)
{
#ifdef DEBUG_DLSCH_MAPPING
if
(
rel15
->
numDmrsCdmGrpsNoData
==
2
)
{
int
Wt
[
2
],
Wf
[
2
];
switch
(
dmrs_port
&
3
)
{
get_Wt
(
Wt
,
dmrs_port
,
dmrs_Type
);
case
0
:
get_Wf
(
Wf
,
dmrs_port
,
dmrs_Type
);
cur_re
+=
dmrs_case20
(
txF
+
start_sc
,
dmrs_start
,
amp_dmrs
,
upper_limit
);
const
int8_t
delta
=
get_delta
(
dmrs_port
,
dmrs_Type
);
cur_re
+=
dmrs_case20
(
txF
,
dmrs_start
,
amp_dmrs
,
remaining_re
);
uint8_t
dmrs_symbol
=
l_overline
+
l_prime
;
break
;
case
1
:
printf
(
cur_re
+=
dmrs_case21
(
txF
+
start_sc
,
dmrs_start
,
amp_dmrs
,
upper_limit
);
"DMRS Type %d params for layer %d : numDmrsCdmGrpsNoData %d Wt %d %d
\t
Wf %d %d
\t
delta %d
\t
l_prime %d
\t
"
cur_re
+=
dmrs_case21
(
txF
,
dmrs_start
,
amp_dmrs
,
remaining_re
);
"l0 "
break
;
"%d
\t
DMRS symbol %d
\n
"
,
case
2
:
1
+
dmrs_Type
,
cur_re
+=
dmrs_case22
(
txF
+
start_sc
,
dmrs_start
,
amp_dmrs
,
upper_limit
);
layer
,
cur_re
+=
dmrs_case22
(
txF
,
dmrs_start
,
amp_dmrs
,
remaining_re
);
rel15
->
numDmrsCdmGrpsNoData
,
break
;
Wt
[
0
],
case
3
:
Wt
[
1
],
cur_re
+=
dmrs_case23
(
txF
+
start_sc
,
dmrs_start
,
amp_dmrs
,
upper_limit
);
Wf
[
0
],
cur_re
+=
dmrs_case23
(
txF
,
dmrs_start
,
amp_dmrs
,
remaining_re
);
Wf
[
1
],
break
;
delta
,
}
l_prime
,
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
1
)
{
l_overline
,
switch
(
dmrs_port
&
3
)
{
dmrs_symbol
);
case
0
:
#endif
cur_re
+=
dmrs_case10
(
txF
+
start_sc
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
upper_limit
);
if
(
rel15
->
numDmrsCdmGrpsNoData
==
2
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
0
&&
l_prime
==
0
)
{
cur_re
+=
dmrs_case10
(
txF
,
txl
+
cur_re
,
dmrs_start
+
(
sz
-
remaining_re
)
/
2
,
amp_dmrs
,
amp
,
remaining_re
);
dmrs_case1
(
txF
,
dmrs_start
,
amp_dmrs
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
break
;
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
2
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
1
&&
l_prime
==
0
)
{
case
1
:
dmrs_case2
(
txF
,
dmrs_start
,
amp_dmrs
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
cur_re
+=
dmrs_case11
(
txF
+
start_sc
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
upper_limit
);
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
2
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
2
&&
l_prime
==
0
)
{
cur_re
+=
dmrs_case11
(
txF
,
txl
+
cur_re
,
dmrs_start
+
(
sz
-
remaining_re
)
/
2
,
amp_dmrs
,
amp
,
remaining_re
);
dmrs_case3
(
txF
,
dmrs_start
,
amp_dmrs
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
break
;
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
2
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
3
&&
l_prime
==
0
)
{
case
2
:
dmrs_case4
(
txF
,
dmrs_start
,
amp_dmrs
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
cur_re
+=
dmrs_case12
(
txF
+
start_sc
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
upper_limit
);
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
1
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
0
&&
l_prime
==
0
)
{
cur_re
+=
dmrs_case12
(
txF
,
txl
+
cur_re
,
dmrs_start
+
(
sz
-
remaining_re
)
/
2
,
amp_dmrs
,
amp
,
remaining_re
);
dmrs_case5
(
txF
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
break
;
cur_re
+=
sz
>>
1
;
case
3
:
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
1
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
1
&&
l_prime
==
0
)
{
cur_re
+=
dmrs_case13
(
txF
+
start_sc
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
upper_limit
);
dmrs_case6
(
txF
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
cur_re
+=
dmrs_case13
(
txF
,
txl
+
cur_re
,
dmrs_start
+
(
sz
-
remaining_re
)
/
2
,
amp_dmrs
,
amp
,
remaining_re
);
cur_re
+=
sz
>>
1
;
break
;
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
1
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
2
&&
l_prime
==
0
)
{
}
dmrs_case7
(
txF
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
}
else
cur_re
+=
sz
>>
1
;
AssertFatal
(
false
,
"rel15->numDmrsCdmGrpsNoData is %d
\n
"
,
rel15
->
numDmrsCdmGrpsNoData
);
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
1
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
3
&&
l_prime
==
0
)
{
dmrs_case8
(
txF
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
cur_re
+=
sz
>>
1
;
}
else
{
}
else
{
k
=
dmrs_case9
(
k
,
cur_re
+=
dmrs_case00
(
txF
,
txF
,
txl
+
cur_re
,
txl
,
dmrs_start
,
dmrs_start
,
amp_dmrs
,
amp_dmrs
,
amp
,
amp
,
sz
,
sz
,
&
cur_re
,
start_sc
,
start_sc
,
remaining_re
,
remaining_re
,
dmrs_port
,
dmrs_port
,
...
@@ -1212,7 +1103,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
...
@@ -1212,7 +1103,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
&
n
,
&
n
,
symbol_sz
,
symbol_sz
,
l_prime
,
l_prime
,
rel15
);
rel15
->
numDmrsCdmGrpsNoData
);
}
// generic DMRS case
}
// generic DMRS case
}
else
{
// no PTRS or DMRS in this symbol
}
else
{
// no PTRS or DMRS in this symbol
cur_re
+=
no_ptrs_dmrs_case
(
txF
+
start_sc
,
txl
+
cur_re
,
amp_dmrs
,
amp
,
upper_limit
);
cur_re
+=
no_ptrs_dmrs_case
(
txF
+
start_sc
,
txl
+
cur_re
,
amp_dmrs
,
amp
,
upper_limit
);
...
...
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