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
3b3d2322
Commit
3b3d2322
authored
Mar 11, 2020
by
frtabu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
move ldpc coder/decoder into a shared lib dymically loaded. Also fix a record player bug
parent
6c8938d5
Changes
30
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
30 changed files
with
1347 additions
and
337 deletions
+1347
-337
cmake_targets/CMakeLists.txt
cmake_targets/CMakeLists.txt
+31
-8
common/config/config_userapi.c
common/config/config_userapi.c
+2
-1
common/utils/telnetsrv/telnetsrv.c
common/utils/telnetsrv/telnetsrv.c
+19
-1
openair1/PHY/CODING/TESTBENCH/ldpctest.c
openair1/PHY/CODING/TESTBENCH/ldpctest.c
+13
-9
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
+2
-2
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init.h
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init.h
+1
-1
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
+0
-1
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h
+1
-1
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
+3
-2
openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h
openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h
+1
-1
openair1/PHY/CODING/nrLDPC_defs.h
openair1/PHY/CODING/nrLDPC_defs.h
+59
-0
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encode_parity_check.c
...air1/PHY/CODING/nrLDPC_encoder/ldpc_encode_parity_check.c
+201
-0
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c
+208
-38
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c
+146
-0
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c
+225
-0
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
...1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
+238
-0
openair1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c
...ir1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c
+37
-205
openair1/PHY/CODING/nrLDPC_extern.h
openair1/PHY/CODING/nrLDPC_extern.h
+14
-25
openair1/PHY/CODING/nrLDPC_load.c
openair1/PHY/CODING/nrLDPC_load.c
+76
-0
openair1/PHY/INIT/nr_init.c
openair1/PHY/INIT/nr_init.c
+2
-0
openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+5
-4
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+1
-2
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+1
-2
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
+5
-2
openair1/PHY/defs_gNB.h
openair1/PHY/defs_gNB.h
+1
-1
targets/ARCH/COMMON/common_lib.c
targets/ARCH/COMMON/common_lib.c
+21
-14
targets/ARCH/COMMON/common_lib.h
targets/ARCH/COMMON/common_lib.h
+18
-0
targets/ARCH/COMMON/record_player.h
targets/ARCH/COMMON/record_player.h
+1
-14
targets/ARCH/iqplayer/iqplayer_lib.c
targets/ARCH/iqplayer/iqplayer_lib.c
+12
-2
targets/RT/USER/lte-ru.c
targets/RT/USER/lte-ru.c
+3
-1
No files found.
cmake_targets/CMakeLists.txt
View file @
3b3d2322
...
...
@@ -1298,14 +1298,35 @@ set(PHY_SMALLBLOCKSRC
set
(
PHY_TURBOIF
${
OPENAIR1_DIR
}
/PHY/CODING/coding_load.c
)
set
(
PHY_LDPCSRC
set
(
PHY_LDPC_ORIG_SRC
${
OPENAIR1_DIR
}
/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c
)
set
(
PHY_LDPC_OPTIM_SRC
${
OPENAIR1_DIR
}
/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c
)
set
(
PHY_LDPC_OPTIM8SEG_SRC
${
OPENAIR1_DIR
}
/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c
)
set
(
PHY_LDPC_OPTIM8SEGMULTI_SRC
${
OPENAIR1_DIR
}
/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
${
OPENAIR1_DIR
}
/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
)
set
(
PHY_NR_CODINGIF
${
OPENAIR1_DIR
}
/PHY/CODING/nrLDPC_load.c;
)
add_library
(
ldpc_orig MODULE
${
PHY_LDPC_ORIG_SRC
}
)
add_library
(
ldpc_optim MODULE
${
PHY_LDPC_OPTIM_SRC
}
)
add_library
(
ldpc_optim8seg MODULE
${
PHY_LDPC_OPTIM8SEG_SRC
}
)
add_library
(
ldpc MODULE
${
PHY_LDPC_OPTIM8SEGMULTI_SRC
}
)
add_library
(
coding MODULE
${
PHY_TURBOSRC
}
)
set
(
PHY_SRC_COMMON
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/dci_tools_common.c
${
OPENAIR1_DIR
}
/PHY/LTE_TRANSPORT/lte_mcs.c
...
...
@@ -1484,10 +1505,9 @@ set(PHY_SRC_UE
${
OPENAIR1_DIR
}
/PHY/TOOLS/lut.c
${
PHY_POLARSRC
}
${
PHY_SMALLBLOCKSRC
}
${
PHY_
LDPCSRC
}
${
PHY_
NR_CODINGIF
}
${
OPENAIR1_DIR
}
/PHY/NR_TRANSPORT/pucch_rx.c
)
set
(
PHY_NR_UE_SRC
${
OPENAIR1_DIR
}
/PHY/INIT/nr_parms.c
${
OPENAIR1_DIR
}
/PHY/MODULATION/nr_modulation.c
...
...
@@ -1535,7 +1555,7 @@ set(PHY_SRC_UE
# ${OPENAIR1_DIR}/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c
${
PHY_POLARSRC
}
${
PHY_SMALLBLOCKSRC
}
${
PHY_
LDPCSRC
}
${
PHY_
NR_CODINGIF
}
)
...
...
@@ -2588,7 +2608,7 @@ target_link_libraries (nr-softmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LI
target_link_libraries
(
nr-softmodem
${
LIB_LMS_LIBRARIES
}
)
target_link_libraries
(
nr-softmodem
${
T_LIB
}
)
add_dependencies
(
nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc
)
# nr-uesoftmodem is UE implementation
#######################################
...
...
@@ -2629,7 +2649,7 @@ target_link_libraries (nr-uesoftmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_
target_link_libraries
(
nr-uesoftmodem
${
LIB_LMS_LIBRARIES
}
)
target_link_libraries
(
nr-uesoftmodem
${
T_LIB
}
)
add_dependencies
(
nr-uesoftmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc
)
# USIM process
#################
...
...
@@ -2696,10 +2716,13 @@ target_link_libraries(smallblocktest
)
add_executable
(
ldpctest
${
PHY_NR_CODINGIF
}
${
OPENAIR1_DIR
}
/PHY/CODING/TESTBENCH/ldpctest.c
${
T_SOURCE
}
${
SHLIB_LOADER_SOURCES
}
)
add_dependencies
(
ldpctest ldpc_orig ldpc_optim ldpc_optim8seg ldpc
)
target_link_libraries
(
ldpctest
-Wl,--start-group UTIL SIMU PHY_NR CONFIG_LIB -Wl,--end-group
m pthread
${
ATLAS_LIBRARIES
}
dl
...
...
common/config/config_userapi.c
View file @
3b3d2322
...
...
@@ -45,7 +45,8 @@
configmodule_interface_t
*
config_get_if
(
void
)
{
if
(
cfgptr
==
NULL
)
{
CONFIG_PRINTF_ERROR
(
"[CONFIG] %s %d config module not initialized
\n
"
,
__FILE__
,
__LINE__
);
if
(
isLogInitDone
())
LOG_W
(
ENB_APP
,
"[CONFIG] %s %d config module not initialized
\n
"
,
__FILE__
,
__LINE__
);
}
return
cfgptr
;
...
...
common/utils/telnetsrv/telnetsrv.c
View file @
3b3d2322
...
...
@@ -377,6 +377,14 @@ int setgetvar(int moduleindex,char getorset,char *params) {
client_printf
(
"%hi
\n
"
,
*
(
short
*
)(
telnetparams
.
CmdParsers
[
moduleindex
].
var
[
i
].
varvalptr
));
break
;
case
TELNET_VARTYPE_INT8
:
client_printf
(
"%i
\n
"
,(
int
)(
*
(
int8_t
*
)(
telnetparams
.
CmdParsers
[
moduleindex
].
var
[
i
].
varvalptr
)));
break
;
case
TELNET_VARTYPE_UINT
:
client_printf
(
"%u
\n
"
,
*
(
unsigned
int
*
)(
telnetparams
.
CmdParsers
[
moduleindex
].
var
[
i
].
varvalptr
));
break
;
case
TELNET_VARTYPE_DOUBLE
:
client_printf
(
"%g
\n
"
,
*
(
double
*
)(
telnetparams
.
CmdParsers
[
moduleindex
].
var
[
i
].
varvalptr
));
break
;
...
...
@@ -405,7 +413,17 @@ int setgetvar(int moduleindex,char getorset,char *params) {
*
(
short
*
)(
telnetparams
.
CmdParsers
[
moduleindex
].
var
[
i
].
varvalptr
)
=
(
short
)
strtol
(
varval
,
NULL
,
0
);
client_printf
(
"%hi
\n
"
,
*
(
short
*
)(
telnetparams
.
CmdParsers
[
moduleindex
].
var
[
i
].
varvalptr
));
break
;
case
TELNET_VARTYPE_INT8
:
*
(
char
*
)(
telnetparams
.
CmdParsers
[
moduleindex
].
var
[
i
].
varvalptr
)
=
(
char
)
strtol
(
varval
,
NULL
,
0
);
client_printf
(
"%i
\n
"
,
*
(
int
*
)(
telnetparams
.
CmdParsers
[
moduleindex
].
var
[
i
].
varvalptr
));
break
;
case
TELNET_VARTYPE_UINT
:
*
(
unsigned
int
*
)(
telnetparams
.
CmdParsers
[
moduleindex
].
var
[
i
].
varvalptr
)
=
(
unsigned
int
)
strtol
(
varval
,
NULL
,
0
);
client_printf
(
"%u
\n
"
,
*
(
unsigned
int
*
)(
telnetparams
.
CmdParsers
[
moduleindex
].
var
[
i
].
varvalptr
));
break
;
case
TELNET_VARTYPE_DOUBLE
:
*
(
double
*
)(
telnetparams
.
CmdParsers
[
moduleindex
].
var
[
i
].
varvalptr
)
=
strtod
(
varval
,
NULL
);
client_printf
(
"%g
\n
"
,
*
(
double
*
)(
telnetparams
.
CmdParsers
[
moduleindex
].
var
[
i
].
varvalptr
));
...
...
openair1/PHY/CODING/TESTBENCH/ldpctest.c
View file @
3b3d2322
...
...
@@ -25,8 +25,7 @@
#include <string.h>
#include "assertions.h"
#include "SIMULATION/TOOLS/sim.h"
#include "PHY/CODING/nrLDPC_encoder/defs.h"
#include "PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.h"
#include "PHY/CODING/nrLDPC_extern.h"
#include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h"
#define MAX_NUM_DLSCH_SEGMENTS 16
...
...
@@ -85,6 +84,7 @@ typedef struct {
RAN_CONTEXT_t
RC
;
PHY_VARS_UE
***
PHY_vars_UE_g
;
uint16_t
NB_UE_INST
=
1
;
nrLDPC_encoderfunc_t
encoder_orig
;
short
lift_size
[
51
]
=
{
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
,
11
,
12
,
13
,
14
,
15
,
16
,
18
,
20
,
22
,
24
,
26
,
28
,
30
,
32
,
36
,
40
,
44
,
48
,
52
,
56
,
60
,
64
,
72
,
80
,
88
,
96
,
104
,
112
,
120
,
128
,
144
,
160
,
176
,
192
,
208
,
224
,
240
,
256
,
288
,
320
,
352
,
384
};
...
...
@@ -286,16 +286,19 @@ int test_ldpc(short No_iteration,
no_punctured_columns
=
(
int
)((
nrows
-
2
)
*
Zc
+
block_length
-
block_length
*
(
1
/
((
float
)
nom_rate
/
(
float
)
denom_rate
)))
/
Zc
;
// printf("puncture:%d\n",no_punctured_columns);
removed_bit
=
(
nrows
-
no_punctured_columns
-
2
)
*
Zc
+
block_length
-
(
int
)(
block_length
/
((
float
)
nom_rate
/
(
float
)
denom_rate
));
encoder_implemparams_t
impp
=
INIT0_LDPCIMPLEMPARAMS
;
impp
.
gen_code
=
1
;
if
(
ntrials
==
0
)
ldpc_encoder_orig
(
test_input
[
0
],
channel_input
[
0
],
Zc
,
BG
,
block_length
,
BG
,
1
);
encoder_orig
(
test_input
,
channel_input
,
Zc
,
BG
,
block_length
,
BG
,
&
impp
);
impp
.
gen_code
=
0
;
for
(
trial
=
0
;
trial
<
ntrials
;
trial
++
)
{
segment_bler
=
0
;
//// encoder
start_meas
(
&
time
);
for
(
j
=
0
;
j
<
n_segments
;
j
++
)
{
ldpc_encoder_orig
(
test_input
[
j
],
channel_input
[
j
],
Zc
,
Kb
,
block_length
,
BG
,
0
);
encoder_orig
(
&
(
test_input
[
j
]),
&
(
channel_input
[
j
]),
Zc
,
Kb
,
block_length
,
BG
,
&
impp
);
}
stop_meas
(
&
time
);
...
...
@@ -305,10 +308,11 @@ int test_ldpc(short No_iteration,
ldpc_encoder_optim(test_input[j],channel_input_optim[j],Zc,Kb,block_length,BG,&tinput,&tprep,&tparity,&toutput);
}
stop_meas(time_optim);*/
impp
.
n_segments
=
n_segments
;
for
(
j
=
0
;
j
<
(
n_segments
/
8
+
1
);
j
++
)
{
start_meas
(
time_optim
);
ldpc_encoder_optim_8seg_multi
(
test_input
,
channel_input_optim
,
Zc
,
Kb
,
block_length
,
BG
,
n_segments
,
j
,
&
tinput
,
&
tprep
,
&
tparity
,
&
toutput
);
impp
.
macro_num
=
j
;
nrLDPC_encoder
(
test_input
,
channel_input_optim
,
Zc
,
Kb
,
block_length
,
BG
,
&
impp
);
stop_meas
(
time_optim
);
}
...
...
@@ -598,8 +602,8 @@ int main(int argc, char *argv[])
printf
(
"SNR0 %f:
\n
"
,
SNR0
);
load_nrLDPClib
();
load_nrLDPClib_ref
(
"_orig"
,
&
encoder_orig
);
//for (block_length=8;block_length<=MAX_BLOCK_LENGTH;block_length+=8)
...
...
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
View file @
3b3d2322
...
...
@@ -31,7 +31,7 @@
#include <stdint.h>
#include <immintrin.h>
#include "nrLDPC_defs.h"
#include "nrLDPC
decoder
_defs.h"
#include "nrLDPC_types.h"
#include "nrLDPC_init.h"
#include "nrLDPC_mPass.h"
...
...
@@ -47,7 +47,7 @@
static
inline
uint32_t
nrLDPC_decoder_core
(
int8_t
*
p_llr
,
int8_t
*
p_out
,
t_nrLDPC_procBuf
*
p_procBuf
,
uint32_t
numLLR
,
t_nrLDPC_lut
*
p_lut
,
t_nrLDPC_dec_params
*
p_decParams
,
t_nrLDPC_time_stats
*
p_profiler
);
int32_t
nrLDPC_decod
er
(
t_nrLDPC_dec_params
*
p_decParams
,
int8_t
*
p_llr
,
int8_t
*
p_out
,
t_nrLDPC_procBuf
*
p_procBuf
,
t_nrLDPC_time_stats
*
p_profiler
)
int32_t
nrLDPC_decod
(
t_nrLDPC_dec_params
*
p_decParams
,
int8_t
*
p_llr
,
int8_t
*
p_out
,
t_nrLDPC_procBuf
*
p_procBuf
,
t_nrLDPC_time_stats
*
p_profiler
)
{
uint32_t
numLLR
;
uint32_t
numIter
=
0
;
...
...
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init.h
View file @
3b3d2322
...
...
@@ -32,7 +32,7 @@
#define __NR_LDPC_INIT__H__
#include "nrLDPC_lut.h"
#include "nrLDPC_defs.h"
#include "nrLDPC
decoder
_defs.h"
/**
\brief Initializes the decoder and sets correct LUTs
...
...
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
View file @
3b3d2322
...
...
@@ -32,7 +32,6 @@
#define __NR_LDPC_INIT_MEM__H__
#include <stdlib.h>
#include "nrLDPC_defs.h"
#include "nrLDPC_types.h"
#ifndef malloc32_clear
...
...
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h
View file @
3b3d2322
...
...
@@ -32,7 +32,7 @@
#define __NR_LDPC_MPASS__H__
#include <string.h>
#include "nrLDPC_defs.h"
#include "nrLDPC
decoder
_defs.h"
/**
\brief Circular memcpy
...
...
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
View file @
3b3d2322
...
...
@@ -32,8 +32,7 @@
#define __NR_LDPC_TYPES__H__
#include "PHY/TOOLS/time_meas.h"
#include "nrLDPC_defs.h"
#include "nrLDPCdecoder_defs.h"
// ==============================================================================
// TYPES
...
...
@@ -103,4 +102,6 @@ typedef struct nrLDPC_procBuf {
int8_t
*
llrProcBuf
;
/**< LLR processing buffer */
}
t_nrLDPC_procBuf
;
#endif
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_defs.h
→
openair1/PHY/CODING/nrLDPC_decoder/nrLDPC
decoder
_defs.h
View file @
3b3d2322
...
...
@@ -19,7 +19,7 @@
* contact@openairinterface.org
*/
/*!\file nrLDPC_defs.h
/*!\file nrLDPC
decoder
_defs.h
* \brief Defines all constants and buffers for the LDPC decoder
* \author Sebastian Wagner (TCL Communications) Email: <mailto:sebastian.wagner@tcl.com>
* \date 27-03-2018
...
...
openair1/PHY/CODING/nrLDPC_defs.h
0 → 100644
View file @
3b3d2322
/*
* 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
*/
//============================================================================================================================
// encoder interface
#ifndef __NRLDPC_DEFS__H__
#define __NRLDPC_DEFS__H__
#include "openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h"
/**
\brief LDPC encoder
\param 1 input
\param 2 channel_input
\param 3 int Zc
\param 4 int Kb
\param 5 short block_length
\param 6 short BG
\param 7 int n_segment
\param 8 unsigned int macro_num
\param 9-12 time_stats_t *tinput,*tprep, *tparity,*toutput
*/
typedef
struct
{
int
n_segments
;
// optim8seg
unsigned
int
macro_num
;
// optim8segmulti
unsigned
char
gen_code
;
//orig
time_stats_t
*
tinput
;
time_stats_t
*
tprep
;
time_stats_t
*
tparity
;
time_stats_t
*
toutput
;
}
encoder_implemparams_t
;
#define INIT0_LDPCIMPLEMPARAMS {0,0,0,NULL,NULL,NULL,NULL}
typedef
int
(
*
nrLDPC_encoderfunc_t
)(
unsigned
char
**
,
unsigned
char
**
,
int
,
int
,
short
,
short
,
encoder_implemparams_t
*
);
//============================================================================================================================
// decoder interface
/**
\brief LDPC decoder API type definition
\param p_decParams LDPC decoder parameters
\param p_llr Input LLRs
\param p_llrOut Output vector
\param p_profiler LDPC profiler statistics
*/
typedef
int32_t
(
*
nrLDPC_decoderfunc_t
)(
t_nrLDPC_dec_params
*
,
int8_t
*
,
int8_t
*
,
t_nrLDPC_procBuf
*
,
t_nrLDPC_time_stats
*
);
#endif
\ No newline at end of file
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encode_parity_check.c
0 → 100644
View file @
3b3d2322
/*
* 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 ldpc_encode_parity_check.c
* \brief Parity check function used by ldpc encoders
* \author Florian Kaltenberger, Raymond Knopp, Kien le Trung (Eurecom)
* \email openair_tech@eurecom.fr
* \date 27-03-2018
* \version 1.0
* \note
* \warning
*/
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <types.h>
#include "assertions.h"
#include "common/utils/LOG/log.h"
//#define DEBUG_LDPC
#include "ldpc384_byte.c"
#include "ldpc352_byte.c"
#include "ldpc320_byte.c"
#include "ldpc288_byte.c"
#include "ldpc256_byte.c"
#include "ldpc240_byte.c"
#include "ldpc224_byte.c"
#include "ldpc208_byte.c"
#include "ldpc192_byte.c"
#include "ldpc176_byte.c"
#include "ldpc_BG2_Zc384_byte.c"
#include "ldpc_BG2_Zc352_byte.c"
#include "ldpc_BG2_Zc320_byte.c"
#include "ldpc_BG2_Zc288_byte.c"
#include "ldpc_BG2_Zc256_byte.c"
#include "ldpc_BG2_Zc240_byte.c"
#include "ldpc_BG2_Zc224_byte.c"
#include "ldpc_BG2_Zc208_byte.c"
#include "ldpc_BG2_Zc192_byte.c"
#include "ldpc_BG2_Zc176_byte.c"
#include "ldpc_BG2_Zc160_byte.c"
#include "ldpc_BG2_Zc144_byte.c"
#include "ldpc_BG2_Zc128_byte.c"
#include "ldpc_BG2_Zc120_byte.c"
#include "ldpc_BG2_Zc112_byte.c"
#include "ldpc_BG2_Zc104_byte.c"
#include "ldpc_BG2_Zc96_byte.c"
#include "ldpc_BG2_Zc88_byte.c"
#include "ldpc_BG2_Zc80_byte.c"
#include "ldpc_BG2_Zc72_byte.c"
static
inline
void
encode_parity_check_part_optim
(
uint8_t
*
c
,
uint8_t
*
d
,
short
BG
,
short
Zc
,
short
Kb
)
{
if
(
BG
==
1
)
{
switch
(
Zc
)
{
case
2
:
break
;
case
3
:
break
;
case
4
:
break
;
case
5
:
break
;
case
6
:
break
;
case
7
:
break
;
case
8
:
break
;
case
9
:
break
;
case
10
:
break
;
case
11
:
break
;
case
12
:
break
;
case
13
:
break
;
case
14
:
break
;
case
15
:
break
;
case
16
:
break
;
case
18
:
break
;
case
20
:
break
;
case
22
:
break
;
case
24
:
break
;
case
26
:
break
;
case
28
:
break
;
case
30
:
break
;
case
32
:
break
;
case
36
:
break
;
case
40
:
break
;
case
44
:
break
;
case
48
:
break
;
case
52
:
break
;
case
56
:
break
;
case
60
:
break
;
case
64
:
break
;
case
72
:
break
;
case
80
:
break
;
case
88
:
break
;
case
96
:
break
;
case
104
:
break
;
case
112
:
break
;
case
120
:
break
;
case
128
:
break
;
case
144
:
break
;
case
160
:
break
;
case
176
:
ldpc176_byte
(
c
,
d
);
break
;
case
192
:
ldpc192_byte
(
c
,
d
);
break
;
case
208
:
ldpc208_byte
(
c
,
d
);
break
;
case
224
:
ldpc224_byte
(
c
,
d
);
break
;
case
240
:
ldpc240_byte
(
c
,
d
);
break
;
case
256
:
ldpc256_byte
(
c
,
d
);
break
;
case
288
:
ldpc288_byte
(
c
,
d
);
break
;
case
320
:
ldpc320_byte
(
c
,
d
);
break
;
case
352
:
ldpc352_byte
(
c
,
d
);
break
;
case
384
:
ldpc384_byte
(
c
,
d
);
break
;
default:
AssertFatal
(
0
,
"BG %d Zc %d is not supported yet
\n
"
,
BG
,
Zc
);
break
;
}
}
else
if
(
BG
==
2
)
{
switch
(
Zc
)
{
case
2
:
break
;
case
3
:
break
;
case
4
:
break
;
case
5
:
break
;
case
6
:
break
;
case
7
:
break
;
case
8
:
break
;
case
9
:
break
;
case
10
:
break
;
case
11
:
break
;
case
12
:
break
;
case
13
:
break
;
case
14
:
break
;
case
15
:
break
;
case
16
:
break
;
case
18
:
break
;
case
20
:
break
;
case
22
:
break
;
case
24
:
break
;
case
26
:
break
;
case
28
:
break
;
case
30
:
break
;
case
32
:
break
;
case
36
:
break
;
case
40
:
break
;
case
44
:
break
;
case
48
:
break
;
case
52
:
break
;
case
56
:
break
;
case
60
:
break
;
case
64
:
break
;
case
72
:
ldpc_BG2_Zc72_byte
(
c
,
d
);
break
;
case
80
:
ldpc_BG2_Zc80_byte
(
c
,
d
);
break
;
case
88
:
ldpc_BG2_Zc88_byte
(
c
,
d
);
break
;
case
96
:
ldpc_BG2_Zc96_byte
(
c
,
d
);
break
;
case
104
:
ldpc_BG2_Zc104_byte
(
c
,
d
);
break
;
case
112
:
ldpc_BG2_Zc112_byte
(
c
,
d
);
break
;
case
120
:
ldpc_BG2_Zc120_byte
(
c
,
d
);
break
;
case
128
:
ldpc_BG2_Zc128_byte
(
c
,
d
);
break
;
case
144
:
ldpc_BG2_Zc144_byte
(
c
,
d
);
break
;
case
160
:
ldpc_BG2_Zc160_byte
(
c
,
d
);
break
;
case
176
:
ldpc_BG2_Zc176_byte
(
c
,
d
);
break
;
case
192
:
ldpc_BG2_Zc192_byte
(
c
,
d
);
break
;
case
208
:
ldpc_BG2_Zc208_byte
(
c
,
d
);
break
;
case
224
:
ldpc_BG2_Zc224_byte
(
c
,
d
);
break
;
case
240
:
ldpc_BG2_Zc240_byte
(
c
,
d
);
break
;
case
256
:
ldpc_BG2_Zc256_byte
(
c
,
d
);
break
;
case
288
:
ldpc_BG2_Zc288_byte
(
c
,
d
);
break
;
case
320
:
ldpc_BG2_Zc320_byte
(
c
,
d
);
break
;
case
352
:
ldpc_BG2_Zc352_byte
(
c
,
d
);
break
;
case
384
:
ldpc_BG2_Zc384_byte
(
c
,
d
);
break
;
default:
AssertFatal
(
0
,
"BG %d Zc %d is not supported yet
\n
"
,
BG
,
Zc
);
break
;
}
}
else
{
AssertFatal
(
0
,
"BG %d is not supported yet
\n
"
,
BG
);
}
}
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c
View file @
3b3d2322
...
...
@@ -37,77 +37,247 @@
#include <string.h>
#include <types.h>
#include "defs.h"
#include "assertions.h"
#include "openair1/PHY/CODING/nrLDPC_defs.h"
#include "ldpc_generate_coefficient.c"
short
*
choose_generator_matrix
(
short
BG
,
short
Zc
);
extern
short
no_shift_values_BG1
[
1012
],
pointer_shift_values_BG1
[
1012
],
no_shift_values_BG2
[
2109
],
pointer_shift_values_BG2
[
2019
];
int
encode_parity_check_part_orig
(
unsigned
char
*
c
,
unsigned
char
*
d
,
short
BG
,
short
Zc
,
short
Kb
,
short
block_length
)
int
ldpc_encoder_orig
(
unsigned
char
*
test_input
,
unsigned
char
*
channel_input
,
int
Zc
,
int
Kb
,
short
block_length
,
short
BG
,
unsigned
char
gen_code
)
{
short
*
Gen_shift_values
=
choose_generator_matrix
(
BG
,
Zc
);
short
*
no_shift_values
,
*
pointer_shift_values
;
int
no_punctured_columns
;
short
nrows
,
ncols
,
rate
=
3
;
int
i1
,
i2
,
i3
,
i4
,
i5
,
temp_prime
;
unsigned
char
c
[
22
*
384
];
//padded input, unpacked, max size
unsigned
char
d
[
68
*
384
];
//coded output, unpacked, max size
unsigned
char
channel_temp
,
temp
;
short
*
Gen_shift_values
,
*
no_shift_values
,
*
pointer_shift_values
;
short
nrows
=
46
;
//parity check bits
short
ncols
=
22
;
//info bits
int
i
,
i1
,
i2
,
i3
,
i4
,
i5
,
temp_prime
,
var
;
int
no_punctured_columns
,
removed_bit
,
rate
=
3
;
int
nind
=
0
;
int
indlist
[
1000
];
int
indlist2
[
1000
];
//determine number of bits in codeword
//if (block_length>3840)
if
(
BG
==
1
)
{
nrows
=
46
;
//parity check bits
ncols
=
22
;
//info bits
rate
=
3
;
}
//else if (block_length<=3840)
else
if
(
BG
==
2
)
{
//BG=2;
nrows
=
42
;
//parity check bits
ncols
=
10
;
// info bits
rate
=
5
;
}
Gen_shift_values
=
choose_generator_matrix
(
BG
,
Zc
);
if
(
Gen_shift_values
==
NULL
)
{
printf
(
"ldpc_encoder_orig: could not find generator matrix
\n
"
);
return
(
-
1
);
}
//printf("ldpc_encoder_orig: BG %d, Zc %d, Kb %d\n",BG, Zc, Kb);
// load base graph of generator matrix
if
(
BG
==
1
)
{
no_shift_values
=
(
short
*
)
no_shift_values_BG1
;
pointer_shift_values
=
(
short
*
)
pointer_shift_values_BG1
;
nrows
=
46
;
//parity check bits
ncols
=
22
;
//info bits
rate
=
3
;
}
else
if
(
BG
==
2
)
{
no_shift_values
=
(
short
*
)
no_shift_values_BG2
;
pointer_shift_values
=
(
short
*
)
pointer_shift_values_BG2
;
nrows
=
42
;
//parity check bits
ncols
=
10
;
//info bits
rate
=
5
;
}
else
{
printf
(
"problem with BG
\n
"
);
return
(
-
1
);
AssertFatal
(
0
,
"BG %d is not supported yet
\n
"
,
BG
);
}
no_punctured_columns
=
(
int
)((
nrows
-
2
)
*
Zc
+
block_length
-
block_length
*
rate
)
/
Zc
;
removed_bit
=
(
nrows
-
no_punctured_columns
-
2
)
*
Zc
+
block_length
-
(
block_length
*
rate
);
//printf("%d\n",no_punctured_columns);
//printf("%d\n",removed_bit);
// unpack input
memset
(
c
,
0
,
sizeof
(
unsigned
char
)
*
ncols
*
Zc
);
memset
(
d
,
0
,
sizeof
(
unsigned
char
)
*
nrows
*
Zc
);
for
(
i
=
0
;
i
<
block_length
;
i
++
)
{
//c[i] = test_input[i/8]<<(i%8);
//c[i]=c[i]>>7&1;
c
[
i
]
=
(
test_input
[
i
/
8
]
&
(
128
>>
(
i
&
7
)))
>>
(
7
-
(
i
&
7
));
}
//
printf("no_punctured_columns = %d\n",no_punctured_columns);
//
parity check part
for
(
i2
=
0
;
i2
<
Zc
;
i2
++
)
if
(
gen_code
==
1
)
{
//t=Kb*Zc+i2;
char
fname
[
100
];
sprintf
(
fname
,
"ldpc_BG%d_Zc%d_byte.c"
,
BG
,
Zc
);
FILE
*
fd
=
fopen
(
fname
,
"w"
);
AssertFatal
(
fd
!=
NULL
,
"cannot open %s
\n
"
,
fname
);
sprintf
(
fname
,
"ldpc_BG%d_Zc%d_16bit.c"
,
BG
,
Zc
);
FILE
*
fd2
=
fopen
(
fname
,
"w"
);
AssertFatal
(
fd2
!=
NULL
,
"cannot open %s
\n
"
,
fname
);
//rotate matrix here
for
(
i5
=
0
;
i5
<
Kb
;
i5
++
)
{
temp
=
c
[
i5
*
Zc
];
memmove
(
&
c
[
i5
*
Zc
],
&
c
[
i5
*
Zc
+
1
],
(
Zc
-
1
)
*
sizeof
(
unsigned
char
));
c
[
i5
*
Zc
+
Zc
-
1
]
=
temp
;
int
shift
;
char
data_type
[
100
];
char
xor_command
[
100
];
int
mask
;
fprintf
(
fd
,
"#include
\"
PHY/sse_intrin.h
\"\n
"
);
fprintf
(
fd2
,
"#include
\"
PHY/sse_intrin.h
\"\n
"
);
if
((
Zc
&
31
)
==
0
)
{
shift
=
5
;
// AVX2 - 256-bit SIMD
mask
=
31
;
strcpy
(
data_type
,
"__m256i"
);
strcpy
(
xor_command
,
"_mm256_xor_si256"
);
}
else
if
((
Zc
&
15
)
==
0
)
{
shift
=
4
;
// SSE4 - 128-bit SIMD
mask
=
15
;
strcpy
(
data_type
,
"__m128i"
);
strcpy
(
xor_command
,
"_mm_xor_si128"
);
// calculate each row in base graph
for
(
i1
=
0
;
i1
<
nrows
-
no_punctured_columns
;
i1
++
)
}
else
if
((
Zc
&
7
)
==
0
)
{
shift
=
3
;
// MMX - 64-bit SIMD
mask
=
7
;
strcpy
(
data_type
,
"__m64"
);
strcpy
(
xor_command
,
"_mm_xor_si64"
);
}
else
{
shift
=
0
;
// no SIMD
mask
=
0
;
strcpy
(
data_type
,
"uint8_t"
);
strcpy
(
xor_command
,
"scalar_xor"
);
fprintf
(
fd
,
"#define scalar_xor(a,b) ((a)^(b))
\n
"
);
fprintf
(
fd2
,
"#define scalar_xor(a,b) ((a)^(b))
\n
"
);
}
fprintf
(
fd
,
"// generated code for Zc=%d, byte encoding
\n
"
,
Zc
);
fprintf
(
fd2
,
"// generated code for Zc=%d, 16bit encoding
\n
"
,
Zc
);
fprintf
(
fd
,
"static inline void ldpc_BG%d_Zc%d_byte(uint8_t *c,uint8_t *d) {
\n
"
,
BG
,
Zc
);
fprintf
(
fd2
,
"static inline void ldpc_BG%d_Zc%d_16bit(uint16_t *c,uint16_t *d) {
\n
"
,
BG
,
Zc
);
fprintf
(
fd
,
" %s *csimd=(%s *)c,*dsimd=(%s *)d;
\n\n
"
,
data_type
,
data_type
,
data_type
);
fprintf
(
fd2
,
" %s *csimd=(%s *)c,*dsimd=(%s *)d;
\n\n
"
,
data_type
,
data_type
,
data_type
);
fprintf
(
fd
,
" %s *c2,*d2;
\n\n
"
,
data_type
);
fprintf
(
fd2
,
" %s *c2,*d2;
\n\n
"
,
data_type
);
fprintf
(
fd
,
" int i2;
\n
"
);
fprintf
(
fd2
,
" int i2;
\n
"
);
fprintf
(
fd
,
" for (i2=0; i2<%d; i2++) {
\n
"
,
Zc
>>
shift
);
if
(
shift
>
0
)
fprintf
(
fd2
,
" for (i2=0; i2<%d; i2++) {
\n
"
,
Zc
>>
(
shift
-
1
));
for
(
i2
=
0
;
i2
<
1
;
i2
++
)
{
channel_temp
=
0
;
for
(
i3
=
0
;
i3
<
Kb
;
i3
++
)
//t=Kb*Zc+i2;
// calculate each row in base graph
fprintf
(
fd
,
" c2=&csimd[i2];
\n
"
);
fprintf
(
fd
,
" d2=&dsimd[i2];
\n
"
);
fprintf
(
fd2
,
" c2=&csimd[i2];
\n
"
);
fprintf
(
fd2
,
" d2=&dsimd[i2];
\n
"
);
for
(
i1
=
0
;
i1
<
nrows
;
i1
++
)
{
temp_prime
=
i1
*
ncols
+
i3
;
channel_temp
=
0
;
fprintf
(
fd
,
"
\n
//row: %d
\n
"
,
i1
);
fprintf
(
fd2
,
"
\n
//row: %d
\n
"
,
i1
);
fprintf
(
fd
,
" d2[%d]="
,(
Zc
*
i1
)
>>
shift
);
fprintf
(
fd2
,
" d2[%d]="
,(
Zc
*
i1
)
>>
(
shift
-
1
));
nind
=
0
;
for
(
i
4
=
0
;
i4
<
no_shift_values
[
temp_prime
];
i4
++
)
for
(
i
3
=
0
;
i3
<
ncols
;
i3
++
)
{
channel_temp
=
channel_temp
^
c
[
i3
*
Zc
+
Gen_shift_values
[
pointer_shift_values
[
temp_prime
]
+
i4
]
];
temp_prime
=
i1
*
ncols
+
i3
;
for
(
i4
=
0
;
i4
<
no_shift_values
[
temp_prime
];
i4
++
)
{
var
=
(
int
)((
i3
*
Zc
+
(
Gen_shift_values
[
pointer_shift_values
[
temp_prime
]
+
i4
]
+
1
)
%
Zc
)
/
Zc
);
int
index
=
var
*
2
*
Zc
+
(
i3
*
Zc
+
(
Gen_shift_values
[
pointer_shift_values
[
temp_prime
]
+
i4
]
+
1
)
%
Zc
)
%
Zc
;
indlist
[
nind
]
=
((
index
&
mask
)
*
((
2
*
Zc
)
>>
shift
)
*
Kb
)
+
(
index
>>
shift
);
indlist2
[
nind
++
]
=
((
index
&
(
mask
>>
1
))
*
((
2
*
Zc
)
>>
(
shift
-
1
))
*
Kb
)
+
(
index
>>
(
shift
-
1
));
}
}
for
(
i4
=
0
;
i4
<
nind
-
1
;
i4
++
)
{
fprintf
(
fd
,
"%s(c2[%d],"
,
xor_command
,
indlist
[
i4
]);
fprintf
(
fd2
,
"%s(c2[%d],"
,
xor_command
,
indlist2
[
i4
]);
}
fprintf
(
fd
,
"c2[%d]"
,
indlist
[
i4
]);
fprintf
(
fd2
,
"c2[%d]"
,
indlist2
[
i4
]);
for
(
i4
=
0
;
i4
<
nind
-
1
;
i4
++
)
{
fprintf
(
fd
,
")"
);
fprintf
(
fd2
,
")"
);
}
fprintf
(
fd
,
";
\n
"
);
fprintf
(
fd2
,
";
\n
"
);
}
d
[
i2
+
i1
*
Zc
]
=
channel_temp
;
//channel_input[t+i1*Zc]=channel_temp
;
fprintf
(
fd
,
" }
\n
}
\n
"
)
;
fprintf
(
fd2
,
" }
\n
}
\n
"
)
;
}
fclose
(
fd
);
fclose
(
fd2
);
}
return
(
0
);
}
else
if
(
gen_code
==
0
)
{
for
(
i2
=
0
;
i2
<
Zc
;
i2
++
)
{
//t=Kb*Zc+i2;
//rotate matrix here
for
(
i5
=
0
;
i5
<
Kb
;
i5
++
)
{
temp
=
c
[
i5
*
Zc
];
memmove
(
&
c
[
i5
*
Zc
],
&
c
[
i5
*
Zc
+
1
],
(
Zc
-
1
)
*
sizeof
(
unsigned
char
));
c
[
i5
*
Zc
+
Zc
-
1
]
=
temp
;
}
// calculate each row in base graph
for
(
i1
=
0
;
i1
<
nrows
-
no_punctured_columns
;
i1
++
)
{
channel_temp
=
0
;
for
(
i3
=
0
;
i3
<
Kb
;
i3
++
)
{
temp_prime
=
i1
*
ncols
+
i3
;
for
(
i4
=
0
;
i4
<
no_shift_values
[
temp_prime
];
i4
++
)
{
channel_temp
=
channel_temp
^
c
[
i3
*
Zc
+
Gen_shift_values
[
pointer_shift_values
[
temp_prime
]
+
i4
]
];
}
}
d
[
i2
+
i1
*
Zc
]
=
channel_temp
;
//channel_input[t+i1*Zc]=channel_temp;
}
}
}
// information part and puncture columns
memcpy
(
&
channel_input
[
0
],
&
c
[
2
*
Zc
],
(
block_length
-
2
*
Zc
)
*
sizeof
(
unsigned
char
));
memcpy
(
&
channel_input
[
block_length
-
2
*
Zc
],
&
d
[
0
],
((
nrows
-
no_punctured_columns
)
*
Zc
-
removed_bit
)
*
sizeof
(
unsigned
char
));
//memcpy(channel_input,c,Kb*Zc*sizeof(unsigned char));
return
0
;
}
int
nrLDPC_encod
(
unsigned
char
**
test_input
,
unsigned
char
**
channel_input
,
int
Zc
,
int
Kb
,
short
block_length
,
short
BG
,
encoder_implemparams_t
*
impp
)
{
return
ldpc_encoder_orig
(
test_input
[
0
],
channel_input
[
0
],
Zc
,
Kb
,
block_length
,
BG
,
impp
->
gen_code
);
}
\ No newline at end of file
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c
0 → 100644
View file @
3b3d2322
/*
* 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 ldpc_encoder2.c
* \brief Defines the optimized LDPC encoder
* \author Florian Kaltenberger, Raymond Knopp, Kien le Trung (Eurecom)
* \email openair_tech@eurecom.fr
* \date 27-03-2018
* \version 1.0
* \note
* \warning
*/
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <types.h>
#include "assertions.h"
#include "common/utils/LOG/log.h"
#include "PHY/TOOLS/time_meas.h"
#include "openair1/PHY/CODING/nrLDPC_defs.h"
#include "ldpc_encode_parity_check.c"
#include "ldpc_generate_coefficient.c"
//#define DEBUG_LDPC
int
nrLDPC_encod
(
unsigned
char
**
test_input
,
unsigned
char
**
channel_input
,
int
Zc
,
int
Kb
,
short
block_length
,
short
BG
,
encoder_implemparams_t
*
impp
)
{
short
nrows
=
0
,
ncols
=
0
;
int
i
,
i1
,
rate
=
3
;
int
no_punctured_columns
,
removed_bit
;
int
simd_size
;
//determine number of bits in codeword
//if (block_length>3840)
if
(
BG
==
1
)
{
//BG=1;
nrows
=
46
;
//parity check bits
ncols
=
22
;
//info bits
rate
=
3
;
}
//else if (block_length<=3840)
else
if
(
BG
==
2
)
{
//BG=2;
nrows
=
42
;
//parity check bits
ncols
=
10
;
// info bits
rate
=
5
;
}
#ifdef DEBUG_LDPC
LOG_D
(
PHY
,
"ldpc_encoder_optim_8seg: BG %d, Zc %d, Kb %d, block_length %d
\n
"
,
BG
,
Zc
,
Kb
,
block_length
);
LOG_D
(
PHY
,
"ldpc_encoder_optim_8seg: PDU %x %x %x %x
\n
"
,
test_input
[
0
][
0
],
test_input
[
0
][
1
],
test_input
[
0
][
2
],
test_input
[
0
][
3
]);
#endif
if
((
Zc
&
31
)
>
0
)
simd_size
=
16
;
else
simd_size
=
32
;
unsigned
char
c
[
22
*
Zc
]
__attribute__
((
aligned
(
32
)));
//padded input, unpacked, max size
unsigned
char
d
[
46
*
Zc
]
__attribute__
((
aligned
(
32
)));
//coded parity part output, unpacked, max size
unsigned
char
c_extension
[
2
*
22
*
Zc
*
simd_size
]
__attribute__
((
aligned
(
32
)));
//double size matrix of c
// calculate number of punctured bits
no_punctured_columns
=
(
int
)((
nrows
-
2
)
*
Zc
+
block_length
-
block_length
*
rate
)
/
Zc
;
removed_bit
=
(
nrows
-
no_punctured_columns
-
2
)
*
Zc
+
block_length
-
(
int
)(
block_length
*
rate
);
// printf("%d\n",no_punctured_columns);
// printf("%d\n",removed_bit);
// unpack input
memset
(
c
,
0
,
sizeof
(
unsigned
char
)
*
ncols
*
Zc
);
memset
(
d
,
0
,
sizeof
(
unsigned
char
)
*
nrows
*
Zc
);
if
(
impp
->
tinput
!=
NULL
)
start_meas
(
impp
->
tinput
);
for
(
i
=
0
;
i
<
block_length
;
i
++
)
{
c
[
i
]
=
(
test_input
[
0
][
i
/
8
]
&
(
128
>>
(
i
&
7
)))
>>
(
7
-
(
i
&
7
));
//printf("c(%d,%d)=%d\n",j,i,temp);
}
if
(
impp
->
tinput
!=
NULL
)
stop_meas
(
impp
->
tinput
);
if
((
BG
==
1
&&
Zc
>
176
)
||
(
BG
==
2
&&
Zc
>
64
))
{
// extend matrix
if
(
impp
->
tprep
!=
NULL
)
start_meas
(
impp
->
tprep
);
for
(
i1
=
0
;
i1
<
ncols
;
i1
++
)
{
memcpy
(
&
c_extension
[
2
*
i1
*
Zc
],
&
c
[
i1
*
Zc
],
Zc
*
sizeof
(
unsigned
char
));
memcpy
(
&
c_extension
[(
2
*
i1
+
1
)
*
Zc
],
&
c
[
i1
*
Zc
],
Zc
*
sizeof
(
unsigned
char
));
}
for
(
i1
=
1
;
i1
<
simd_size
;
i1
++
)
{
memcpy
(
&
c_extension
[(
2
*
ncols
*
Zc
*
i1
)],
&
c_extension
[
i1
],
(
2
*
ncols
*
Zc
*
sizeof
(
unsigned
char
))
-
i1
);
// memset(&c_extension[(2*ncols*Zc*i1)],0,i1);
/*
printf("shift %d: ",i1);
for (int j=0;j<64;j++) printf("%d ",c_extension[(2*ncols*Zc*i1)+j]);
printf("\n");
*/
}
if
(
impp
->
tprep
!=
NULL
)
stop_meas
(
impp
->
tprep
);
//parity check part
if
(
impp
->
tparity
!=
NULL
)
start_meas
(
impp
->
tparity
);
encode_parity_check_part_optim
(
c_extension
,
d
,
BG
,
Zc
,
Kb
);
if
(
impp
->
tparity
!=
NULL
)
stop_meas
(
impp
->
tparity
);
}
else
{
if
(
encode_parity_check_part_orig
(
c
,
d
,
BG
,
Zc
,
Kb
,
block_length
)
!=
0
)
{
printf
(
"Problem with encoder
\n
"
);
return
(
-
1
);
}
}
if
(
impp
->
toutput
!=
NULL
)
start_meas
(
impp
->
toutput
);
// information part and puncture columns
memcpy
(
&
channel_input
[
0
][
0
],
&
c
[
2
*
Zc
],
(
block_length
-
2
*
Zc
)
*
sizeof
(
unsigned
char
));
memcpy
(
&
channel_input
[
0
][
block_length
-
2
*
Zc
],
&
d
[
0
],
((
nrows
-
no_punctured_columns
)
*
Zc
-
removed_bit
)
*
sizeof
(
unsigned
char
));
if
(
impp
->
toutput
!=
NULL
)
stop_meas
(
impp
->
toutput
);
return
0
;
}
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c
0 → 100644
View file @
3b3d2322
/*
* 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 ldpc_encoder2.c
* \brief Defines the optimized LDPC encoder
* \author Florian Kaltenberger, Raymond Knopp, Kien le Trung (Eurecom)
* \email openair_tech@eurecom.fr
* \date 27-03-2018
* \version 1.0
* \note
* \warning
*/
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <types.h>
#include "assertions.h"
#include "common/utils/LOG/log.h"
#include "PHY/TOOLS/time_meas.h"
#include "openair1/PHY/CODING/nrLDPC_defs.h"
//#define DEBUG_LDPC
#include "ldpc_encode_parity_check.c"
#include "ldpc_generate_coefficient.c"
int
nrLDPC_encod
(
unsigned
char
**
test_input
,
unsigned
char
**
channel_input
,
int
Zc
,
int
Kb
,
short
block_length
,
short
BG
,
encoder_implemparams_t
*
impp
)
{
short
nrows
=
0
,
ncols
=
0
;
int
i
,
i1
,
j
,
rate
=
3
;
int
no_punctured_columns
,
removed_bit
;
char
temp
;
int
simd_size
;
#ifdef __AVX2__
__m256i
shufmask
=
_mm256_set_epi64x
(
0x0303030303030303
,
0x0202020202020202
,
0x0101010101010101
,
0x0000000000000000
);
__m256i
andmask
=
_mm256_set1_epi64x
(
0x0102040810204080
);
// every 8 bits -> 8 bytes, pattern repeats.
__m256i
zero256
=
_mm256_setzero_si256
();
__m256i
masks
[
8
];
register
__m256i
c256
;
masks
[
0
]
=
_mm256_set1_epi8
(
0x1
);
masks
[
1
]
=
_mm256_set1_epi8
(
0x2
);
masks
[
2
]
=
_mm256_set1_epi8
(
0x4
);
masks
[
3
]
=
_mm256_set1_epi8
(
0x8
);
masks
[
4
]
=
_mm256_set1_epi8
(
0x10
);
masks
[
5
]
=
_mm256_set1_epi8
(
0x20
);
masks
[
6
]
=
_mm256_set1_epi8
(
0x40
);
masks
[
7
]
=
_mm256_set1_epi8
(
0x80
);
#endif
AssertFatal
((
impp
->
n_segments
>
0
&&
impp
->
n_segments
<=
8
),
"0 < n_segments %d <= 8
\n
"
,
impp
->
n_segments
);
//determine number of bits in codeword
//if (block_length>3840)
if
(
BG
==
1
)
{
nrows
=
46
;
//parity check bits
ncols
=
22
;
//info bits
rate
=
3
;
}
//else if (block_length<=3840)
else
if
(
BG
==
2
)
{
//BG=2;
nrows
=
42
;
//parity check bits
ncols
=
10
;
// info bits
rate
=
5
;
}
#ifdef DEBUG_LDPC
LOG_D
(
PHY
,
"ldpc_encoder_optim_8seg: BG %d, Zc %d, Kb %d, block_length %d, segments %d
\n
"
,
BG
,
Zc
,
Kb
,
block_length
,
n_segments
);
LOG_D
(
PHY
,
"ldpc_encoder_optim_8seg: PDU (seg 0) %x %x %x %x
\n
"
,
test_input
[
0
][
0
],
test_input
[
0
][
1
],
test_input
[
0
][
2
],
test_input
[
0
][
3
]);
#endif
AssertFatal
(
Zc
>
0
,
"no valid Zc found for block length %d
\n
"
,
block_length
);
if
((
Zc
&
31
)
>
0
)
simd_size
=
16
;
else
simd_size
=
32
;
unsigned
char
c
[
22
*
Zc
]
__attribute__
((
aligned
(
32
)));
//padded input, unpacked, max size
unsigned
char
d
[
46
*
Zc
]
__attribute__
((
aligned
(
32
)));
//coded parity part output, unpacked, max size
unsigned
char
c_extension
[
2
*
22
*
Zc
*
simd_size
]
__attribute__
((
aligned
(
32
)));
//double size matrix of c
// calculate number of punctured bits
no_punctured_columns
=
(
int
)((
nrows
-
2
)
*
Zc
+
block_length
-
block_length
*
rate
)
/
Zc
;
removed_bit
=
(
nrows
-
no_punctured_columns
-
2
)
*
Zc
+
block_length
-
(
int
)(
block_length
*
rate
);
// printf("%d\n",no_punctured_columns);
// printf("%d\n",removed_bit);
// unpack input
memset
(
c
,
0
,
sizeof
(
unsigned
char
)
*
ncols
*
Zc
);
memset
(
d
,
0
,
sizeof
(
unsigned
char
)
*
nrows
*
Zc
);
if
(
impp
->
tinput
!=
NULL
)
start_meas
(
impp
->
tinput
);
#if 0
for (i=0; i<block_length; i++) {
for (j=0; j<n_segments; j++) {
temp = (test_input[j][i/8]&(128>>(i&7)))>>(7-(i&7));
//printf("c(%d,%d)=%d\n",j,i,temp);
c[i] |= (temp << j);
}
}
#else
#ifdef __AVX2__
for
(
i
=
0
;
i
<
block_length
>>
5
;
i
++
)
{
c256
=
_mm256_and_si256
(
_mm256_cmpeq_epi8
(
_mm256_andnot_si256
(
_mm256_shuffle_epi8
(
_mm256_set1_epi32
(((
uint32_t
*
)
test_input
[
0
])[
i
]),
shufmask
),
andmask
),
zero256
),
masks
[
0
]);
for
(
j
=
1
;
j
<
impp
->
n_segments
;
j
++
)
{
c256
=
_mm256_or_si256
(
_mm256_and_si256
(
_mm256_cmpeq_epi8
(
_mm256_andnot_si256
(
_mm256_shuffle_epi8
(
_mm256_set1_epi32
(((
uint32_t
*
)
test_input
[
j
])[
i
]),
shufmask
),
andmask
),
zero256
),
masks
[
j
]),
c256
);
}
((
__m256i
*
)
c
)[
i
]
=
c256
;
}
for
(
i
=
(
block_length
>>
5
)
<<
5
;
i
<
block_length
;
i
++
)
{
for
(
j
=
0
;
j
<
impp
->
n_segments
;
j
++
)
{
temp
=
(
test_input
[
j
][
i
/
8
]
&
(
128
>>
(
i
&
7
)))
>>
(
7
-
(
i
&
7
));
//printf("c(%d,%d)=%d\n",j,i,temp);
c
[
i
]
|=
(
temp
<<
j
);
}
}
#else
AssertFatal
(
1
==
0
,
"Need AVX2 for this
\n
"
);
#endif
#endif
if
(
impp
->
tinput
!=
NULL
)
stop_meas
(
impp
->
tinput
);
if
((
BG
==
1
&&
Zc
>
176
)
||
(
BG
==
2
&&
Zc
>
64
))
{
// extend matrix
if
(
impp
->
tprep
!=
NULL
)
start_meas
(
impp
->
tprep
);
for
(
i1
=
0
;
i1
<
ncols
;
i1
++
)
{
memcpy
(
&
c_extension
[
2
*
i1
*
Zc
],
&
c
[
i1
*
Zc
],
Zc
*
sizeof
(
unsigned
char
));
memcpy
(
&
c_extension
[(
2
*
i1
+
1
)
*
Zc
],
&
c
[
i1
*
Zc
],
Zc
*
sizeof
(
unsigned
char
));
}
for
(
i1
=
1
;
i1
<
simd_size
;
i1
++
)
{
memcpy
(
&
c_extension
[(
2
*
ncols
*
Zc
*
i1
)],
&
c_extension
[
i1
],
(
2
*
ncols
*
Zc
*
sizeof
(
unsigned
char
))
-
i1
);
// memset(&c_extension[(2*ncols*Zc*i1)],0,i1);
/*
printf("shift %d: ",i1);
for (int j=0;j<64;j++) printf("%d ",c_extension[(2*ncols*Zc*i1)+j]);
printf("\n");
*/
}
if
(
impp
->
tprep
!=
NULL
)
stop_meas
(
impp
->
tprep
);
//parity check part
if
(
impp
->
tparity
!=
NULL
)
start_meas
(
impp
->
tparity
);
encode_parity_check_part_optim
(
c_extension
,
d
,
BG
,
Zc
,
Kb
);
if
(
impp
->
tparity
!=
NULL
)
stop_meas
(
impp
->
tparity
);
}
else
{
if
(
encode_parity_check_part_orig
(
c
,
d
,
BG
,
Zc
,
Kb
,
block_length
)
!=
0
)
{
printf
(
"Problem with encoder
\n
"
);
return
(
-
1
);
}
}
if
(
impp
->
toutput
!=
NULL
)
start_meas
(
impp
->
toutput
);
// information part and puncture columns
/*
memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char));
memcpy(&channel_input[block_length-2*Zc], &d[0], ((nrows-no_punctured_columns) * Zc-removed_bit)*sizeof(unsigned char));
*/
#ifdef __AVX2__
if
((((
2
*
Zc
)
&
31
)
==
0
)
&&
(((
block_length
-
(
2
*
Zc
))
&
31
)
==
0
))
{
//AssertFatal(((2*Zc)&31) == 0,"2*Zc needs to be a multiple of 32 for now\n");
//AssertFatal(((block_length-(2*Zc))&31) == 0,"block_length-(2*Zc) needs to be a multiple of 32 for now\n");
uint32_t
l1
=
(
block_length
-
(
2
*
Zc
))
>>
5
;
uint32_t
l2
=
((
nrows
-
no_punctured_columns
)
*
Zc
-
removed_bit
)
>>
5
;
__m256i
*
c256p
=
(
__m256i
*
)
&
c
[
2
*
Zc
];
__m256i
*
d256p
=
(
__m256i
*
)
&
d
[
0
];
// if (((block_length-(2*Zc))&31)>0) l1++;
for
(
i
=
0
;
i
<
l1
;
i
++
)
for
(
j
=
0
;
j
<
impp
->
n_segments
;
j
++
)
((
__m256i
*
)
channel_input
[
j
])[
i
]
=
_mm256_and_si256
(
_mm256_srai_epi16
(
c256p
[
i
],
j
),
masks
[
0
]);
// if ((((nrows-no_punctured_columns) * Zc-removed_bit)&31)>0) l2++;
for
(
i1
=
0
;
i1
<
l2
;
i1
++
,
i
++
)
for
(
j
=
0
;
j
<
impp
->
n_segments
;
j
++
)
((
__m256i
*
)
channel_input
[
j
])[
i
]
=
_mm256_and_si256
(
_mm256_srai_epi16
(
d256p
[
i1
],
j
),
masks
[
0
]);
}
else
{
#ifdef DEBUG_LDPC
LOG_W
(
PHY
,
"using non-optimized version
\n
"
);
#endif
// do non-SIMD version
for
(
i
=
0
;
i
<
(
block_length
-
2
*
Zc
);
i
++
)
for
(
j
=
0
;
j
<
impp
->
n_segments
;
j
++
)
channel_input
[
j
][
i
]
=
(
c
[
2
*
Zc
+
i
]
>>
j
)
&
1
;
for
(
i
=
0
;
i
<
((
nrows
-
no_punctured_columns
)
*
Zc
-
removed_bit
);
i
++
)
for
(
j
=
0
;
j
<
impp
->
n_segments
;
j
++
)
channel_input
[
j
][
block_length
-
2
*
Zc
+
i
]
=
(
d
[
i
]
>>
j
)
&
1
;
}
#else
AssertFatal
(
1
==
0
,
"Need AVX2 for now
\n
"
);
#endif
if
(
impp
->
toutput
!=
NULL
)
stop_meas
(
impp
->
toutput
);
return
0
;
}
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder
2
.c
→
openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder
_optim8segmulti
.c
View file @
3b3d2322
This diff is collapsed.
Click to expand it.
openair1/PHY/CODING/nrLDPC_encoder/ldpc_generate_coefficient.c
View file @
3b3d2322
...
...
@@ -35,9 +35,8 @@
#include <string.h>
#include "Gen_shift_value.h"
#include "assertions.h"
#include "defs.h"
short
*
choose_generator_matrix
(
short
BG
,
short
Zc
)
s
tatic
inline
s
hort
*
choose_generator_matrix
(
short
BG
,
short
Zc
)
{
short
*
Gen_shift_values
=
NULL
;
...
...
@@ -361,237 +360,70 @@ short *choose_generator_matrix(short BG,short Zc)
return
Gen_shift_values
;
}
int
ldpc_encoder_orig
(
unsigned
char
*
test_input
,
unsigned
char
*
channel_input
,
int
Zc
,
int
Kb
,
short
block_length
,
short
BG
,
unsigned
char
gen_code
)
static
inline
int
encode_parity_check_part_orig
(
unsigned
char
*
c
,
unsigned
char
*
d
,
short
BG
,
short
Zc
,
short
Kb
,
short
block_length
)
{
unsigned
char
c
[
22
*
384
];
//padded input, unpacked, max size
unsigned
char
d
[
68
*
384
];
//coded output, unpacked, max size
short
*
Gen_shift_values
=
choose_generator_matrix
(
BG
,
Zc
);
short
*
no_shift_values
,
*
pointer_shift_values
;
int
no_punctured_columns
;
short
nrows
,
ncols
,
rate
=
3
;
int
i1
,
i2
,
i3
,
i4
,
i5
,
temp_prime
;
unsigned
char
channel_temp
,
temp
;
short
*
Gen_shift_values
,
*
no_shift_values
,
*
pointer_shift_values
;
short
nrows
=
46
;
//parity check bits
short
ncols
=
22
;
//info bits
int
i
,
i1
,
i2
,
i3
,
i4
,
i5
,
temp_prime
,
var
;
int
no_punctured_columns
,
removed_bit
,
rate
=
3
;
int
nind
=
0
;
int
indlist
[
1000
];
int
indlist2
[
1000
];
//determine number of bits in codeword
//if (block_length>3840)
if
(
BG
==
1
)
{
nrows
=
46
;
//parity check bits
ncols
=
22
;
//info bits
rate
=
3
;
}
//else if (block_length<=3840)
else
if
(
BG
==
2
)
{
//BG=2;
nrows
=
42
;
//parity check bits
ncols
=
10
;
// info bits
rate
=
5
;
}
Gen_shift_values
=
choose_generator_matrix
(
BG
,
Zc
);
if
(
Gen_shift_values
==
NULL
)
{
printf
(
"ldpc_encoder_orig: could not find generator matrix
\n
"
);
return
(
-
1
);
}
//printf("ldpc_encoder_orig: BG %d, Zc %d, Kb %d\n",BG, Zc, Kb);
// load base graph of generator matrix
if
(
BG
==
1
)
{
no_shift_values
=
(
short
*
)
no_shift_values_BG1
;
pointer_shift_values
=
(
short
*
)
pointer_shift_values_BG1
;
nrows
=
46
;
//parity check bits
ncols
=
22
;
//info bits
rate
=
3
;
}
else
if
(
BG
==
2
)
{
no_shift_values
=
(
short
*
)
no_shift_values_BG2
;
pointer_shift_values
=
(
short
*
)
pointer_shift_values_BG2
;
nrows
=
42
;
//parity check bits
ncols
=
10
;
//info bits
rate
=
5
;
}
else
{
AssertFatal
(
0
,
"BG %d is not supported yet
\n
"
,
BG
);
}
no_punctured_columns
=
(
int
)((
nrows
-
2
)
*
Zc
+
block_length
-
block_length
*
rate
)
/
Zc
;
removed_bit
=
(
nrows
-
no_punctured_columns
-
2
)
*
Zc
+
block_length
-
(
block_length
*
rate
);
//printf("%d\n",no_punctured_columns);
//printf("%d\n",removed_bit);
// unpack input
memset
(
c
,
0
,
sizeof
(
unsigned
char
)
*
ncols
*
Zc
);
memset
(
d
,
0
,
sizeof
(
unsigned
char
)
*
nrows
*
Zc
);
for
(
i
=
0
;
i
<
block_length
;
i
++
)
{
//c[i] = test_input[i/8]<<(i%8);
//c[i]=c[i]>>7&1;
c
[
i
]
=
(
test_input
[
i
/
8
]
&
(
128
>>
(
i
&
7
)))
>>
(
7
-
(
i
&
7
));
printf
(
"problem with BG
\n
"
);
return
(
-
1
);
}
// parity check part
if
(
gen_code
==
1
)
{
char
fname
[
100
];
sprintf
(
fname
,
"ldpc_BG%d_Zc%d_byte.c"
,
BG
,
Zc
);
FILE
*
fd
=
fopen
(
fname
,
"w"
);
AssertFatal
(
fd
!=
NULL
,
"cannot open %s
\n
"
,
fname
);
sprintf
(
fname
,
"ldpc_BG%d_Zc%d_16bit.c"
,
BG
,
Zc
);
FILE
*
fd2
=
fopen
(
fname
,
"w"
);
AssertFatal
(
fd2
!=
NULL
,
"cannot open %s
\n
"
,
fname
);
int
shift
;
char
data_type
[
100
];
char
xor_command
[
100
];
int
mask
;
no_punctured_columns
=
(
int
)((
nrows
-
2
)
*
Zc
+
block_length
-
block_length
*
rate
)
/
Zc
;
fprintf
(
fd
,
"#include
\"
PHY/sse_intrin.h
\"\n
"
);
fprintf
(
fd2
,
"#include
\"
PHY/sse_intrin.h
\"\n
"
);
//printf("no_punctured_columns = %d\n",no_punctured_columns);
if
((
Zc
&
31
)
==
0
)
{
shift
=
5
;
// AVX2 - 256-bit SIMD
mask
=
31
;
strcpy
(
data_type
,
"__m256i"
);
strcpy
(
xor_command
,
"_mm256_xor_si256"
);
}
else
if
((
Zc
&
15
)
==
0
)
{
shift
=
4
;
// SSE4 - 128-bit SIMD
mask
=
15
;
strcpy
(
data_type
,
"__m128i"
);
strcpy
(
xor_command
,
"_mm_xor_si128"
);
for
(
i2
=
0
;
i2
<
Zc
;
i2
++
)
{
//t=Kb*Zc+i2;
}
else
if
((
Zc
&
7
)
==
0
)
{
shift
=
3
;
// MMX - 64-bit SIMD
mask
=
7
;
strcpy
(
data_type
,
"__m64"
);
strcpy
(
xor_command
,
"_mm_xor_si64"
);
}
else
{
shift
=
0
;
// no SIMD
mask
=
0
;
strcpy
(
data_type
,
"uint8_t"
);
strcpy
(
xor_command
,
"scalar_xor"
);
fprintf
(
fd
,
"#define scalar_xor(a,b) ((a)^(b))
\n
"
);
fprintf
(
fd2
,
"#define scalar_xor(a,b) ((a)^(b))
\n
"
);
}
fprintf
(
fd
,
"// generated code for Zc=%d, byte encoding
\n
"
,
Zc
);
fprintf
(
fd2
,
"// generated code for Zc=%d, 16bit encoding
\n
"
,
Zc
);
fprintf
(
fd
,
"static inline void ldpc_BG%d_Zc%d_byte(uint8_t *c,uint8_t *d) {
\n
"
,
BG
,
Zc
);
fprintf
(
fd2
,
"static inline void ldpc_BG%d_Zc%d_16bit(uint16_t *c,uint16_t *d) {
\n
"
,
BG
,
Zc
);
fprintf
(
fd
,
" %s *csimd=(%s *)c,*dsimd=(%s *)d;
\n\n
"
,
data_type
,
data_type
,
data_type
);
fprintf
(
fd2
,
" %s *csimd=(%s *)c,*dsimd=(%s *)d;
\n\n
"
,
data_type
,
data_type
,
data_type
);
fprintf
(
fd
,
" %s *c2,*d2;
\n\n
"
,
data_type
);
fprintf
(
fd2
,
" %s *c2,*d2;
\n\n
"
,
data_type
);
fprintf
(
fd
,
" int i2;
\n
"
);
fprintf
(
fd2
,
" int i2;
\n
"
);
fprintf
(
fd
,
" for (i2=0; i2<%d; i2++) {
\n
"
,
Zc
>>
shift
);
if
(
shift
>
0
)
fprintf
(
fd2
,
" for (i2=0; i2<%d; i2++) {
\n
"
,
Zc
>>
(
shift
-
1
));
for
(
i2
=
0
;
i2
<
1
;
i2
++
)
//rotate matrix here
for
(
i5
=
0
;
i5
<
Kb
;
i5
++
)
{
//t=Kb*Zc+i2;
// calculate each row in base graph
fprintf
(
fd
,
" c2=&csimd[i2];
\n
"
);
fprintf
(
fd
,
" d2=&dsimd[i2];
\n
"
);
fprintf
(
fd2
,
" c2=&csimd[i2];
\n
"
);
fprintf
(
fd2
,
" d2=&dsimd[i2];
\n
"
);
for
(
i1
=
0
;
i1
<
nrows
;
i1
++
)
{
channel_temp
=
0
;
fprintf
(
fd
,
"
\n
//row: %d
\n
"
,
i1
);
fprintf
(
fd2
,
"
\n
//row: %d
\n
"
,
i1
);
fprintf
(
fd
,
" d2[%d]="
,(
Zc
*
i1
)
>>
shift
);
fprintf
(
fd2
,
" d2[%d]="
,(
Zc
*
i1
)
>>
(
shift
-
1
));
nind
=
0
;
for
(
i3
=
0
;
i3
<
ncols
;
i3
++
)
{
temp_prime
=
i1
*
ncols
+
i3
;
for
(
i4
=
0
;
i4
<
no_shift_values
[
temp_prime
];
i4
++
)
{
var
=
(
int
)((
i3
*
Zc
+
(
Gen_shift_values
[
pointer_shift_values
[
temp_prime
]
+
i4
]
+
1
)
%
Zc
)
/
Zc
);
int
index
=
var
*
2
*
Zc
+
(
i3
*
Zc
+
(
Gen_shift_values
[
pointer_shift_values
[
temp_prime
]
+
i4
]
+
1
)
%
Zc
)
%
Zc
;
indlist
[
nind
]
=
((
index
&
mask
)
*
((
2
*
Zc
)
>>
shift
)
*
Kb
)
+
(
index
>>
shift
);
indlist2
[
nind
++
]
=
((
index
&
(
mask
>>
1
))
*
((
2
*
Zc
)
>>
(
shift
-
1
))
*
Kb
)
+
(
index
>>
(
shift
-
1
));
}
}
for
(
i4
=
0
;
i4
<
nind
-
1
;
i4
++
)
{
fprintf
(
fd
,
"%s(c2[%d],"
,
xor_command
,
indlist
[
i4
]);
fprintf
(
fd2
,
"%s(c2[%d],"
,
xor_command
,
indlist2
[
i4
]);
}
fprintf
(
fd
,
"c2[%d]"
,
indlist
[
i4
]);
fprintf
(
fd2
,
"c2[%d]"
,
indlist2
[
i4
]);
for
(
i4
=
0
;
i4
<
nind
-
1
;
i4
++
)
{
fprintf
(
fd
,
")"
);
fprintf
(
fd2
,
")"
);
}
fprintf
(
fd
,
";
\n
"
);
fprintf
(
fd2
,
";
\n
"
);
}
fprintf
(
fd
,
" }
\n
}
\n
"
);
fprintf
(
fd2
,
" }
\n
}
\n
"
);
temp
=
c
[
i5
*
Zc
];
memmove
(
&
c
[
i5
*
Zc
],
&
c
[
i5
*
Zc
+
1
],
(
Zc
-
1
)
*
sizeof
(
unsigned
char
));
c
[
i5
*
Zc
+
Zc
-
1
]
=
temp
;
}
fclose
(
fd
);
fclose
(
fd2
);
}
else
if
(
gen_code
==
0
)
{
for
(
i2
=
0
;
i2
<
Zc
;
i2
++
)
{
//t=Kb*Zc+i2;
//rotate matrix here
for
(
i5
=
0
;
i5
<
Kb
;
i5
++
)
{
temp
=
c
[
i5
*
Zc
];
memmove
(
&
c
[
i5
*
Zc
],
&
c
[
i5
*
Zc
+
1
],
(
Zc
-
1
)
*
sizeof
(
unsigned
char
));
c
[
i5
*
Zc
+
Zc
-
1
]
=
temp
;
}
// calculate each row in base graph
for
(
i1
=
0
;
i1
<
nrows
-
no_punctured_columns
;
i1
++
)
// calculate each row in base graph
for
(
i1
=
0
;
i1
<
nrows
-
no_punctured_columns
;
i1
++
)
{
channel_temp
=
0
;
for
(
i3
=
0
;
i3
<
Kb
;
i3
++
)
{
channel_temp
=
0
;
temp_prime
=
i1
*
ncols
+
i3
;
for
(
i
3
=
0
;
i3
<
Kb
;
i3
++
)
for
(
i
4
=
0
;
i4
<
no_shift_values
[
temp_prime
];
i4
++
)
{
temp_prime
=
i1
*
ncols
+
i3
;
for
(
i4
=
0
;
i4
<
no_shift_values
[
temp_prime
];
i4
++
)
{
channel_temp
=
channel_temp
^
c
[
i3
*
Zc
+
Gen_shift_values
[
pointer_shift_values
[
temp_prime
]
+
i4
]
];
}
channel_temp
=
channel_temp
^
c
[
i3
*
Zc
+
Gen_shift_values
[
pointer_shift_values
[
temp_prime
]
+
i4
]
];
}
d
[
i2
+
i1
*
Zc
]
=
channel_temp
;
//channel_input[t+i1*Zc]=channel_temp;
}
d
[
i2
+
i1
*
Zc
]
=
channel_temp
;
//channel_input[t+i1*Zc]=channel_temp;
}
}
// information part and puncture columns
memcpy
(
&
channel_input
[
0
],
&
c
[
2
*
Zc
],
(
block_length
-
2
*
Zc
)
*
sizeof
(
unsigned
char
));
memcpy
(
&
channel_input
[
block_length
-
2
*
Zc
],
&
d
[
0
],
((
nrows
-
no_punctured_columns
)
*
Zc
-
removed_bit
)
*
sizeof
(
unsigned
char
));
//memcpy(channel_input,c,Kb*Zc*sizeof(unsigned char));
return
0
;
return
(
0
);
}
openair1/PHY/CODING/nrLDPC_
decoder/nrLDPC_decoder
.h
→
openair1/PHY/CODING/nrLDPC_
extern
.h
View file @
3b3d2322
...
...
@@ -18,29 +18,18 @@
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "openair1/PHY/CODING/nrLDPC_defs.h"
/*!\file nrLDPC_decoder.h
* \brief Defines the LDPC decoder core prototypes
* \author Sebastian Wagner (TCL Communications) Email: <mailto:sebastian.wagner@tcl.com>
* \date 27-03-2018
* \version 1.0
* \note
* \warning
*/
#ifndef __NR_LDPC_DECODER__H__
#define __NR_LDPC_DECODER__H__
#include "nrLDPC_types.h"
#include "nrLDPC_init_mem.h"
/**
\brief LDPC decoder
\param p_decParams LDPC decoder parameters
\param p_llr Input LLRs
\param p_llrOut Output vector
\param p_profiler LDPC profiler statistics
*/
int32_t
nrLDPC_decoder
(
t_nrLDPC_dec_params
*
p_decParams
,
int8_t
*
p_llr
,
int8_t
*
p_llrOut
,
t_nrLDPC_procBuf
*
p_procBuf
,
t_nrLDPC_time_stats
*
p_profiler
);
#endif
#ifdef LDPC_LOADER
nrLDPC_decoderfunc_t
nrLDPC_decoder
;
nrLDPC_encoderfunc_t
nrLDPC_encoder
;
#else
/* functions to load the LDPC shared lib, implemented in openair1/PHY/CODING/nrLDPC_load.c */
extern
int
load_nrLDPClib
(
void
)
;
extern
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_decoderfunc_t
nrLDPC_decoder
;
extern
nrLDPC_encoderfunc_t
nrLDPC_encoder
;
// inline functions:
#include "openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h"
#endif
\ No newline at end of file
openair1/PHY/CODING/nrLDPC_
encoder/defs.h
→
openair1/PHY/CODING/nrLDPC_
load.c
View file @
3b3d2322
...
...
@@ -19,36 +19,58 @@
* contact@openairinterface.org
*/
/*!\file defs.h
* \brief LDPC encoder forward declarations
* \author Florian Kaltenberger, Raymond Knopp, Kien le Trung (Eurecom)
* \email openair_tech@eurecom.fr
* \date 27-03-2018
* \version 1.0
/*! \file openair1/PHY/CODING/coding_nr_load.c
* \brief: load library implementing coding/decoding algorithms
* \author Francois TABURET
* \date 2020
* \version 0.1
* \company NOKIA BellLabs France
* \email: francois.taburet@nokia-bell-labs.com
* \note
* \warning
*/
#define _GNU_SOURCE
#include <sys/types.h>
#include <stdlib.h>
#include <malloc.h>
#include "assertions.h"
#include "common/utils/LOG/log.h"
#define LDPC_LOADER
#include "PHY/CODING/nrLDPC_extern.h"
#include "common/config/config_userapi.h"
#include "common/utils/load_module_shlib.h"
#include "PHY/TOOLS/time_meas.h"
/*
ldpc_encoder.c
*/
int
encode_parity_check_part_orig
(
unsigned
char
*
c
,
unsigned
char
*
d
,
short
BG
,
short
Zc
,
short
Kb
,
short
block_length
)
;
/*
function description array, to be used when loading the encoding/decoding shared lib
*/
static
loader_shlibfunc_t
shlib_fdesc
[
2
]
;
/*ldpc_encoder2.c*/
void
encode_parity_check_part_optim
(
uint8_t
*
c
,
uint8_t
*
d
,
short
BG
,
short
Zc
,
short
Kb
);
int
ldpc_encoder_optim
(
unsigned
char
*
test_input
,
unsigned
char
*
channel_input
,
int
Zc
,
int
Kb
,
short
block_length
,
short
BG
,
time_stats_t
*
tinput
,
time_stats_t
*
tprep
,
time_stats_t
*
tparity
,
time_stats_t
*
toutput
);
int
ldpc_encoder_optim_8seg
(
unsigned
char
**
test_input
,
unsigned
char
**
channel_input
,
int
Zc
,
int
Kb
,
short
block_length
,
short
BG
,
int
n_segments
,
time_stats_t
*
tinput
,
time_stats_t
*
tprep
,
time_stats_t
*
tparity
,
time_stats_t
*
toutput
);
int
ldpc_encoder_optim_8seg_multi
(
unsigned
char
**
test_input
,
unsigned
char
**
channel_input
,
int
Zc
,
int
Kb
,
short
block_length
,
short
BG
,
int
n_segments
,
unsigned
int
macro_num
,
time_stats_t
*
tinput
,
time_stats_t
*
tprep
,
time_stats_t
*
tparity
,
time_stats_t
*
toutput
);
char
*
arg
[
64
]
=
{
"ldpctest"
,
"-O"
,
"cmdlineonly::dbgl0"
};
int
load_nrLDPClib
(
void
)
{
char
*
ptr
=
(
char
*
)
config_get_if
();
if
(
ptr
==
NULL
)
{
// phy simulators, config module possibly not loaded
load_configmodule
(
3
,(
char
**
)
arg
,
CONFIG_ENABLECMDLINEONLY
)
;
logInit
();
}
shlib_fdesc
[
0
].
fname
=
"nrLDPC_decod"
;
shlib_fdesc
[
1
].
fname
=
"nrLDPC_encod"
;
int
ret
=
load_module_shlib
(
"ldpc"
,
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
;
return
0
;
}
int
load_nrLDPClib_ref
(
char
*
libversion
,
nrLDPC_encoderfunc_t
*
nrLDPC_encoder_ptr
)
{
loader_shlibfunc_t
shlib_encoder_fdesc
;
shlib_encoder_fdesc
.
fname
=
"nrLDPC_encod"
;
char
libpath
[
64
];
sprintf
(
libpath
,
"ldpc%s"
,
libversion
);
int
ret
=
load_module_shlib
(
libpath
,
&
shlib_encoder_fdesc
,
1
,
NULL
);
AssertFatal
(
(
ret
>=
0
),
"Error loading ldpc encoder %s
\n
"
,
libpath
);
*
nrLDPC_encoder_ptr
=
(
nrLDPC_encoderfunc_t
)
shlib_encoder_fdesc
.
fptr
;
return
0
;
}
/*ldpc_generate_coefficient.c*/
int
ldpc_encoder_orig
(
unsigned
char
*
test_input
,
unsigned
char
*
channel_input
,
int
Zc
,
int
Kb
,
short
block_length
,
short
BG
,
unsigned
char
gen_code
);
/*
int encode_parity_check_part(unsigned char *c,unsigned char *d, short BG,short Zc,short Kb);
int encode_parity_check_part_orig(unsigned char *c,unsigned char *d, short BG,short Zc,short Kb,short block_length);
int ldpc_encoder(unsigned char *test_input,unsigned char *channel_input,short block_length, double rate);
int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,short block_length,int nom_rate,int denom_rate,unsigned char gen_code);
int ldpc_encoder_multi_segment(unsigned char **test_input,unsigned char **channel_input,short block_length,double rate,uint8_t n_segments);
int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,short block_length,int nom_rate,int denom_rate,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput);
int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_input,short block_length,int nom_rate,int denom_rate,int n_segments,time_stats_t *tinput,time_stats_t *tprep,time_stats_t *tparity,time_stats_t *toutput);
*/
openair1/PHY/INIT/nr_init.c
View file @
3b3d2322
...
...
@@ -31,6 +31,7 @@
#include "TDD-Config.h"
#include "MBSFN-SubframeConfigList.h"*/
#include "openair1/PHY/defs_RU.h"
#include "openair1/PHY/CODING/nrLDPC_extern.h"
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
#include "assertions.h"
#include <math.h>
...
...
@@ -115,6 +116,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
LOG_D
(
PHY
,
"[MSC_NEW][FRAME 00000][PHY_gNB][MOD %02"
PRIu8
"][]
\n
"
,
gNB
->
Mod_id
);
crcTableInit
();
init_dfts
();
load_nrLDPClib
();
// PBCH DMRS gold sequences generation
nr_init_pbch_dmrs
(
gNB
);
//PDCCH DMRS init
...
...
openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
View file @
3b3d2322
...
...
@@ -35,12 +35,11 @@
#include "PHY/CODING/coding_extern.h"
#include "PHY/CODING/coding_defs.h"
#include "PHY/CODING/lte_interleaver_inline.h"
#include "PHY/CODING/nrLDPC_e
ncoder/defs
.h"
#include "PHY/CODING/nrLDPC_e
xtern
.h"
#include "PHY/NR_TRANSPORT/nr_transport.h"
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
#include "PHY/NR_TRANSPORT/nr_dlsch.h"
#include "SCHED_NR/sched_nr.h"
#include "defs.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "common/utils/LOG/log.h"
#include <syscall.h>
...
...
@@ -404,9 +403,11 @@ int nr_dlsch_encoding(unsigned char *a,
//ldpc_encoder_orig((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],dlsch->harq_processes[harq_pid]->d[r],*Zc,Kb,Kr,BG,0);
//ldpc_encoder_optim((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],(unsigned char*)&dlsch->harq_processes[harq_pid]->d[r][0],*Zc,Kb,Kr,BG,NULL,NULL,NULL,NULL);
}
encoder_implemparams_t
impp
;
impp
.
n_segments
=
dlsch
->
harq_processes
[
harq_pid
]
->
C
;
for
(
int
j
=
0
;
j
<
(
dlsch
->
harq_processes
[
harq_pid
]
->
C
/
8
+
1
);
j
++
)
{
ldpc_encoder_optim_8seg_multi
(
dlsch
->
harq_processes
[
harq_pid
]
->
c
,
dlsch
->
harq_processes
[
harq_pid
]
->
d
,
*
Zc
,
Kb
,
Kr
,
BG
,
dlsch
->
harq_processes
[
harq_pid
]
->
C
,
j
,
NULL
,
NULL
,
NULL
,
NULL
);
impp
.
macro_num
=
j
;
nrLDPC_encoder
(
dlsch
->
harq_processes
[
harq_pid
]
->
c
,
dlsch
->
harq_processes
[
harq_pid
]
->
d
,
*
Zc
,
Kb
,
Kr
,
BG
,
&
impp
);
}
...
...
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
View file @
3b3d2322
...
...
@@ -37,8 +37,7 @@
#include "PHY/CODING/coding_extern.h"
#include "PHY/CODING/coding_defs.h"
#include "PHY/CODING/lte_interleaver_inline.h"
#include "PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.h"
#include "PHY/CODING/nrLDPC_decoder/nrLDPC_types.h"
#include "PHY/CODING/nrLDPC_extern.h"
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
#include "PHY/NR_TRANSPORT/nr_ulsch.h"
#include "PHY/NR_TRANSPORT/nr_dlsch.h"
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
View file @
3b3d2322
...
...
@@ -41,8 +41,7 @@
#include "SCHED_NR_UE/defs.h"
#include "SIMULATION/TOOLS/sim.h"
#include "executables/nr-uesoftmodem.h"
#include "PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.h"
#include "PHY/CODING/nrLDPC_decoder/nrLDPC_types.h"
#include "PHY/CODING/nrLDPC_extern.h"
//#define DEBUG_DLSCH_DECODING
//#define ENABLE_PHY_PAYLOAD_DEBUG 1
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
View file @
3b3d2322
...
...
@@ -36,7 +36,7 @@
#include "PHY/CODING/coding_defs.h"
#include "PHY/CODING/coding_extern.h"
#include "PHY/CODING/lte_interleaver_inline.h"
#include "PHY/CODING/nrLDPC_e
ncoder/defs
.h"
#include "PHY/CODING/nrLDPC_e
xtern
.h"
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
...
...
@@ -353,8 +353,11 @@ opp_enabled=0;
printf("%d \n", harq_process->d[0][cnt]);
}
printf("\n");*/
encoder_implemparams_t
impp
;
impp
.
n_segments
=
harq_process
->
C
;
impp
.
macro_num
=
0
;
ldpc_encoder_optim_8seg
(
harq_process
->
c
,
harq_process
->
d
,
*
pz
,
Kb
,
Kr
,
BG
,
harq_process
->
C
,
NULL
,
NULL
,
NULL
,
NULL
);
nrLDPC_encoder
(
harq_process
->
c
,
harq_process
->
d
,
*
pz
,
Kb
,
Kr
,
BG
,
&
impp
);
//stop_meas(te_stats);
//printf("end ldpc encoder -- output\n");
...
...
openair1/PHY/defs_gNB.h
View file @
3b3d2322
...
...
@@ -40,7 +40,7 @@
#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
#include "PHY/impl_defs_top.h"
#include "PHY/defs_common.h"
#include "PHY/CODING/nrLDPC_
decoder/nrLDPC_decoder
.h"
#include "PHY/CODING/nrLDPC_
extern
.h"
#include "PHY/CODING/nrLDPC_decoder/nrLDPC_types.h"
#define MAX_NUM_RU_PER_gNB MAX_NUM_RU_PER_eNB
...
...
targets/ARCH/COMMON/common_lib.c
View file @
3b3d2322
...
...
@@ -37,6 +37,7 @@
#include <stdlib.h>
#include "common_lib.h"
#include "assertions.h"
#include "common/utils/load_module_shlib.h"
#include "common/utils/LOG/log.h"
#include "targets/RT/USER/lte-softmodem.h"
...
...
@@ -91,38 +92,44 @@ int load_lib(openair0_device *device,
{
loader_shlibfunc_t
shlib_fdesc
[
1
];
int
ret
=
0
;
char
*
libname
;
char
*
deflibname
=
OAI_RF_LIBNAME
;
openair0_cfg
->
recplay_mode
=
read_recplayconfig
(
&
(
openair0_cfg
->
recplay_conf
),
&
(
device
->
recplay_state
));
if
(
openair0_cfg
->
recplay_mode
==
RECPLAY_REPLAYMODE
)
{
libname
=
OAI_IQPLAYER_LIBNAME
;
def
libname
=
OAI_IQPLAYER_LIBNAME
;
shlib_fdesc
[
0
].
fname
=
"device_init"
;
set_softmodem_optmask
(
SOFTMODEM_RECPLAY_BIT
);
// softmodem has to know we use the iqplayer to workaround randomized algorithms
}
else
if
(
IS_SOFTMODEM_BASICSIM
)
{
libname
=
OAI_BASICSIM_LIBNAME
;
def
libname
=
OAI_BASICSIM_LIBNAME
;
shlib_fdesc
[
0
].
fname
=
"device_init"
;
}
else
if
(
IS_SOFTMODEM_RFSIM
&&
flag
==
RAU_LOCAL_RADIO_HEAD
)
{
libname
=
OAI_RFSIM_LIBNAME
;
def
libname
=
OAI_RFSIM_LIBNAME
;
shlib_fdesc
[
0
].
fname
=
"device_init"
;
}
else
if
(
flag
==
RAU_LOCAL_RADIO_HEAD
)
{
if
(
IS_SOFTMODEM_RFSIM
)
libname
=
"rfsimulator"
;
def
libname
=
"rfsimulator"
;
else
libname
=
OAI_RF_LIBNAME
;
def
libname
=
OAI_RF_LIBNAME
;
shlib_fdesc
[
0
].
fname
=
"device_init"
;
}
else
{
libname
=
OAI_TP_LIBNAME
;
def
libname
=
OAI_TP_LIBNAME
;
shlib_fdesc
[
0
].
fname
=
"transport_init"
;
}
ret
=
load_module_shlib
(
libname
,
shlib_fdesc
,
1
,
NULL
);
char
*
devname
=
NULL
;
paramdef_t
device_params
[]
=
DEVICE_PARAMS_DESC
;
int
numparams
=
sizeof
(
device_params
)
/
sizeof
(
paramdef_t
);
int
devname_pidx
=
config_paramidx_fromname
(
device_params
,
numparams
,
CONFIG_DEVICEOPT_NAME
);
device_params
[
devname_pidx
].
defstrval
=
deflibname
;
config_get
(
device_params
,
numparams
,
DEVICE_SECTION
);
ret
=
load_module_shlib
(
devname
,
shlib_fdesc
,
1
,
NULL
);
AssertFatal
(
(
ret
>=
0
),
"Library %s couldn't be loaded
\n
"
,
devname
);
if
(
ret
<
0
)
{
LOG_E
(
HW
,
"Library %s couldn't be loaded
\n
"
,
libname
);
}
else
{
ret
=
((
devfunc_t
)
shlib_fdesc
[
0
].
fptr
)(
device
,
openair0_cfg
,
cfg
);
}
return
ret
;
return
((
devfunc_t
)
shlib_fdesc
[
0
].
fptr
)(
device
,
openair0_cfg
,
cfg
);
}
...
...
targets/ARCH/COMMON/common_lib.h
View file @
3b3d2322
...
...
@@ -448,6 +448,24 @@ typedef struct {
extern
"C"
{
#endif
#define DEVICE_SECTION "device"
#define CONFIG_HLP_DEVICE "Identifies the oai device (the interface to RF) to use, the shared lib \"lib_<name>.so\" will be loaded"
#define CONFIG_DEVICEOPT_NAME "name"
/* inclusion for device configuration */
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/* config parameters for oai device */
/* optname helpstr paramflags XXXptr defXXXval type numelt */
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
#define DEVICE_PARAMS_DESC {\
{ CONFIG_DEVICEOPT_NAME, CONFIG_HLP_DEVICE, 0, strptr:&devname, defstrval:NULL, TYPE_STRING, 0}\
}
/*! \brief get device name from device type */
char
*
get_devname
(
int
devtype
);
/*! \brief Initialize openair RF target. It returns 0 if OK */
...
...
targets/ARCH/COMMON/record_player.h
View file @
3b3d2322
...
...
@@ -37,19 +37,6 @@
extern
"C"
{
#endif
#define CONFIG_OPT_RECPLAY "enable_recplay"
#define CONFIG_HLP_RECPLAY "Allow record player"
#define USRP_SECTION "device.usrp"
/* inclusion for device configuration */
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/* command line parameters for USRP record/playback */
/* optname helpstr paramflags XXXptr defXXXval type numelt */
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
#define DEVICE_PARAMS_DESC { \
{CONFIG_OPT_RECPLAY, CONFIG_HLP_RECPLAY, PARAMFLAG_BOOL, uptr:&enable_recplay, defuintval:0, TYPE_UINT, 0} \
}
/* inclusions for record player */
#define RECPLAY_DISABLED 0
...
...
@@ -114,7 +101,7 @@ typedef struct {
{CONFIG_OPT_SF_LOOPS, CONFIG_HLP_SF_LOOPS, 0, uptr:&((*recplay_conf)->u_sf_loops), defintval:DEF_SF_NB_LOOP, TYPE_UINT, 0}, \
{CONFIG_OPT_SF_RDELAY, CONFIG_HLP_SF_RDELAY, 0, uptr:&((*recplay_conf)->u_sf_read_delay), defintval:DEF_SF_DELAY_READ, TYPE_UINT, 0}, \
{CONFIG_OPT_SF_WDELAY, CONFIG_HLP_SF_WDELAY, 0, uptr:&((*recplay_conf)->u_sf_write_delay), defintval:DEF_SF_DELAY_WRITE, TYPE_UINT, 0}, \
}
/*! \brief
USRP
Configuration and state */
}
/*! \brief
Record Player
Configuration and state */
typedef
struct
{
char
u_sf_filename
[
1024
];
// subframes file path
unsigned
int
u_sf_max
;
// max number of recorded subframes
...
...
targets/ARCH/iqplayer/iqplayer_lib.c
View file @
3b3d2322
...
...
@@ -25,6 +25,7 @@
*/
#define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64
#define NB_ANTENNAS_RX 2
#include <string.h>
#include <pthread.h>
#include <unistd.h>
...
...
@@ -45,7 +46,9 @@
static
void
parse_iqfile_header
(
openair0_device
*
device
,
iqfile_header_t
*
iq_fh
)
{
AssertFatal
((
memcmp
(
iq_fh
->
oaiid
,
OAIIQFILE_ID
,
sizeof
(
OAIIQFILE_ID
))
==
0
),
"iqfile doesn't seem to be compatible with oai (invalid id in header)
\n
"
);
AssertFatal
((
memcmp
(
iq_fh
->
oaiid
,
OAIIQFILE_ID
,
sizeof
(
OAIIQFILE_ID
))
==
0
),
"iqfile doesn't seem to be compatible with oai (invalid id %.4s in header)
\n
"
,
iq_fh
->
oaiid
);
device
->
type
=
iq_fh
->
devtype
;
device
->
openair0_cfg
[
0
].
tx_sample_advance
=
iq_fh
->
tx_sample_advance
;
device
->
openair0_cfg
[
0
].
tx_bw
=
device
->
openair0_cfg
[
0
].
rx_bw
=
iq_fh
->
bw
;
...
...
@@ -138,6 +141,13 @@ static int iqplayer_loadfile(openair0_device *device, openair0_config_t *openair
return
0
;
}
/*! \brief start the oai iq player
* \param device, the hardware used
*/
static
int
trx_iqplayer_start
(
openair0_device
*
device
){
return
0
;
}
/*! \brief Terminate operation of the oai iq player
* \param device, the hardware used
*/
...
...
@@ -287,7 +297,7 @@ static int trx_iqplayer_read(openair0_device *device, openair0_timestamp *ptimes
int
device_init
(
openair0_device
*
device
,
openair0_config_t
*
openair0_cfg
)
{
device
->
openair0_cfg
=
openair0_cfg
;
device
->
trx_start_func
=
NULL
;
device
->
trx_start_func
=
trx_iqplayer_start
;
device
->
trx_get_stats_func
=
NULL
;
device
->
trx_reset_stats_func
=
NULL
;
device
->
trx_end_func
=
trx_iqplayer_end
;
...
...
targets/RT/USER/lte-ru.c
View file @
3b3d2322
...
...
@@ -2194,7 +2194,9 @@ int start_rf(RU_t *ru) {
}
int
stop_rf
(
RU_t
*
ru
)
{
ru
->
rfdevice
.
trx_end_func
(
&
ru
->
rfdevice
);
if
(
ru
->
rfdevice
.
trx_end_func
!=
NULL
)
{
ru
->
rfdevice
.
trx_end_func
(
&
ru
->
rfdevice
);
}
return
0
;
}
...
...
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