From 7f1d3c6644f55b081e516e1e1471c4f2b8e37c51 Mon Sep 17 00:00:00 2001 From: Romain Beurdouche Date: Wed, 9 Oct 2024 14:19:35 +0200 Subject: [PATCH] feat(nrLDPC_coding_interface): Use reworked interface in PHY simulators --- openair1/SIMULATION/NR_PHY/dlschsim.c | 31 ++++++++++------- openair1/SIMULATION/NR_PHY/dlsim.c | 15 +++----- openair1/SIMULATION/NR_PHY/ulschsim.c | 50 +++++++-------------------- openair1/SIMULATION/NR_PHY/ulsim.c | 18 ++++------ 4 files changed, 41 insertions(+), 73 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index da02d13be1..cac4c6604a 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -35,6 +35,7 @@ #include "PHY/defs_nr_common.h" #include "PHY/defs_nr_UE.h" #include "PHY/types.h" +#include "PHY/CODING/nrLDPC_coding/nrLDPC_coding_interface.h" #include "PHY/INIT/nr_phy_init.h" #include "PHY/MODULATION/modulation_eNB.h" #include "PHY/MODULATION/modulation_UE.h" @@ -380,7 +381,7 @@ int main(int argc, char **argv) RC.gNB[0] = calloc(1, sizeof(PHY_VARS_gNB)); gNB = RC.gNB[0]; initNamedTpool(gNBthreads, &gNB->threadPool, true, "gNB-tpool"); - initFloatingCoresTpool(dlsch_threads, &nrUE_params.Tpool, false, "UE-tpool"); + initFloatingCoresTpool(dlsch_threads, &nrUE_params.Tpool, false, "UE-tpool"); //gNB_config = &gNB->gNB_config; frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH) frame_parms->nb_antennas_tx = n_tx; @@ -430,6 +431,8 @@ int main(int argc, char **argv) //nr_init_frame_parms_ue(&UE->frame_parms); //init_nr_ue_transport(UE, 0); + UE->nrLDPC_coding_interface = gNB->nrLDPC_coding_interface; + NR_UE_DLSCH_t dlsch_ue[NR_MAX_NB_LAYERS > 4? 2:1] = {0}; int num_codeword = NR_MAX_NB_LAYERS > 4? 2:1; nr_ue_dlsch_init(dlsch_ue, num_codeword, 5); @@ -513,7 +516,8 @@ int main(int argc, char **argv) unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS] __attribute__((aligned(32))); bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS); if (input_fd == NULL) { - nr_dlsch_encoding(gNB, frame, slot, &dlsch->harq_process, frame_parms,output,NULL,NULL,NULL,NULL,NULL,NULL,NULL); + msgDataTx.num_pdsch_slot = 1; + nr_dlsch_encoding(gNB, &msgDataTx, frame, slot, frame_parms, output, NULL, NULL, NULL, NULL, NULL, NULL, NULL); } for (SNR = snr0; SNR < snr1; SNR += snr_step) { @@ -569,20 +573,18 @@ int main(int argc, char **argv) } uint32_t dlsch_bytes = a_segments*1056; // allocated bytes per segment __attribute__ ((aligned(32))) uint8_t b[dlsch_bytes]; + uint8_t DLSCH_ids[1] = {0}; + short *p_channel_output_fixed = channel_output_fixed; + uint8_t *p_b = b; + int available_bits_array[1] = { available_bits }; ret = nr_dlsch_decoding(UE, &proc, - 0, - channel_output_fixed, - &UE->frame_parms, dlsch0_ue, - harq_process, - frame, - nb_symb_sch, - slot, - harq_pid, - dlsch_bytes, - b, - available_bits); + &p_channel_output_fixed, + &p_b, + available_bits_array, + 1, + DLSCH_ids); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0, VCD_FUNCTION_OUT); @@ -661,7 +663,10 @@ int main(int argc, char **argv) free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list); free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list); + free_nrLDPC_coding_interface(&gNB->nrLDPC_coding_interface); + abortTpool(&gNB->threadPool); + phy_free_nr_gNB(gNB); free(RC.gNB[0]); free(RC.gNB); diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index c445bfb6a0..99ab0c82b1 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -47,7 +47,7 @@ #include "NR_ServingCellConfig.h" #include "NR_SetupRelease.h" #include "NR_UE_PHY_INTERFACE/NR_IF_Module.h" -#include "PHY/CODING/nrLDPC_extern.h" +#include "PHY/CODING/nrLDPC_coding/nrLDPC_coding_interface.h" #include "PHY/INIT/nr_phy_init.h" #include "PHY/MODULATION/modulation_common.h" #include "PHY/NR_REFSIG/ptrs_nr.h" @@ -297,7 +297,6 @@ int main(int argc, char **argv) uint8_t n_tx=1,n_rx=1; uint8_t round; uint8_t num_rounds = 4; - int ldpc_offload_flag = 0; char gNBthreads[128]="n"; channel_desc_t *gNB2UE; @@ -360,7 +359,7 @@ int main(int argc, char **argv) FILE *scg_fd=NULL; - while ((c = getopt(argc, argv, "--:O:f:hA:p:f:g:i:n:s:S:t:v:x:y:z:o:M:N:F:GR:d:PI:L:a:b:e:m:w:T:U:q:X:Y:Z:c")) != -1) { + while ((c = getopt(argc, argv, "--:O:f:hA:p:f:g:i:n:s:S:t:v:x:y:z:o:M:N:F:GR:d:PI:L:a:b:e:m:w:T:U:q:X:Y:Z:")) != -1) { /* ignore long options starting with '--', option '-O' and their arguments that are handled by configmodule */ /* with this opstring getopt returns 1 for non-option arguments, refer to 'man 3 getopt' */ @@ -412,10 +411,6 @@ int main(int argc, char **argv) n_trials = atoi(optarg); break; - case 'c': - ldpc_offload_flag = 1; - break; - case 's': snr0 = atof(optarg); printf("Setting SNR0 to %f\n",snr0); @@ -580,7 +575,6 @@ int main(int argc, char **argv) //printf("-j Relative strength of second intefering gNB (in dB) - cell_id mod 3 = 2\n"); printf("-R N_RB_DL\n"); printf("-O oversampling factor (1,2,4,8,16)\n"); - printf("-c ldpc offload flag\n"); printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n"); //printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n"); printf("-f raw file containing RRC configuration (generated by gNB)\n"); @@ -640,7 +634,6 @@ int main(int argc, char **argv) gNB = RC.gNB[0]; gNB->ofdm_offset_divisor = UINT_MAX; - gNB->ldpc_offload_flag = ldpc_offload_flag; gNB->phase_comp = true; // we need to perform phase compensation, otherwise everything will fail frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH) frame_parms->nb_antennas_tx = n_tx; @@ -849,6 +842,7 @@ int main(int argc, char **argv) memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); UE->frame_parms.nb_antennas_rx = n_rx; UE->frame_parms.nb_antenna_ports_gNB = n_tx; + UE->nrLDPC_coding_interface = gNB->nrLDPC_coding_interface; UE->max_ldpc_iterations = max_ldpc_iterations; init_nr_ue_phy_cpu_stats(&UE->phy_cpu_stats); @@ -1337,8 +1331,7 @@ int main(int argc, char **argv) free(UE->phy_sim_pdsch_dl_ch_estimates_ext); free(UE->phy_sim_dlsch_b); - if (gNB->ldpc_offload_flag) - free_LDPClib(&ldpc_interface_offload); + free_nrLDPC_coding_interface(&gNB->nrLDPC_coding_interface); if (output_fd) fclose(output_fd); diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c index f578e217e9..e2802feffd 100644 --- a/openair1/SIMULATION/NR_PHY/ulschsim.c +++ b/openair1/SIMULATION/NR_PHY/ulschsim.c @@ -33,6 +33,7 @@ #include "PHY/defs_nr_common.h" #include "PHY/defs_nr_UE.h" #include "PHY/defs_gNB.h" +#include "PHY/CODING/nrLDPC_coding/nrLDPC_coding_interface.h" #include "PHY/INIT/nr_phy_init.h" #include "PHY/NR_REFSIG/refsig_defs_ue.h" #include "PHY/MODULATION/modulation_eNB.h" @@ -90,28 +91,6 @@ void deref_sched_response(int _) exit(1); } -int nr_postDecode_sim(PHY_VARS_gNB *gNB, ldpcDecode_t *rdata, int *nb_ok) -{ - NR_UL_gNB_HARQ_t *ulsch_harq = rdata->ulsch_harq; - int r = rdata->segment_r; - - bool decodeSuccess = (rdata->decodeIterations <= rdata->decoderParms.numMaxIter); - ulsch_harq->processedSegments++; - - if (decodeSuccess) { - memcpy(ulsch_harq->b+rdata->offset, - ulsch_harq->c[r], - rdata->Kr_bytes - (ulsch_harq->F>>3) -((ulsch_harq->C>1)?3:0)); - } - - // if all segments are done - if (rdata->nbSegments == ulsch_harq->processedSegments) { - return *nb_ok == rdata->nbSegments; - } - - return 0; -} - nrUE_params_t nrUE_params; nrUE_params_t *get_nrUE_params(void) { @@ -143,7 +122,6 @@ int main(int argc, char **argv) NR_DL_FRAME_PARMS *frame_parms; double sigma; unsigned char qbits = 8; - int ret=0; int loglvl = OAILOG_WARNING; uint64_t SSB_positions=0x01; uint16_t nb_symb_sch = 12; @@ -439,6 +417,7 @@ int main(int argc, char **argv) UE->frame_parms.nb_antennas_tx = n_tx; UE->frame_parms.nb_antennas_rx = 1; + UE->nrLDPC_coding_interface = gNB->nrLDPC_coding_interface; //phy_init_nr_top(frame_parms); if (init_nr_ue_signal(UE, 1) != 0) { @@ -448,6 +427,8 @@ int main(int argc, char **argv) nr_init_ul_harq_processes(UE->ul_harq_processes, NR_MAX_ULSCH_HARQ_PROCESSES, UE->frame_parms.N_RB_UL, UE->frame_parms.nb_antennas_tx); + initFloatingCoresTpool(1, &nrUE_params.Tpool, false, "UE-tpool"); + unsigned char harq_pid = 0; unsigned int TBS = 8424; unsigned int available_bits; @@ -530,7 +511,8 @@ int main(int argc, char **argv) unsigned int G = available_bits; if (input_fd == NULL) { - nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, TBS>>3, G); + uint8_t ULSCH_ids[] = {0}; + nr_ulsch_encoding(UE, ulsch_ue, 0, 0, &G, 1, ULSCH_ids); } printf("\n"); @@ -594,21 +576,11 @@ int main(int argc, char **argv) exit(-1); #endif - ldpcDecode_t arr[16] = {0}; - task_ans_t ans[16] = {0}; - thread_info_tm_t t_info = {.buf = (uint8_t *)arr, .cap = 16, .len = 0, .ans = ans}; - int nbDecode = - nr_ulsch_decoding(gNB, UE_id, channel_output_fixed, frame_parms, rel15_ul, frame, subframe, harq_pid, G, &t_info); - DevAssert(nbDecode > 0); - - int nb_ok = 0; - join_task_ans(t_info.ans, t_info.len); - for (size_t i = 0; i < nbDecode; ++i) { - ret = nr_postDecode_sim(gNB, &arr[i], &nb_ok); - } - nbDecode = 0; - if (ret) + nr_ulsch_decoding(gNB, frame_parms, frame, subframe, &G, &UE_id, 1); + bool crc_valid = check_crc(harq_process_gNB->b, lenWithCrc(1, (harq_process_gNB->TBS) << 3), crcType(1, (harq_process_gNB->TBS) << 3)); + if (!crc_valid) { n_errors++; + } } printf("*****************************************\n"); @@ -633,6 +605,8 @@ int main(int argc, char **argv) free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list); free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list); + free_nrLDPC_coding_interface(&gNB->nrLDPC_coding_interface); + term_nr_ue_signal(UE, 1); free(UE); diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 8ffa0e4a3f..bdeab5a139 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -45,7 +45,7 @@ #include "NR_ReconfigurationWithSync.h" #include "NR_ServingCellConfig.h" #include "NR_UE-NR-Capability.h" -#include "PHY/CODING/nrLDPC_extern.h" +#include "PHY/CODING/nrLDPC_coding/nrLDPC_coding_interface.h" #include "PHY/INIT/nr_phy_init.h" #include "PHY/MODULATION/nr_modulation.h" #include "PHY/NR_REFSIG/dmrs_nr.h" @@ -212,7 +212,6 @@ int main(int argc, char *argv[]) double effRate; double effTP; float eff_tp_check = 100; - int ldpc_offload_flag = 0; uint8_t max_rounds = 4; int chest_type[2] = {0}; int enable_ptrs = 0; @@ -251,7 +250,7 @@ int main(int argc, char *argv[]) InitSinLUT(); int c; - while ((c = getopt(argc, argv, "--:O:a:b:c:d:ef:g:h:i:k:m:n:op:q:r:s:t:u:v:w:y:z:A:C:F:G:H:I:M:N:PR:S:T:U:L:ZW:E:X:")) != -1) { + while ((c = getopt(argc, argv, "--:O:a:b:c:d:ef:g:h:i:k:m:n:p:q:r:s:t:u:v:w:y:z:A:C:F:G:H:I:M:N:PR:S:T:U:L:ZW:E:X:")) != -1) { /* ignore long options starting with '--', option '-O' and their arguments that are handled by configmodule */ /* with this opstring getopt returns 1 for non-option arguments, refer to 'man 3 getopt' */ @@ -364,10 +363,6 @@ int main(int argc, char *argv[]) n_trials = atoi(optarg); break; - case 'o': - ldpc_offload_flag = 1; - break; - case 'p': extended_prefix_flag = 1; break; @@ -531,7 +526,6 @@ int main(int argc, char *argv[]) printf("-k 3/4 sampling\n"); printf("-m MCS value\n"); printf("-n Number of trials to simulate\n"); - printf("-o ldpc offload flag\n"); printf("-p Use extended prefix mode\n"); printf("-q MCS table\n"); printf("-r Number of allocated resource blocks for PUSCH\n"); @@ -682,7 +676,6 @@ int main(int argc, char *argv[]) cfg->carrier_config.num_rx_ant.value = n_rx; // nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,0,0x01); - gNB->ldpc_offload_flag = ldpc_offload_flag; gNB->chest_freq = chest_type[0]; gNB->chest_time = chest_type[1]; @@ -729,6 +722,7 @@ int main(int argc, char *argv[]) memcpy(&UE->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS)); UE->frame_parms.nb_antennas_tx = n_tx; UE->frame_parms.nb_antennas_rx = 0; + UE->nrLDPC_coding_interface = gNB->nrLDPC_coding_interface; if (init_nr_ue_signal(UE, 1) != 0) { printf("Error at UE NR initialisation\n"); @@ -751,6 +745,8 @@ int main(int argc, char *argv[]) UE_mac->if_module = nr_ue_if_module_init(0); + initFloatingCoresTpool(threadCnt, &nrUE_params.Tpool, false, "UE-tpool"); + nr_ue_phy_config_request(&UE_mac->phy_config); unsigned char harq_pid = 0; @@ -1596,8 +1592,8 @@ int main(int argc, char *argv[]) num_dmrs_cdm_grps_no_data); free_MIB_NR(mib); - if (gNB->ldpc_offload_flag) - free_LDPClib(&ldpc_interface_offload); + + free_nrLDPC_coding_interface(&gNB->nrLDPC_coding_interface); if (output_fd) fclose(output_fd);