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
spbro
OpenXG-RAN
Commits
61532429
Commit
61532429
authored
Jun 06, 2023
by
laurent
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ldpc check based on crc
parent
3645c96c
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
226 additions
and
412 deletions
+226
-412
CMakeLists.txt
CMakeLists.txt
+5
-1
common/utils/load_module_shlib.c
common/utils/load_module_shlib.c
+40
-45
openair1/PHY/CODING/TESTBENCH/ldpctest.c
openair1/PHY/CODING/TESTBENCH/ldpctest.c
+4
-6
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
+96
-137
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
+0
-83
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
+1
-0
openair1/PHY/CODING/nrLDPC_extern.h
openair1/PHY/CODING/nrLDPC_extern.h
+4
-4
openair1/PHY/CODING/nrLDPC_load.c
openair1/PHY/CODING/nrLDPC_load.c
+17
-20
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
+17
-29
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.
CMakeLists.txt
View file @
61532429
...
...
@@ -1015,6 +1015,10 @@ endif()
add_library
(
ldpc MODULE
${
PHY_LDPC_OPTIM8SEGMULTI_SRC
}
)
target_link_libraries
(
ldpc PRIVATE ldpc_gen_HEADERS
)
add_library
(
ldpc_parityCheck MODULE
${
PHY_LDPC_OPTIM8SEGMULTI_SRC
}
)
target_compile_definitions
(
ldpc_parityCheck PUBLIC NR_LDPC_ENABLE_PARITY_CHECK
)
target_link_libraries
(
ldpc_parityCheck PRIVATE ldpc_gen_HEADERS
)
add_library
(
coding MODULE
${
PHY_TURBOSRC
}
)
add_library
(
dfts MODULE
${
OPENAIR1_DIR
}
/PHY/TOOLS/oai_dfts.c
)
...
...
@@ -2408,7 +2412,7 @@ add_executable(ldpctest
${
SHLIB_LOADER_SOURCES
}
)
add_dependencies
(
ldpctest ldpc_orig ldpc_optim ldpc_optim8seg ldpc
)
add_dependencies
(
ldpctest ldpc_orig ldpc_optim ldpc_optim8seg ldpc
ldpc_parityCheck
)
if
(
ENABLE_LDPC_CUDA
)
add_dependencies
(
ldpctest ldpc_cuda
)
endif
()
...
...
common/utils/load_module_shlib.c
View file @
61532429
...
...
@@ -63,60 +63,55 @@ void loader_init(void) {
}
/* build the full shared lib name from the module name */
char
*
loader_format_shlibpath
(
char
*
modname
,
char
*
version
)
static
char
*
loader_format_shlibpath
(
char
*
modname
,
char
*
version
)
{
char
*
tmpstr
;
char
*
shlibpath
=
NULL
;
char
*
shlibversion
=
NULL
;
// clang-format off
paramdef_t
LoaderParams
[]
=
{
char
*
tmpstr
;
char
*
shlibpath
=
NULL
;
char
*
shlibversion
=
NULL
;
// clang-format off
paramdef_t
LoaderParams
[]
=
{
{
"shlibpath"
,
NULL
,
0
,
.
strptr
=
&
shlibpath
,
.
defstrval
=
NULL
,
TYPE_STRING
,
0
,
NULL
},
{
"shlibversion"
,
NULL
,
0
,
.
strptr
=
&
shlibversion
,
.
defstrval
=
""
,
TYPE_STRING
,
0
,
NULL
}
};
// clang-format on
int
ret
;
};
// clang-format on
int
ret
;
/* looks for specific path for this module in the config file */
/* specific value for a module path and version is located in a modname subsection of the loader section */
/* shared lib name is formatted as lib<module name><module version>.so */
/* looks for specific path for this module in the config file */
/* specific value for a module path and version is located in a modname subsection of the loader section */
/* shared lib name is formatted as lib<module name><module version>.so */
char
cfgprefix
[
sizeof
(
LOADER_CONFIG_PREFIX
)
+
strlen
(
modname
)
+
16
];
sprintf
(
cfgprefix
,
LOADER_CONFIG_PREFIX
".%s"
,
modname
);
ret
=
config_get
(
LoaderParams
,
sizeof
(
LoaderParams
)
/
sizeof
(
paramdef_t
),
cfgprefix
);
ret
=
config_get
(
LoaderParams
,
sizeofArray
(
LoaderParams
),
cfgprefix
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"[LOADER] %s %d couldn't retrieve config from section %s
\n
"
,
__FILE__
,
__LINE__
,
cfgprefix
);
}
/* no specific path, use loader default shared lib path */
if
(
shlibpath
==
NULL
)
{
shlibpath
=
loader_data
.
shlibpath
;
}
/* no specific shared lib version */
if
(
version
!=
NULL
)
{
// version specified as a function parameter
shlibversion
=
version
;
}
if
(
shlibversion
==
NULL
)
{
// no specific version specified, neither as a config param or as a function param
shlibversion
=
""
;
}
/* alloc memory for full module shared lib file name */
tmpstr
=
malloc
(
strlen
(
shlibpath
)
+
strlen
(
modname
)
+
strlen
(
shlibversion
)
+
16
);
if
(
tmpstr
==
NULL
)
{
fprintf
(
stderr
,
"[LOADER] %s %d malloc error loading module %s, %s
\n
"
,
__FILE__
,
__LINE__
,
modname
,
strerror
(
errno
));
exit_fun
(
"[LOADER] unrecoverable error"
);
}
if
(
shlibpath
[
0
]
!=
0
)
{
ret
=
sprintf
(
tmpstr
,
"%s/"
,
shlibpath
);
}
else
{
ret
=
0
;
}
fprintf
(
stderr
,
"[LOADER] %s %d couldn't retrieve config from section %s
\n
"
,
__FILE__
,
__LINE__
,
cfgprefix
);
}
/* no specific path, use loader default shared lib path */
if
(
shlibpath
==
NULL
)
{
shlibpath
=
loader_data
.
shlibpath
;
}
/* no specific shared lib version */
if
(
version
!=
NULL
)
{
// version specified as a function parameter
shlibversion
=
version
;
}
if
(
shlibversion
==
NULL
)
{
// no specific version specified, neither as a config param or as a function param
shlibversion
=
""
;
}
/* alloc memory for full module shared lib file name */
tmpstr
=
malloc
(
strlen
(
shlibpath
)
+
strlen
(
modname
)
+
strlen
(
shlibversion
)
+
16
);
if
(
tmpstr
==
NULL
)
{
fprintf
(
stderr
,
"[LOADER] %s %d malloc error loading module %s, %s
\n
"
,
__FILE__
,
__LINE__
,
modname
,
strerror
(
errno
));
exit_fun
(
"[LOADER] unrecoverable error"
);
}
if
(
shlibpath
[
0
]
!=
0
)
{
ret
=
sprintf
(
tmpstr
,
"%s/"
,
shlibpath
);
}
else
{
ret
=
0
;
}
sprintf
(
tmpstr
+
ret
,
"lib%s%s.so"
,
modname
,
shlibversion
);
sprintf
(
tmpstr
+
ret
,
"lib%s%s.so"
,
modname
,
shlibversion
);
return
tmpstr
;
return
tmpstr
;
}
int
load_module_version_shlib
(
char
*
modname
,
char
*
version
,
loader_shlibfunc_t
*
farray
,
int
numf
,
void
*
autoinit_arg
)
...
...
openair1/PHY/CODING/TESTBENCH/ldpctest.c
View file @
61532429
...
...
@@ -435,7 +435,9 @@ int main(int argc, char *argv[])
unsigned
int
errors
,
errors_bit
,
crc_misses
;
double
errors_bit_uncoded
;
short
block_length
=
8448
;
// decoder supports length: 1201 -> 1280, 2401 -> 2560
char
*
ldpc_version
=
NULL
;
/* version of the ldpc decoder library to use (XXX suffix to use when loading libldpc_XXX.so */
// default to check output inside ldpc, the NR version checks the outer CRC defined by 3GPP
char
*
ldpc_version
=
"_parityCheck"
;
/* version of the ldpc decoder library to use (XXX suffix to use when loading libldpc_XXX.so */
short
max_iterations
=
5
;
int
n_segments
=
1
;
//double rate=0.333;
...
...
@@ -535,11 +537,7 @@ int main(int argc, char *argv[])
printf
(
"n_trials %d:
\n
"
,
n_trials
);
printf
(
"SNR0 %f:
\n
"
,
SNR0
);
if
(
ldpc_version
!=
NULL
)
load_nrLDPClib
(
ldpc_version
);
else
load_nrLDPClib
(
NULL
);
load_nrLDPClib
(
ldpc_version
);
load_nrLDPClib_ref
(
"_orig"
,
&
encoder_orig
);
//for (block_length=8;block_length<=MAX_BLOCK_LENGTH;block_length+=8)
...
...
openair1/PHY/CODING/coding_defs.h
View file @
61532429
...
...
@@ -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 @
61532429
...
...
@@ -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 @
61532429
...
...
@@ -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 @
61532429
This diff is collapsed.
Click to expand it.
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
deleted
100644 → 0
View file @
3645c96c
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*!\file nrLDPC_init_mem.h
* \brief Defines the function to initialize the LDPC decoder and sets correct LUTs.
* \author Sebastian Wagner (TCL Communications) Email: <mailto:sebastian.wagner@tcl.com>
* \date 07-12-2018
* \version 1.0
* \note
* \warning
*/
#ifndef __NR_LDPC_INIT_MEM__H__
#define __NR_LDPC_INIT_MEM__H__
#include <stdlib.h>
#include "nrLDPC_types.h"
/**
\brief Allocates 32 byte aligned memory and initializes to zero
\param size Input size in bytes
\return Pointer to memory
*/
static
inline
void
*
malloc32_clear
(
size_t
size
)
{
void
*
ptr
=
(
void
*
)
memalign
(
64
,
size
+
64
);
memset
(
ptr
,
0
,
size
);
return
ptr
;
}
/**
\brief Allocates and initializes the internal decoder processing buffers
\param p_decParams Pointer to decoder parameters
\param p_lut Pointer to decoder LUTs
\return Number of LLR values
*/
static
inline
t_nrLDPC_procBuf
*
nrLDPC_init_mem
(
void
)
{
t_nrLDPC_procBuf
*
p_procBuf
=
(
t_nrLDPC_procBuf
*
)
malloc32_clear
(
sizeof
(
t_nrLDPC_procBuf
));
if
(
p_procBuf
)
{
p_procBuf
->
cnProcBuf
=
(
int8_t
*
)
malloc32_clear
(
NR_LDPC_SIZE_CN_PROC_BUF
*
sizeof
(
int8_t
));
p_procBuf
->
cnProcBufRes
=
(
int8_t
*
)
malloc32_clear
(
NR_LDPC_SIZE_CN_PROC_BUF
*
sizeof
(
int8_t
));
p_procBuf
->
bnProcBuf
=
(
int8_t
*
)
malloc32_clear
(
NR_LDPC_SIZE_BN_PROC_BUF
*
sizeof
(
int8_t
));
p_procBuf
->
bnProcBufRes
=
(
int8_t
*
)
malloc32_clear
(
NR_LDPC_SIZE_BN_PROC_BUF
*
sizeof
(
int8_t
));
p_procBuf
->
llrRes
=
(
int8_t
*
)
malloc32_clear
(
NR_LDPC_MAX_NUM_LLR
*
sizeof
(
int8_t
));
p_procBuf
->
llrProcBuf
=
(
int8_t
*
)
malloc32_clear
(
NR_LDPC_MAX_NUM_LLR
*
sizeof
(
int8_t
));
}
return
(
p_procBuf
);
}
static
inline
void
nrLDPC_free_mem
(
t_nrLDPC_procBuf
*
p_procBuf
)
{
free
(
p_procBuf
->
cnProcBuf
);
free
(
p_procBuf
->
cnProcBufRes
);
free
(
p_procBuf
->
bnProcBuf
);
free
(
p_procBuf
->
bnProcBufRes
);
free
(
p_procBuf
->
llrRes
);
free
(
p_procBuf
->
llrProcBuf
);
free
(
p_procBuf
);
}
#endif
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
View file @
61532429
...
...
@@ -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/nrLDPC_extern.h
View file @
61532429
...
...
@@ -28,10 +28,10 @@ nrLDPC_decoffloadfunc_t nrLDPC_decoder_offload;
nrLDPC_dectopfunc_t
top_testsuite
;
#else
/* functions to load the LDPC shared lib, implemented in openair1/PHY/CODING/nrLDPC_load.c */
extern
int
load_nrLDPClib
(
char
*
version
)
;
extern
int
load_nrLDPClib_offload
(
void
)
;
extern
int
free_nrLDPClib_offload
(
void
)
;
extern
int
load_nrLDPClib_ref
(
char
*
libversion
,
nrLDPC_encoderfunc_t
*
nrLDPC_encoder_ptr
);
// for ldpctest
int
load_nrLDPClib
(
char
*
version
)
;
int
load_nrLDPClib_offload
(
void
)
;
int
free_nrLDPClib_offload
(
void
)
;
int
load_nrLDPClib_ref
(
char
*
libversion
,
nrLDPC_encoderfunc_t
*
nrLDPC_encoder_ptr
);
// for ldpctest
/* ldpc coder/decoder functions, as loaded by load_nrLDPClib(). */
extern
nrLDPC_initcallfunc_t
nrLDPC_initcall
;
...
...
openair1/PHY/CODING/nrLDPC_load.c
View file @
61532429
...
...
@@ -49,26 +49,23 @@ static loader_shlibfunc_t shlib_fdesc[3];
char
*
arg
[
64
]
=
{
"ldpctest"
,
NULL
};
int
load_nrLDPClib
(
char
*
version
)
{
char
*
ptr
=
(
char
*
)
config_get_if
();
char
libname
[
64
]
=
"ldpc"
;
if
(
ptr
==
NULL
)
{
// phy simulators, config module possibly not loaded
load_configmodule
(
1
,
arg
,
CONFIG_ENABLECMDLINEONLY
)
;
logInit
();
}
shlib_fdesc
[
0
].
fname
=
"nrLDPC_decod"
;
shlib_fdesc
[
1
].
fname
=
"nrLDPC_encod"
;
shlib_fdesc
[
2
].
fname
=
"nrLDPC_initcall"
;
int
ret
;
if
(
version
)
ret
=
load_module_version_shlib
(
libname
,
version
,
shlib_fdesc
,
sizeof
(
shlib_fdesc
)
/
sizeof
(
loader_shlibfunc_t
),
NULL
);
else
ret
=
load_module_shlib
(
libname
,
shlib_fdesc
,
sizeof
(
shlib_fdesc
)
/
sizeof
(
loader_shlibfunc_t
),
NULL
);
AssertFatal
(
(
ret
>=
0
),
"Error loading ldpc decoder"
);
nrLDPC_decoder
=
(
nrLDPC_decoderfunc_t
)
shlib_fdesc
[
0
].
fptr
;
nrLDPC_encoder
=
(
nrLDPC_encoderfunc_t
)
shlib_fdesc
[
1
].
fptr
;
nrLDPC_initcall
=
(
nrLDPC_initcallfunc_t
)
shlib_fdesc
[
2
].
fptr
;
return
0
;
char
*
ptr
=
(
char
*
)
config_get_if
();
char
libname
[
64
]
=
"ldpc"
;
if
(
ptr
==
NULL
)
{
// phy simulators, config module possibly not loaded
load_configmodule
(
1
,
arg
,
CONFIG_ENABLECMDLINEONLY
);
logInit
();
}
shlib_fdesc
[
0
].
fname
=
"nrLDPC_decod"
;
shlib_fdesc
[
1
].
fname
=
"nrLDPC_encod"
;
shlib_fdesc
[
2
].
fname
=
"nrLDPC_initcall"
;
int
ret
;
ret
=
load_module_version_shlib
(
libname
,
version
,
shlib_fdesc
,
sizeofArray
(
shlib_fdesc
),
NULL
);
AssertFatal
((
ret
>=
0
),
"Error loading ldpc decoder"
);
nrLDPC_decoder
=
(
nrLDPC_decoderfunc_t
)
shlib_fdesc
[
0
].
fptr
;
nrLDPC_encoder
=
(
nrLDPC_encoderfunc_t
)
shlib_fdesc
[
1
].
fptr
;
nrLDPC_initcall
=
(
nrLDPC_initcallfunc_t
)
shlib_fdesc
[
2
].
fptr
;
return
0
;
}
int
load_nrLDPClib_offload
(
void
)
{
...
...
openair1/PHY/CODING/nr_rate_matching.c
View file @
61532429
...
...
@@ -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 @
61532429
...
...
@@ -243,20 +243,8 @@ static void nr_processULSegment(void *arg)
////////////////////////////////// pl =====> llrProcBuf //////////////////////////////////
p_decoderParms
->
block_length
=
length_dec
;
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
;
}
}
p_decoderParms
->
crc_type
=
crc_type
;
rdata
->
decodeIterations
=
nrLDPC_decoder
(
p_decoderParms
,
(
int8_t
*
)
pl
,
llrProcBuf
,
p_procTime
,
&
ulsch_harq
->
abort_decode
);
if
(
rdata
->
decodeIterations
<=
p_decoderParms
->
numMaxIter
)
memcpy
(
ulsch_harq
->
c
[
r
],
llrProcBuf
,
Kr
>>
3
);
...
...
@@ -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 @
61532429
...
...
@@ -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 @
61532429
...
...
@@ -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 @
61532429
...
...
@@ -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