Commit ace07914 authored by Romain Beurdouche's avatar Romain Beurdouche

feat(ldpc-decoding-module-interface-rework): Add slot encoding to the interface and interface demo

parent a88d4e95
...@@ -881,7 +881,7 @@ add_dependencies(ldpc_cl nrLDPC_decoder_kernels_CL) ...@@ -881,7 +881,7 @@ add_dependencies(ldpc_cl nrLDPC_decoder_kernels_CL)
set(PHY_NR_ULSCH_DECODING_DEMO_SRC set(PHY_NR_ULSCH_DECODING_DEMO_SRC
${OPENAIR1_DIR}/PHY/CODING/nr_ulsch_decoding_interface_demo.c ${OPENAIR1_DIR}/PHY/CODING/nr_ulsch_decoding_interface_demo.c
${PHY_LDPC_OPTIM8SEGMULTI_SRC} ${OPENAIR1_DIR}/PHY/CODING/nr_dlsch_encoding_interface_demo.c
) )
set(PHY_NR_CODINGIF set(PHY_NR_CODINGIF
...@@ -913,7 +913,6 @@ add_library(coding MODULE ${PHY_TURBOSRC} ) ...@@ -913,7 +913,6 @@ add_library(coding MODULE ${PHY_TURBOSRC} )
add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts_neon.c) add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts_neon.c)
add_library(ldpc_slot_demo MODULE ${PHY_NR_ULSCH_DECODING_DEMO_SRC}) add_library(ldpc_slot_demo MODULE ${PHY_NR_ULSCH_DECODING_DEMO_SRC})
target_link_libraries(ldpc_slot_demo PRIVATE ldpc_gen_HEADERS)
set(PHY_SRC_COMMON set(PHY_SRC_COMMON
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools_common.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools_common.c
......
This diff is collapsed.
...@@ -36,10 +36,26 @@ typedef int32_t(nr_ulsch_decoding_shutdown_t)(void); ...@@ -36,10 +36,26 @@ typedef int32_t(nr_ulsch_decoding_shutdown_t)(void);
*/ */
typedef int32_t(nr_ulsch_decoding_decoder_t)(PHY_VARS_gNB *gNB, NR_DL_FRAME_PARMS *frame_parms, int frame_rx, int slot_rx, uint32_t *G); typedef int32_t(nr_ulsch_decoding_decoder_t)(PHY_VARS_gNB *gNB, NR_DL_FRAME_PARMS *frame_parms, int frame_rx, int slot_rx, uint32_t *G);
typedef int32_t(nr_ulsch_decoding_encoder_t)
(PHY_VARS_gNB *gNB,
processingData_L1tx_t *msgTx,
int frame_tx,
uint8_t slot_tx,
NR_DL_FRAME_PARMS* frame_parms,
unsigned char ** output,
time_stats_t *tinput,
time_stats_t *tprep,
time_stats_t *tparity,
time_stats_t *toutput,
time_stats_t *dlsch_rate_matching_stats,
time_stats_t *dlsch_interleaving_stats,
time_stats_t *dlsch_segmentation_stats);
typedef struct nr_ulsch_decoding_interface_s { typedef struct nr_ulsch_decoding_interface_s {
nr_ulsch_decoding_init_t *nr_ulsch_decoding_init; nr_ulsch_decoding_init_t *nr_ulsch_decoding_init;
nr_ulsch_decoding_shutdown_t *nr_ulsch_decoding_shutdown; nr_ulsch_decoding_shutdown_t *nr_ulsch_decoding_shutdown;
nr_ulsch_decoding_decoder_t *nr_ulsch_decoding_decoder; nr_ulsch_decoding_decoder_t *nr_ulsch_decoding_decoder;
nr_ulsch_decoding_encoder_t *nr_ulsch_decoding_encoder;
} nr_ulsch_decoding_interface_t; } nr_ulsch_decoding_interface_t;
int load_nr_ulsch_decoding_interface(char *version, nr_ulsch_decoding_interface_t *interface); int load_nr_ulsch_decoding_interface(char *version, nr_ulsch_decoding_interface_t *interface);
......
...@@ -63,14 +63,10 @@ ...@@ -63,14 +63,10 @@
#include "nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h" #include "nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h"
#include "nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h" #include "nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h"
int32_t LDPCdecoder(t_nrLDPC_dec_params* p_decParams, #define DEMO_LDPCLIB_SUFFIX ""
uint8_t harq_pid,
uint8_t ulsch_id, // Global var to limit the rework of the dirty legacy code
uint8_t C, ldpc_interface_t ldpc_interface_demo;
int8_t* p_llr,
int8_t* p_out,
t_nrLDPC_time_stats* p_profiler,
decode_abort_t* ab);
static void nr_processULSegment_demo(void *arg) static void nr_processULSegment_demo(void *arg)
{ {
...@@ -169,7 +165,7 @@ static void nr_processULSegment_demo(void *arg) ...@@ -169,7 +165,7 @@ static void nr_processULSegment_demo(void *arg)
////////////////////////////////// pl =====> llrProcBuf ////////////////////////////////// ////////////////////////////////// pl =====> llrProcBuf //////////////////////////////////
rdata->decodeIterations = rdata->decodeIterations =
LDPCdecoder(p_decoderParms, 0, 0, 0, l, llrProcBuf, p_procTime, &ulsch_harq->abort_decode); ldpc_interface_demo.LDPCdecoder(p_decoderParms, 0, 0, 0, l, llrProcBuf, p_procTime, &ulsch_harq->abort_decode);
if (rdata->decodeIterations <= p_decoderParms->numMaxIter) if (rdata->decodeIterations <= p_decoderParms->numMaxIter)
memcpy(ulsch_harq->c[r],llrProcBuf, Kr>>3); memcpy(ulsch_harq->c[r],llrProcBuf, Kr>>3);
...@@ -326,12 +322,16 @@ int nr_ulsch_decoding_demo(PHY_VARS_gNB *phy_vars_gNB, ...@@ -326,12 +322,16 @@ int nr_ulsch_decoding_demo(PHY_VARS_gNB *phy_vars_gNB,
int32_t nr_ulsch_decoding_init(void){ int32_t nr_ulsch_decoding_init(void){
load_LDPClib(DEMO_LDPCLIB_SUFFIX, &ldpc_interface_demo);
return 0; return 0;
} }
int32_t nr_ulsch_decoding_shutdown(void){ int32_t nr_ulsch_decoding_shutdown(void){
free_LDPClib(&ldpc_interface_demo);
return 0; return 0;
} }
......
...@@ -56,7 +56,8 @@ int load_nr_ulsch_decoding_interface(char *version, nr_ulsch_decoding_interface_ ...@@ -56,7 +56,8 @@ int load_nr_ulsch_decoding_interface(char *version, nr_ulsch_decoding_interface_
/* function description array, to be used when loading the encoding/decoding shared lib */ /* function description array, to be used when loading the encoding/decoding shared lib */
loader_shlibfunc_t shlib_fdesc[] = {{.fname = "nr_ulsch_decoding_init"}, loader_shlibfunc_t shlib_fdesc[] = {{.fname = "nr_ulsch_decoding_init"},
{.fname = "nr_ulsch_decoding_shutdown"}, {.fname = "nr_ulsch_decoding_shutdown"},
{.fname = "nr_ulsch_decoding_decoder"}}; {.fname = "nr_ulsch_decoding_decoder"},
{.fname = "nr_ulsch_decoding_encoder"}};
int ret; int ret;
ret = load_module_version_shlib(libname, version, shlib_fdesc, sizeofArray(shlib_fdesc), NULL); ret = load_module_version_shlib(libname, version, shlib_fdesc, sizeofArray(shlib_fdesc), NULL);
if(ret < 0){ if(ret < 0){
...@@ -66,6 +67,7 @@ int load_nr_ulsch_decoding_interface(char *version, nr_ulsch_decoding_interface_ ...@@ -66,6 +67,7 @@ int load_nr_ulsch_decoding_interface(char *version, nr_ulsch_decoding_interface_
itf->nr_ulsch_decoding_init = (nr_ulsch_decoding_init_t *)shlib_fdesc[0].fptr; itf->nr_ulsch_decoding_init = (nr_ulsch_decoding_init_t *)shlib_fdesc[0].fptr;
itf->nr_ulsch_decoding_shutdown = (nr_ulsch_decoding_shutdown_t *)shlib_fdesc[1].fptr; itf->nr_ulsch_decoding_shutdown = (nr_ulsch_decoding_shutdown_t *)shlib_fdesc[1].fptr;
itf->nr_ulsch_decoding_decoder = (nr_ulsch_decoding_decoder_t *)shlib_fdesc[2].fptr; itf->nr_ulsch_decoding_decoder = (nr_ulsch_decoding_decoder_t *)shlib_fdesc[2].fptr;
itf->nr_ulsch_decoding_encoder = (nr_ulsch_decoding_encoder_t *)shlib_fdesc[3].fptr;
AssertFatal(itf->nr_ulsch_decoding_init() == 0, "error starting LDPC library %s %s\n", libname, version); AssertFatal(itf->nr_ulsch_decoding_init() == 0, "error starting LDPC library %s %s\n", libname, version);
......
...@@ -136,10 +136,12 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB) ...@@ -136,10 +136,12 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB)
gNB->nr_ulsch_decoding_interface_flag = 0; gNB->nr_ulsch_decoding_interface_flag = 0;
int ret_loader = load_nr_ulsch_decoding_interface(NULL, &nr_ulsch_decoding_interface); int ret_loader = load_nr_ulsch_decoding_interface(NULL, &nr_ulsch_decoding_interface);
if(ret_loader >= 0) if (ret_loader >= 0) {
gNB->nr_ulsch_decoding_interface_flag = 1; gNB->nr_ulsch_decoding_interface_flag = 1;
load_LDPClib("", &ldpc_interface);
load_LDPClib(NULL, &ldpc_interface); } else {
load_LDPClib(NULL, &ldpc_interface);
}
pthread_mutex_init(&gNB->UL_INFO.crc_rx_mutex, NULL); pthread_mutex_init(&gNB->UL_INFO.crc_rx_mutex, NULL);
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "nr_dlsch.h" #include "nr_dlsch.h"
#include "nr_dci.h" #include "nr_dci.h"
#include "nr_sch_dmrs.h" #include "nr_sch_dmrs.h"
#include "PHY/CODING/nr_ulsch_decoding_interface.h"
#include "PHY/MODULATION/nr_modulation.h" #include "PHY/MODULATION/nr_modulation.h"
#include "PHY/NR_REFSIG/dmrs_nr.h" #include "PHY/NR_REFSIG/dmrs_nr.h"
#include "PHY/NR_REFSIG/ptrs_nr.h" #include "PHY/NR_REFSIG/ptrs_nr.h"
...@@ -64,6 +65,9 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot) ...@@ -64,6 +65,9 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot)
time_stats_t *dlsch_interleaving_stats=&gNB->dlsch_interleaving_stats; time_stats_t *dlsch_interleaving_stats=&gNB->dlsch_interleaving_stats;
time_stats_t *dlsch_segmentation_stats=&gNB->dlsch_segmentation_stats; time_stats_t *dlsch_segmentation_stats=&gNB->dlsch_segmentation_stats;
unsigned char **output = calloc(msgTx->num_pdsch_slot, sizeof(unsigned char *));
int slot_encoding_done = 0;
for (int dlsch_id=0; dlsch_id<msgTx->num_pdsch_slot; dlsch_id++) { for (int dlsch_id=0; dlsch_id<msgTx->num_pdsch_slot; dlsch_id++) {
NR_gNB_DLSCH_t *dlsch = msgTx->dlsch[dlsch_id]; NR_gNB_DLSCH_t *dlsch = msgTx->dlsch[dlsch_id];
...@@ -104,18 +108,52 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot) ...@@ -104,18 +108,52 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot)
} }
harq->unav_res = ptrsSymbPerSlot * n_ptrs; harq->unav_res = ptrsSymbPerSlot * n_ptrs;
if(slot_encoding_done)
goto after_encoding;
/// CRC, coding, interleaving and rate matching /// CRC, coding, interleaving and rate matching
AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n"); AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * Qm * rel15->nrOfLayers] __attribute__((aligned(64))); int ret_memalign = posix_memalign((void **)&output[dlsch_id], 64, sizeof(unsigned char) * rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * Qm * rel15->nrOfLayers);
bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * Qm * rel15->nrOfLayers); if(ret_memalign){
start_meas(dlsch_encoding_stats); if(gNB->nr_ulsch_decoding_interface_flag)
for(int i = 0; i < dlsch_id; i++)
free(output[i]);
return;
}
bzero(output[dlsch_id],rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * Qm * rel15->nrOfLayers);
if(gNB->nr_ulsch_decoding_interface_flag){
if(dlsch_id == msgTx->num_pdsch_slot-1){
start_meas(dlsch_encoding_stats);
if (nr_ulsch_decoding_interface.nr_ulsch_decoding_encoder(gNB,
msgTx,
frame,
slot,
frame_parms,
output,
tinput,
tprep,
tparity,
toutput,
dlsch_rate_matching_stats,
dlsch_interleaving_stats,
dlsch_segmentation_stats) == -1) {
return;
}
stop_meas(dlsch_encoding_stats);
dlsch_id = -1;
slot_encoding_done = 1;
}
continue;
}
start_meas(dlsch_encoding_stats);
if (nr_dlsch_encoding(gNB, if (nr_dlsch_encoding(gNB,
frame, frame,
slot, slot,
harq, harq,
frame_parms, frame_parms,
output, output[dlsch_id],
tinput, tinput,
tprep, tprep,
tparity, tparity,
...@@ -125,6 +163,8 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot) ...@@ -125,6 +163,8 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot)
dlsch_segmentation_stats) == -1) dlsch_segmentation_stats) == -1)
return; return;
stop_meas(dlsch_encoding_stats); stop_meas(dlsch_encoding_stats);
after_encoding:
#ifdef DEBUG_DLSCH #ifdef DEBUG_DLSCH
printf("PDSCH encoding:\nPayload:\n"); printf("PDSCH encoding:\nPayload:\n");
for (int i=0; i<harq->B>>7; i++) { for (int i=0; i<harq->B>>7; i++) {
...@@ -135,14 +175,14 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot) ...@@ -135,14 +175,14 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot)
printf("\nEncoded payload:\n"); printf("\nEncoded payload:\n");
for (int i=0; i<encoded_length>>3; i++) { for (int i=0; i<encoded_length>>3; i++) {
for (int j=0; j<8; j++) for (int j=0; j<8; j++)
printf("%d", output[(i<<3)+j]); printf("%d", output[dlsch_id][(i<<3)+j]);
printf("\t"); printf("\t");
} }
printf("\n"); printf("\n");
#endif #endif
if (IS_SOFTMODEM_DLSIM) if (IS_SOFTMODEM_DLSIM)
memcpy(harq->f, output, encoded_length); memcpy(harq->f, output[dlsch_id], encoded_length);
c16_t mod_symbs[rel15->NrOfCodewords][encoded_length]; c16_t mod_symbs[rel15->NrOfCodewords][encoded_length];
for (int codeWord = 0; codeWord < rel15->NrOfCodewords; codeWord++) { for (int codeWord = 0; codeWord < rel15->NrOfCodewords; codeWord++) {
...@@ -151,7 +191,9 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot) ...@@ -151,7 +191,9 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot)
uint32_t scrambled_output[(encoded_length>>5)+4]; // modulator acces by 4 bytes in some cases uint32_t scrambled_output[(encoded_length>>5)+4]; // modulator acces by 4 bytes in some cases
memset(scrambled_output, 0, sizeof(scrambled_output)); memset(scrambled_output, 0, sizeof(scrambled_output));
if ( encoded_length > rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * Qm * rel15->nrOfLayers) abort(); if ( encoded_length > rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * Qm * rel15->nrOfLayers) abort();
nr_pdsch_codeword_scrambling(output, encoded_length, codeWord, rel15->dataScramblingId, rel15->rnti, scrambled_output); nr_pdsch_codeword_scrambling(output[dlsch_id], encoded_length, codeWord, rel15->dataScramblingId, rel15->rnti, scrambled_output);
free(output[dlsch_id]);
#ifdef DEBUG_DLSCH #ifdef DEBUG_DLSCH
printf("PDSCH scrambling:\n"); printf("PDSCH scrambling:\n");
...@@ -589,6 +631,9 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot) ...@@ -589,6 +631,9 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot)
LOG_D(PHY,"beam index for PDSCH allocation already taken\n"); LOG_D(PHY,"beam index for PDSCH allocation already taken\n");
} }
}// dlsch loop }// dlsch loop
free(output);
} }
void dump_pdsch_stats(FILE *fd,PHY_VARS_gNB *gNB) { void dump_pdsch_stats(FILE *fd,PHY_VARS_gNB *gNB) {
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "PHY/defs_nr_UE.h" #include "PHY/defs_nr_UE.h"
#include "PHY/phy_vars_nr_ue.h" #include "PHY/phy_vars_nr_ue.h"
#include "PHY/types.h" #include "PHY/types.h"
#include "PHY/CODING/nr_ulsch_decoding_interface.h"
#include "PHY/INIT/nr_phy_init.h" #include "PHY/INIT/nr_phy_init.h"
#include "PHY/MODULATION/modulation_eNB.h" #include "PHY/MODULATION/modulation_eNB.h"
#include "PHY/MODULATION/nr_modulation.h" #include "PHY/MODULATION/nr_modulation.h"
...@@ -1327,6 +1328,9 @@ int main(int argc, char **argv) ...@@ -1327,6 +1328,9 @@ int main(int argc, char **argv)
if (gNB->ldpc_offload_flag) if (gNB->ldpc_offload_flag)
free_LDPClib(&ldpc_interface_offload); free_LDPClib(&ldpc_interface_offload);
if (gNB->nr_ulsch_decoding_interface_flag)
free_nr_ulsch_decoding_interface(&nr_ulsch_decoding_interface);
if (output_fd) if (output_fd)
fclose(output_fd); fclose(output_fd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment