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
Michael Black
OpenXG-RAN
Commits
5dbfc4b6
Commit
5dbfc4b6
authored
Jun 06, 2023
by
laurent
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ldpc check based on crc
parent
dae79d1f
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
136 additions
and
239 deletions
+136
-239
openair1/PHY/CODING/coding_defs.h
openair1/PHY/CODING/coding_defs.h
+2
-2
openair1/PHY/CODING/crc_byte.c
openair1/PHY/CODING/crc_byte.c
+1
-1
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h
+32
-63
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
+77
-124
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
+1
-0
openair1/PHY/CODING/nr_rate_matching.c
openair1/PHY/CODING/nr_rate_matching.c
+2
-1
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+16
-28
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+2
-15
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+1
-3
openair1/SIMULATION/NR_PHY/ulsim.c
openair1/SIMULATION/NR_PHY/ulsim.c
+2
-2
No files found.
openair1/PHY/CODING/coding_defs.h
View file @
5dbfc4b6
...
...
@@ -399,8 +399,8 @@ unsigned int crc8 (unsigned char * inptr, int bitlen);
@param bitlen length of inputs in bits*/
unsigned
int
crc6
(
unsigned
char
*
inptr
,
int
bitlen
);
int
check_crc
(
uint8_t
*
decoded_bytes
,
uint32_t
n
,
uint32_t
F
,
uint8_t
crc_type
);
int
check_crc
(
uint8_t
*
decoded_bytes
,
uint32_t
n
,
uint8_t
crc_type
);
/*!\fn void phy_viterbi_dot11_sse2(int8_t *y, uint8_t *decoded_bytes, uint16_t n,int offset,int traceback)
\brief This routine performs a SIMD optmized Viterbi decoder for the 802.11 64-state convolutional code. It can be
run in segments with final trace back after last segment.
...
...
openair1/PHY/CODING/crc_byte.c
View file @
5dbfc4b6
...
...
@@ -313,7 +313,7 @@ uint32_t crc6(unsigned char* inptr, int bitlen)
return
crc
;
}
int
check_crc
(
uint8_t
*
decoded_bytes
,
uint32_t
n
,
uint
32_t
F
,
uint
8_t
crc_type
)
int
check_crc
(
uint8_t
*
decoded_bytes
,
uint32_t
n
,
uint8_t
crc_type
)
{
uint32_t
crc
=
0
,
oldcrc
=
0
;
uint8_t
crc_len
=
0
;
...
...
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h
View file @
5dbfc4b6
...
...
@@ -2728,41 +2728,25 @@ static inline void nrLDPC_bnProc(t_nrLDPC_lut* p_lut, int8_t* bnProcBuf, int8_t*
*/
static
inline
void
nrLDPC_llr2bit
(
int8_t
*
out
,
int8_t
*
llrOut
,
uint16_t
numLLR
)
{
__m256i
*
p_llrOut
=
(
__m256i
*
)
llrOut
;
__m256i
*
p_out
=
(
__m256i
*
)
out
;
int8_t
*
p_llrOut8
;
int8_t
*
p_out8
;
uint32_t
i
;
uint32_t
M
=
numLLR
>>
5
;
uint32_t
Mr
=
numLLR
&
31
;
__m256i
*
p_llrOut
=
(
__m256i
*
)
llrOut
;
__m256i
*
p_out
=
(
__m256i
*
)
out
;
const
int
M
=
numLLR
>>
5
;
const
int
Mr
=
numLLR
&
31
;
const
__m256i
*
p_zeros
=
(
__m256i
*
)
zeros256_epi8
;
const
__m256i
*
p_ones
=
(
__m256i
*
)
ones256_epi8
;
const
__m256i
*
p_zeros
=
(
__m256i
*
)
zeros256_epi8
;
const
__m256i
*
p_ones
=
(
__m256i
*
)
ones256_epi8
;
for
(
i
=
0
;
i
<
M
;
i
++
)
{
*
p_out
++
=
simde_mm256_and_si256
(
*
p_ones
,
simde_mm256_cmpgt_epi8
(
*
p_zeros
,
*
p_llrOut
));
p_llrOut
++
;
}
for
(
int
i
=
0
;
i
<
M
;
i
++
)
{
*
p_out
++
=
simde_mm256_and_si256
(
*
p_ones
,
simde_mm256_cmpgt_epi8
(
*
p_zeros
,
*
p_llrOut
));
p_llrOut
++
;
}
if
(
Mr
>
0
)
{
// Remaining LLRs that do not fit in multiples of 32 bytes
p_llrOut8
=
(
int8_t
*
)
p_llrOut
;
p_out8
=
(
int8_t
*
)
p_out
;
// Remaining LLRs that do not fit in multiples of 32 bytes
int8_t
*
p_llrOut8
=
(
int8_t
*
)
p_llrOut
;
int8_t
*
p_out8
=
(
int8_t
*
)
p_out
;
for
(
i
=
0
;
i
<
Mr
;
i
++
)
{
if
(
p_llrOut8
[
i
]
<
0
)
{
p_out8
[
i
]
=
1
;
}
else
{
p_out8
[
i
]
=
0
;
}
}
}
for
(
int
i
=
0
;
i
<
Mr
;
i
++
)
p_out8
[
i
]
=
p_llrOut8
[
i
]
<
0
;
}
/**
...
...
@@ -2778,44 +2762,29 @@ static inline void nrLDPC_llr2bitPacked(int8_t* out, int8_t* llrOut, uint16_t nu
{
/** Vector of indices for shuffling input */
const
uint8_t
constShuffle_256_epi8
[
32
]
__attribute__
((
aligned
(
32
)))
=
{
7
,
6
,
5
,
4
,
3
,
2
,
1
,
0
,
15
,
14
,
13
,
12
,
11
,
10
,
9
,
8
,
7
,
6
,
5
,
4
,
3
,
2
,
1
,
0
,
15
,
14
,
13
,
12
,
11
,
10
,
9
,
8
};
const
__m256i
*
p_shuffle
=
(
__m256i
*
)
constShuffle_256_epi8
;
__m256i
*
p_llrOut
=
(
__m256i
*
)
llrOut
;
uint32_t
*
p_bits
=
(
uint32_t
*
)
out
;
__m256i
inPerm
;
int8_t
*
p_llrOut8
;
uint32_t
bitsTmp
=
0
;
uint32_t
i
;
uint32_t
M
=
numLLR
>>
5
;
uint32_t
Mr
=
numLLR
&
31
;
const
__m256i
*
p_shuffle
=
(
__m256i
*
)
constShuffle_256_epi8
;
for
(
i
=
0
;
i
<
M
;
i
++
)
{
// Move LSB to MSB on 8 bits
inPerm
=
simde_mm256_shuffle_epi8
(
*
p_llrOut
,
*
p_shuffle
);
// Hard decision
*
p_bits
++
=
simde_mm256_movemask_epi8
(
inPerm
);
p_llrOut
++
;
const
uint32_t
M
=
numLLR
>>
5
;
const
uint32_t
Mr
=
numLLR
&
31
;
for
(
uint32_t
i
=
0
;
i
<
M
;
i
++
)
{
// Move LSB to MSB on 8 bits
const
__m256i
inPerm
=
simde_mm256_shuffle_epi8
(
*
p_llrOut
,
*
p_shuffle
);
// Hard decision
*
p_bits
++
=
simde_mm256_movemask_epi8
(
inPerm
);
p_llrOut
++
;
}
if
(
Mr
>
0
)
{
// Remaining LLRs that do not fit in multiples of 32 bytes
p_llrOut8
=
(
int8_t
*
)
p_llrOut
;
for
(
i
=
0
;
i
<
Mr
;
i
++
)
{
if
(
p_llrOut8
[
i
]
<
0
)
{
bitsTmp
|=
(
1
<<
((
7
-
i
)
+
(
16
*
(
i
/
8
))));
}
else
{
bitsTmp
|=
(
0
<<
((
7
-
i
)
+
(
16
*
(
i
/
8
))));
}
}
// Remaining LLRs that do not fit in multiples of 32 bytes
if
(
Mr
)
{
const
int8_t
*
p_llrOut8
=
(
int8_t
*
)
p_llrOut
;
uint32_t
bitsTmp
=
0
;
for
(
uint32_t
i
=
0
;
i
<
Mr
;
i
++
)
bitsTmp
|=
(
p_llrOut8
[
i
]
<
0
)
<<
((
7
-
i
)
+
(
16
*
(
i
/
8
)));
*
p_bits
=
bitsTmp
;
}
*
p_bits
=
bitsTmp
;
}
#endif
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
View file @
5dbfc4b6
...
...
@@ -107,13 +107,9 @@
#endif
#define NR_LDPC_ENABLE_PARITY_CHECK
//#define NR_LDPC_PROFILER_DETAIL
//#define NR_LDPC_ENABLE_PARITY_CHECK
//#define NR_LDPC_PROFILER_DETAIL(a) a
#define NR_LDPC_PROFILER_DETAIL(a)
#ifdef NR_LDPC_DEBUG_MODE
#include "nrLDPC_tools/nrLDPC_debug.h"
...
...
@@ -134,18 +130,19 @@ int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams,
t_nrLDPC_time_stats
*
p_profiler
,
decode_abort_t
*
ab
)
{
uint32_t
numLLR
;
uint32_t
numIter
=
0
;
t_nrLDPC_lut
lut
;
t_nrLDPC_lut
*
p_lut
=
&
lut
;
// Initialize decoder core(s) with correct LUTs
numLLR
=
nrLDPC_init
(
p_decParams
,
p_lut
);
// Launch LDPC decoder core for one segment
numIter
=
nrLDPC_decoder_core
(
p_llr
,
p_out
,
numLLR
,
p_lut
,
p_decParams
,
p_profiler
,
ab
);
if
(
numIter
>
p_decParams
->
numMaxIter
)
set_abort
(
ab
,
true
);
uint32_t
numLLR
;
t_nrLDPC_lut
lut
;
t_nrLDPC_lut
*
p_lut
=
&
lut
;
// Initialize decoder core(s) with correct LUTs
numLLR
=
nrLDPC_init
(
p_decParams
,
p_lut
);
// Launch LDPC decoder core for one segment
int
numIter
=
nrLDPC_decoder_core
(
p_llr
,
p_out
,
numLLR
,
p_lut
,
p_decParams
,
p_profiler
,
ab
);
if
(
numIter
>
p_decParams
->
numMaxIter
)
{
LOG_D
(
PHY
,
"set abort: %d, %d
\n
"
,
numIter
,
p_decParams
->
numMaxIter
);
set_abort
(
ab
,
true
);
}
return
numIter
;
}
...
...
@@ -183,9 +180,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr,
int8_t
llrOut
[
NR_LDPC_MAX_NUM_LLR
]
__attribute__
((
aligned
(
64
)))
=
{
0
};
// Minimum number of iterations is 1
// 0 iterations means hard-decision on input LLRs
uint32_t
i
=
1
;
// Initialize with parity check fail != 0
int32_t
pcRes
=
1
;
int8_t
*
p_llrOut
;
if
(
outMode
==
nrLDPC_outMode_LLRINT8
)
...
...
@@ -200,27 +195,20 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr,
// Initialization
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
llr2llrProcBuf
);
#endif
NR_LDPC_PROFILER_DETAIL
(
start_meas
(
&
p_profiler
->
llr2llrProcBuf
));
nrLDPC_llr2llrProcBuf
(
p_lut
,
p_llr
,
llrProcBuf
,
Z
,
BG
);
#ifdef NR_LDPC_PROFILER_DETAIL
stop_meas
(
&
p_profiler
->
llr2llrProcBuf
);
#endif
NR_LDPC_PROFILER_DETAIL
(
stop_meas
(
&
p_profiler
->
llr2llrProcBuf
));
#ifdef NR_LDPC_DEBUG_MODE
nrLDPC_debug_initBuffer2File
(
nrLDPC_buffers_LLR_PROC
);
nrLDPC_debug_writeBuffer2File
(
nrLDPC_buffers_LLR_PROC
,
llrProcBuf
);
#endif
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
llr2CnProcBuf
);
#endif
if
(
BG
==
1
)
nrLDPC_llr2CnProcBuf_BG1
(
p_lut
,
p_llr
,
cnProcBuf
,
Z
);
else
nrLDPC_llr2CnProcBuf_BG2
(
p_lut
,
p_llr
,
cnProcBuf
,
Z
);
#ifdef NR_LDPC_PROFILER_DETAIL
stop_meas
(
&
p_profiler
->
llr2CnProcBuf
);
#endif
NR_LDPC_PROFILER_DETAIL
(
start_meas
(
&
p_profiler
->
llr2CnProcBuf
));
if
(
BG
==
1
)
nrLDPC_llr2CnProcBuf_BG1
(
p_lut
,
p_llr
,
cnProcBuf
,
Z
);
else
nrLDPC_llr2CnProcBuf_BG2
(
p_lut
,
p_llr
,
cnProcBuf
,
Z
);
NR_LDPC_PROFILER_DETAIL
(
stop_meas
(
&
p_profiler
->
llr2CnProcBuf
));
#ifdef NR_LDPC_DEBUG_MODE
nrLDPC_debug_initBuffer2File
(
nrLDPC_buffers_CN_PROC
);
...
...
@@ -230,12 +218,10 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr,
// First iteration
// CN processing
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
cnProc
);
#endif
NR_LDPC_PROFILER_DETAIL
(
start_meas
(
&
p_profiler
->
cnProc
));
if
(
BG
==
1
)
{
#ifndef UNROLL_CN_PROC
nrLDPC_cnProc_BG1
(
p_lut
,
cnProcBuf
,
cnProcBufRes
,
Z
);
#ifndef UNROLL_CN_PROC
nrLDPC_cnProc_BG1
(
p_lut
,
cnProcBuf
,
cnProcBufRes
,
Z
);
#else
switch
(
R
)
{
...
...
@@ -307,23 +293,19 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr,
}
#endif
}
#ifdef NR_LDPC_PROFILER_DETAIL
stop_meas
(
&
p_profiler
->
cnProc
);
#endif
NR_LDPC_PROFILER_DETAIL
(
stop_meas
(
&
p_profiler
->
cnProc
));
#ifdef NR_LDPC_DEBUG_MODE
nrLDPC_debug_initBuffer2File
(
nrLDPC_buffers_CN_PROC_RES
);
nrLDPC_debug_writeBuffer2File
(
nrLDPC_buffers_CN_PROC_RES
,
cnProcBufRes
);
#endif
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
cn2bnProcBuf
);
#endif
if
(
BG
==
1
)
nrLDPC_cn2bnProcBuf_BG1
(
p_lut
,
cnProcBufRes
,
bnProcBuf
,
Z
);
else
nrLDPC_cn2bnProcBuf_BG2
(
p_lut
,
cnProcBufRes
,
bnProcBuf
,
Z
);
#ifdef NR_LDPC_PROFILER_DETAIL
stop_meas
(
&
p_profiler
->
cn2bnProcBuf
);
#endif
NR_LDPC_PROFILER_DETAIL
(
start_meas
(
&
p_profiler
->
cn2bnProcBuf
));
if
(
BG
==
1
)
nrLDPC_cn2bnProcBuf_BG1
(
p_lut
,
cnProcBufRes
,
bnProcBuf
,
Z
);
else
nrLDPC_cn2bnProcBuf_BG2
(
p_lut
,
cnProcBufRes
,
bnProcBuf
,
Z
);
NR_LDPC_PROFILER_DETAIL
(
stop_meas
(
&
p_profiler
->
cn2bnProcBuf
));
#ifdef NR_LDPC_DEBUG_MODE
nrLDPC_debug_initBuffer2File
(
nrLDPC_buffers_BN_PROC
);
...
...
@@ -331,10 +313,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr,
#endif
// BN processing
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
bnProcPc
);
#endif
NR_LDPC_PROFILER_DETAIL
(
start_meas
(
&
p_profiler
->
bnProcPc
));
#ifndef UNROLL_BN_PROC_PC
nrLDPC_bnProcPc
(
p_lut
,
bnProcBuf
,
bnProcBufRes
,
llrProcBuf
,
llrRes
,
Z
);
...
...
@@ -379,18 +358,14 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr,
}
#endif
#ifdef NR_LDPC_PROFILER_DETAIL
stop_meas
(
&
p_profiler
->
bnProcPc
);
#endif
NR_LDPC_PROFILER_DETAIL
(
stop_meas
(
&
p_profiler
->
bnProcPc
));
#ifdef NR_LDPC_DEBUG_MODE
nrLDPC_debug_initBuffer2File
(
nrLDPC_buffers_LLR_RES
);
nrLDPC_debug_writeBuffer2File
(
nrLDPC_buffers_LLR_RES
,
llrRes
);
#endif
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
bnProc
);
#endif
NR_LDPC_PROFILER_DETAIL
(
start_meas
(
&
p_profiler
->
bnProc
));
if
(
BG
==
1
)
{
#ifndef UNROLL_BN_PROC
...
...
@@ -491,13 +466,16 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr,
// estimated after only one iteration
// First iteration finished
while
(
(
i
<
numMaxIter
)
&&
(
pcRes
!=
0
)
)
{
// Increase iteration counter
i
++
;
if
(
check_abort
(
ab
))
return
numMaxIter
+
2
;
// CN processing
uint32_t
numIter
=
1
;
int32_t
pcRes
=
1
;
// pcRes is 0 if the ldpc decoder is succesful
while
((
numIter
<=
numMaxIter
)
&&
(
pcRes
!=
0
))
{
// Increase iteration counter
numIter
++
;
if
(
check_abort
(
ab
))
{
numIter
=
numMaxIter
+
2
;
break
;
}
// CN processing
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
cnProc
);
#endif
...
...
@@ -593,9 +571,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr,
#endif
// BN Processing
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
bnProcPc
);
#endif
NR_LDPC_PROFILER_DETAIL
(
start_meas
(
&
p_profiler
->
bnProcPc
));
#ifndef UNROLL_BN_PROC_PC
nrLDPC_bnProcPc
(
p_lut
,
bnProcBuf
,
bnProcBufRes
,
llrProcBuf
,
llrRes
,
Z
);
...
...
@@ -639,17 +615,13 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr,
}
}
#endif
#ifdef NR_LDPC_PROFILER_DETAIL
stop_meas
(
&
p_profiler
->
bnProcPc
);
#endif
NR_LDPC_PROFILER_DETAIL
(
stop_meas
(
&
p_profiler
->
bnProcPc
));
#ifdef NR_LDPC_DEBUG_MODE
nrLDPC_debug_writeBuffer2File
(
nrLDPC_buffers_LLR_RES
,
llrRes
);
#endif
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
bnProc
);
#endif
NR_LDPC_PROFILER_DETAIL
(
start_meas
(
&
p_profiler
->
bnProc
));
#ifndef UNROLL_BN_PROC
nrLDPC_bnProc
(
p_lut
,
bnProcBuf
,
bnProcBufRes
,
llrRes
,
Z
);
#else
...
...
@@ -717,25 +689,19 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr,
}
#endif
#ifdef NR_LDPC_PROFILER_DETAIL
stop_meas
(
&
p_profiler
->
bnProc
);
#endif
NR_LDPC_PROFILER_DETAIL
(
stop_meas
(
&
p_profiler
->
bnProc
));
#ifdef NR_LDPC_DEBUG_MODE
nrLDPC_debug_writeBuffer2File
(
nrLDPC_buffers_BN_PROC_RES
,
bnProcBufRes
);
#endif
// BN results to CN processing buffer
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
bn2cnProcBuf
);
#endif
if
(
BG
==
1
)
nrLDPC_bn2cnProcBuf_BG1
(
p_lut
,
bnProcBufRes
,
cnProcBuf
,
Z
);
else
nrLDPC_bn2cnProcBuf_BG2
(
p_lut
,
bnProcBufRes
,
cnProcBuf
,
Z
);
#ifdef NR_LDPC_PROFILER_DETAIL
stop_meas
(
&
p_profiler
->
bn2cnProcBuf
);
#endif
NR_LDPC_PROFILER_DETAIL
(
start_meas
(
&
p_profiler
->
bn2cnProcBuf
));
if
(
BG
==
1
)
nrLDPC_bn2cnProcBuf_BG1
(
p_lut
,
bnProcBufRes
,
cnProcBuf
,
Z
);
else
nrLDPC_bn2cnProcBuf_BG2
(
p_lut
,
bnProcBufRes
,
cnProcBuf
,
Z
);
NR_LDPC_PROFILER_DETAIL
(
stop_meas
(
&
p_profiler
->
bn2cnProcBuf
));
#ifdef NR_LDPC_DEBUG_MODE
nrLDPC_debug_writeBuffer2File
(
nrLDPC_buffers_CN_PROC
,
cnProcBuf
);
...
...
@@ -743,40 +709,27 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr,
// Parity Check
#ifdef NR_LDPC_ENABLE_PARITY_CHECK
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
cnProcPc
);
#endif
if
(
BG
==
1
)
pcRes
=
nrLDPC_cnProcPc_BG1
(
p_lut
,
cnProcBuf
,
cnProcBufRes
,
Z
);
else
pcRes
=
nrLDPC_cnProcPc_BG2
(
p_lut
,
cnProcBuf
,
cnProcBufRes
,
Z
);
#ifdef NR_LDPC_PROFILER_DETAIL
stop_meas
(
&
p_profiler
->
cnProcPc
);
#endif
#endif
}
// end while
// Last iteration
if
(
pcRes
!=
0
)
i
++
;
// Assign results from processing buffer to output
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
llrRes2llrOut
);
#endif
nrLDPC_llrRes2llrOut
(
p_lut
,
p_llrOut
,
llrRes
,
Z
,
BG
);
#ifdef NR_LDPC_PROFILER_DETAIL
stop_meas
(
&
p_profiler
->
llrRes2llrOut
);
#endif
// Hard-decision
#ifdef NR_LDPC_PROFILER_DETAIL
start_meas
(
&
p_profiler
->
llr2bit
);
#endif
if
(
outMode
==
nrLDPC_outMode_BIT
)
nrLDPC_llr2bitPacked
(
p_out
,
p_llrOut
,
numLLR
);
else
//if (outMode == nrLDPC_outMode_BITINT8)
nrLDPC_llr2bit
(
p_out
,
p_llrOut
,
numLLR
);
#ifdef NR_LDPC_PROFILER_DETAIL
stop_meas
(
&
p_profiler
->
llr2bit
);
#endif
NR_LDPC_PROFILER_DETAIL
(
start_meas
(
&
p_profiler
->
cnProcPc
));
if
(
BG
==
1
)
pcRes
=
nrLDPC_cnProcPc_BG1
(
p_lut
,
cnProcBuf
,
cnProcBufRes
,
Z
);
else
pcRes
=
nrLDPC_cnProcPc_BG2
(
p_lut
,
cnProcBuf
,
cnProcBufRes
,
Z
);
NR_LDPC_PROFILER_DETAIL
(
stop_meas
(
&
p_profiler
->
cnProcPc
));
#endif
if
(
numIter
>
2
)
{
nrLDPC_llrRes2llrOut
(
p_lut
,
p_llrOut
,
llrRes
,
Z
,
BG
);
if
(
outMode
==
nrLDPC_outMode_BIT
)
nrLDPC_llr2bitPacked
(
p_out
,
p_llrOut
,
numLLR
);
else
// if (outMode == nrLDPC_outMode_BITINT8)
nrLDPC_llr2bit
(
p_out
,
p_llrOut
,
numLLR
);
if
(
check_crc
((
uint8_t
*
)
p_out
,
p_decParams
->
block_length
,
p_decParams
->
crc_type
))
{
LOG_D
(
PHY
,
"Segment CRC OK, exiting LDPC decoder
\n
"
);
break
;
}
}
}
// end while
return
i
;
return
numIter
;
}
...
...
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
View file @
5dbfc4b6
...
...
@@ -88,6 +88,7 @@ typedef struct nrLDPC_dec_params {
uint8_t
numMaxIter
;
/**< Maximum number of iterations */
int
block_length
;
e_nrLDPC_outMode
outMode
;
/**< Output format */
int
crc_type
;
}
t_nrLDPC_dec_params
;
/**
...
...
openair1/PHY/CODING/nr_rate_matching.c
View file @
5dbfc4b6
...
...
@@ -551,7 +551,8 @@ int nr_rate_matching_ldpc_rx(uint32_t Tbslbrm,
printf
(
"nr_rate_matching_ldpc_rx: Clear %d, E %u, k0 %u, Ncb %u, rvidx %d, Tbslbrm %u
\n
"
,
clear
,
E
,
ind
,
Ncb
,
rvidx
,
Tbslbrm
);
#endif
if
(
clear
==
1
)
memset
(
w
,
0
,
Ncb
*
sizeof
(
int16_t
));
if
(
clear
==
1
)
memset
(
w
,
0
,
Ncb
*
sizeof
(
int16_t
));
k
=
0
;
...
...
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
View file @
5dbfc4b6
...
...
@@ -243,21 +243,9 @@ static void nr_processULSegment(void *arg)
////////////////////////////////// pl =====> llrProcBuf //////////////////////////////////
p_decoderParms
->
block_length
=
length_dec
;
p_decoderParms
->
crc_type
=
crc_type
;
rdata
->
decodeIterations
=
nrLDPC_decoder
(
p_decoderParms
,
(
int8_t
*
)
&
pl
[
0
],
llrProcBuf
,
p_procTime
,
&
ulsch_harq
->
abort_decode
);
if
(
rdata
->
decodeIterations
==
p_decoderParms
->
numMaxIter
+
1
)
{
// We have not decoded succesfully and we have not aborted
// We check the CRC, itf it is ok, let's assume the payload is correctly decoded
// (so the remaining errors are only in the redundancy (parity) bits)
if
(
check_crc
((
uint8_t
*
)
llrProcBuf
,
length_dec
,
ulsch_harq
->
F
,
crc_type
))
{
PRINT_CRC_CHECK
(
LOG_I
(
PHY
,
"Segment %d CRC OK, iterations %d/%d
\n
"
,
r
,
rdata
->
decodeIterations
,
max_ldpc_iterations
));
rdata
->
decodeIterations
=
p_decoderParms
->
numMaxIter
;
}
else
{
PRINT_CRC_CHECK
(
LOG_I
(
PHY
,
"CRC NOK
\n
"
));
rdata
->
decodeIterations
=
max_ldpc_iterations
+
1
;
}
}
if
(
rdata
->
decodeIterations
<=
p_decoderParms
->
numMaxIter
)
memcpy
(
ulsch_harq
->
c
[
r
],
llrProcBuf
,
Kr
>>
3
);
//stop_meas(&phy_vars_gNB->ulsch_ldpc_decoding_stats);
...
...
@@ -273,14 +261,20 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
uint8_t
harq_pid
,
uint32_t
G
)
{
if
(
!
ulsch_llr
)
{
LOG_E
(
PHY
,
"ulsch_decoding.c: NULL ulsch_llr pointer
\n
"
);
return
-
1
;
}
NR_gNB_ULSCH_t
*
ulsch
=
&
phy_vars_gNB
->
ulsch
[
ULSCH_id
];
NR_gNB_PUSCH
*
pusch
=
&
phy_vars_gNB
->
pusch_vars
[
ULSCH_id
];
NR_UL_gNB_HARQ_t
*
harq_process
=
ulsch
->
harq_process
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_ULSCH_DECODING
,
1
);
if
(
!
harq_process
)
{
LOG_E
(
PHY
,
"ulsch_decoding.c: NULL harq_process pointer
\n
"
);
return
-
1
;
NR_gNB_ULSCH_t
*
ulsch
=
&
phy_vars_gNB
->
ulsch
[
ULSCH_id
];
NR_gNB_PUSCH
*
pusch
=
&
phy_vars_gNB
->
pusch_vars
[
ULSCH_id
];
NR_UL_gNB_HARQ_t
*
harq_process
=
ulsch
->
harq_process
;
if
(
!
harq_process
)
{
LOG_E
(
PHY
,
"ulsch_decoding.c: NULL harq_process pointer
\n
"
);
return
-
1
;
}
uint8_t
dtx_det
=
0
;
...
...
@@ -296,12 +290,6 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
uint8_t
n_layers
=
pusch_pdu
->
nrOfLayers
;
// ------------------------------------------------------------------
if
(
!
ulsch_llr
)
{
LOG_E
(
PHY
,
"ulsch_decoding.c: NULL ulsch_llr pointer
\n
"
);
return
-
1
;
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_ULSCH_DECODING
,
1
);
harq_process
->
TBS
=
pusch_pdu
->
pusch_data
.
tb_size
;
dtx_det
=
0
;
...
...
@@ -493,13 +481,13 @@ int nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
harq_process
->
c
[
r
][
m
]
=
(
uint8_t
)
llrProcBuf
[
m
];
}
if
(
check_crc
((
uint8_t
*
)
llrProcBuf
,
length_dec
,
harq_process
->
F
,
crc_type
))
{
if
(
check_crc
((
uint8_t
*
)
llrProcBuf
,
length_dec
,
crc_type
))
{
PRINT_CRC_CHECK
(
LOG_I
(
PHY
,
"Segment %d CRC OK
\n
"
,
r
));
decodeIterations
=
2
;
}
else
{
PRINT_CRC_CHECK
(
LOG_I
(
PHY
,
"segment %d CRC NOK
\n
"
,
r
));
PRINT_CRC_CHECK
(
LOG_I
(
PHY
,
"segment %d CRC NOK
\n
"
,
r
));
decodeIterations
=
ulsch
->
max_ldpc_iterations
+
1
;
}
}
//}
r_offset
+=
E
;
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
View file @
5dbfc4b6
...
...
@@ -113,7 +113,7 @@ static bool nr_ue_postDecode(PHY_VARS_NR_UE *phy_vars_ue,
int
A
=
dlsch
->
dlsch_config
.
TBS
;
int
crc_length
=
A
>
3824
?
3
:
2
;
int
crc_type
=
A
>
3824
?
CRC24_A
:
CRC16
;
if
(
!
check_crc
(
b
,
A
+
crc_length
*
8
,
0
/* F - unused */
,
crc_type
))
{
if
(
!
check_crc
(
b
,
A
+
crc_length
*
8
,
crc_type
))
{
harq_process
->
ack
=
0
;
dlsch
->
last_iteration_cnt
=
dlsch
->
max_ldpc_iterations
+
1
;
LOG_E
(
PHY
,
" Frame %d.%d LDPC global CRC fails, but individual LDPC CRC succeeded. %d segs
\n
"
,
proc
->
frame_rx
,
proc
->
nr_slot_rx
,
harq_process
->
C
);
...
...
@@ -269,24 +269,11 @@ static void nr_processDLSegment(void *arg)
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN);
p_decoderParms
->
block_length
=
length_dec
;
nrLDPC_initcall
(
p_decoderParms
,
(
int8_t
*
)
&
pl
[
0
],
LDPCoutput
);
p_decoderParms
->
crc_type
=
crc_type
;
rdata
->
decodeIterations
=
nrLDPC_decoder
(
p_decoderParms
,
(
int8_t
*
)
&
pl
[
0
],
LDPCoutput
,
&
procTime
,
&
harq_process
->
abort_decode
);
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT);
LOG_W
(
PHY
,
"rdata->decodeIterations = %d
\n
"
,
rdata
->
decodeIterations
);
if
(
rdata
->
decodeIterations
<
dlsch
->
max_ldpc_iterations
+
2
)
{
// We have not aborted the decoding
if
(
check_crc
((
uint8_t
*
)
LDPCoutput
,
length_dec
,
harq_process
->
F
,
crc_type
))
{
LOG_D
(
PHY
,
"Segment %u CRC OK
\n
"
,
r
);
if
(
rdata
->
decodeIterations
>
dlsch
->
max_ldpc_iterations
)
{
LOG_W
(
PHY
,
"force ok
\n
"
);
rdata
->
decodeIterations
=
dlsch
->
max_ldpc_iterations
;
}
}
else
{
LOG_D
(
PHY
,
"%d.%d CRC NOT OK, iter %d
\n
"
,
rdata
->
proc
->
frame_rx
,
rdata
->
proc
->
nr_slot_rx
,
rdata
->
decodeIterations
);
rdata
->
decodeIterations
=
dlsch
->
max_ldpc_iterations
+
1
;
}
}
else
LOG_D
(
PHY
,
"%d.%d another segment failure aborted this decode
\n
"
,
rdata
->
proc
->
frame_rx
,
rdata
->
proc
->
nr_slot_rx
);
if
(
rdata
->
decodeIterations
<=
dlsch
->
max_ldpc_iterations
)
memcpy
(
harq_process
->
c
[
r
],
LDPCoutput
,
Kr
>>
3
);
...
...
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
View file @
5dbfc4b6
...
...
@@ -424,10 +424,8 @@ static int nr_ue_pbch_procedures(PHY_VARS_NR_UE *ue,
*/
}
return
ret
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES
,
VCD_FUNCTION_OUT
);
return
ret
;
}
...
...
openair1/SIMULATION/NR_PHY/ulsim.c
View file @
5dbfc4b6
...
...
@@ -680,7 +680,7 @@ int main(int argc, char **argv)
c16_t
**
rxdata
;
rxdata
=
malloc
(
n_rx
*
sizeof
(
*
rxdata
));
for
(
int
i
=
0
;
i
<
n_rx
;
++
i
)
rxdata
[
i
]
=
calloc
(
gNB
->
frame_parms
.
samples_per_frame
*
sizeof
(
**
rxdata
),
1
);
rxdata
[
i
]
=
calloc
(
gNB
->
frame_parms
.
samples_per_frame
,
sizeof
(
**
rxdata
)
);
NR_BWP_Uplink_t
*
ubwp
=
secondaryCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
uplinkConfig
->
uplinkBWP_ToAddModList
->
list
.
array
[
0
];
...
...
@@ -1042,7 +1042,7 @@ int main(int argc, char **argv)
pusch_pdu
->
maintenance_parms_v3
.
tbSizeLbrmBytes
=
tbslbrm
;
pusch_pdu
->
pusch_data
.
rv_index
=
rv_index
;
pusch_pdu
->
pusch_data
.
harq_process_id
=
0
;
pusch_pdu
->
pusch_data
.
new_data_indicator
=
round
==
0
?
1
:
0
;
pusch_pdu
->
pusch_data
.
new_data_indicator
=
round
==
0
?
true
:
false
;
pusch_pdu
->
pusch_data
.
num_cb
=
0
;
pusch_pdu
->
pusch_ptrs
.
ptrs_time_density
=
ptrs_time_density
;
pusch_pdu
->
pusch_ptrs
.
ptrs_freq_density
=
ptrs_freq_density
;
...
...
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