Revert "Multiple RXTX sequential threads"
This reverts commit 85e1c34c65.
This commit is contained in:
+41
-49
@@ -26,7 +26,6 @@
|
|||||||
#include "RRC/NR_UE/rrc_proto.h"
|
#include "RRC/NR_UE/rrc_proto.h"
|
||||||
#include "SCHED_NR_UE/phy_frame_config_nr.h"
|
#include "SCHED_NR_UE/phy_frame_config_nr.h"
|
||||||
#include "SCHED_NR_UE/defs.h"
|
#include "SCHED_NR_UE/defs.h"
|
||||||
#include "SCHED_NR_UE/pucch_uci_ue_nr.h"
|
|
||||||
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
|
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
|
||||||
#include "executables/softmodem-common.h"
|
#include "executables/softmodem-common.h"
|
||||||
|
|
||||||
@@ -93,8 +92,6 @@
|
|||||||
#define DURATION_RX_TO_TX (6) /* For LTE, this duration is fixed to 4 and it is linked to LTE standard for both modes FDD/TDD */
|
#define DURATION_RX_TO_TX (6) /* For LTE, this duration is fixed to 4 and it is linked to LTE standard for both modes FDD/TDD */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define RX_JOB_ID 0x1010
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
pss = 0,
|
pss = 0,
|
||||||
pbch = 1,
|
pbch = 1,
|
||||||
@@ -133,7 +130,10 @@ void init_nr_ue_vars(PHY_VARS_NR_UE *ue,
|
|||||||
* \param arg is a pointer to a \ref PHY_VARS_NR_UE structure.
|
* \param arg is a pointer to a \ref PHY_VARS_NR_UE structure.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef nr_rxtx_thread_data_t syncData_t;
|
typedef struct syncData_s {
|
||||||
|
UE_nr_rxtx_proc_t proc;
|
||||||
|
PHY_VARS_NR_UE *UE;
|
||||||
|
} syncData_t;
|
||||||
|
|
||||||
static void UE_synch(void *arg) {
|
static void UE_synch(void *arg) {
|
||||||
syncData_t *syncD=(syncData_t *) arg;
|
syncData_t *syncD=(syncData_t *) arg;
|
||||||
@@ -359,10 +359,7 @@ void processSlotRX(void *arg) {
|
|||||||
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
||||||
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
||||||
int rx_slot_type = nr_ue_slot_select(cfg, proc->frame_rx, proc->nr_slot_rx);
|
int rx_slot_type = nr_ue_slot_select(cfg, proc->frame_rx, proc->nr_slot_rx);
|
||||||
int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx);
|
|
||||||
uint8_t gNB_id = 0;
|
uint8_t gNB_id = 0;
|
||||||
bool check_tx_finish = true;
|
|
||||||
bool check_rx_finish = true;
|
|
||||||
|
|
||||||
if (rx_slot_type == NR_DOWNLINK_SLOT || rx_slot_type == NR_MIXED_SLOT){
|
if (rx_slot_type == NR_DOWNLINK_SLOT || rx_slot_type == NR_MIXED_SLOT){
|
||||||
|
|
||||||
@@ -390,21 +387,26 @@ void processSlotRX(void *arg) {
|
|||||||
|
|
||||||
// Wait for PUSCH processing to finish
|
// Wait for PUSCH processing to finish
|
||||||
notifiedFIFO_elt_t *res;
|
notifiedFIFO_elt_t *res;
|
||||||
while (check_tx_finish || check_rx_finish) { // Loop through the FIFO for the current slot msg
|
res = pullTpool(UE->txFifo,&(get_nrUE_params()->Tpool));
|
||||||
// under the assumption that no two slots with same slot index of different frames are processed at the same time
|
pushNotifiedFIFO_nothreadSafe(UE->txFifo, res);
|
||||||
res = pullTpool(UE->respPdsch,&(get_nrUE_params()->Tpool));
|
|
||||||
if (res->key == proc->nr_slot_rx) check_rx_finish = false;
|
if (get_softmodem_params()->usim_test==0) {
|
||||||
pushNotifiedFIFO_nothreadSafe(UE->respPdsch, res);
|
pucch_procedures_ue_nr(UE,
|
||||||
res = pullTpool(UE->txFifo,&(get_nrUE_params()->Tpool));
|
gNB_id,
|
||||||
if (res->key == proc->nr_slot_tx) check_tx_finish = false;
|
proc,
|
||||||
pushNotifiedFIFO_nothreadSafe(UE->txFifo, res);
|
FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG_D(PHY, "Sending Uplink data \n");
|
||||||
|
nr_ue_pusch_common_procedures(UE,
|
||||||
|
proc->nr_slot_tx,
|
||||||
|
&UE->frame_parms,1);
|
||||||
|
|
||||||
|
ue_ta_procedures(UE, proc->nr_slot_tx, proc->frame_tx);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
processSlotTX(rxtxD);
|
processSlotTX(rxtxD);
|
||||||
}
|
|
||||||
|
|
||||||
if (tx_slot_type == NR_UPLINK_SLOT || tx_slot_type == NR_MIXED_SLOT){
|
|
||||||
if (get_softmodem_params()->usim_test==0) {
|
if (get_softmodem_params()->usim_test==0) {
|
||||||
pucch_procedures_ue_nr(UE,
|
pucch_procedures_ue_nr(UE,
|
||||||
gNB_id,
|
gNB_id,
|
||||||
@@ -547,32 +549,25 @@ void *UE_thread(void *arg) {
|
|||||||
notifiedFIFO_t rxFifo;
|
notifiedFIFO_t rxFifo;
|
||||||
UE->rxFifo = &rxFifo;
|
UE->rxFifo = &rxFifo;
|
||||||
initNotifiedFIFO(&rxFifo);
|
initNotifiedFIFO(&rxFifo);
|
||||||
|
pushNotifiedFIFO_nothreadSafe(&rxFifo, newNotifiedFIFO_elt(sizeof(nr_rxtx_thread_data_t), 1,&rxFifo,processSlotRX));
|
||||||
|
|
||||||
notifiedFIFO_t txFifo;
|
notifiedFIFO_t txFifo;
|
||||||
UE->txFifo = &txFifo;
|
UE->txFifo = &txFifo;
|
||||||
initNotifiedFIFO(&txFifo);
|
initNotifiedFIFO(&txFifo);
|
||||||
|
pushNotifiedFIFO_nothreadSafe(&txFifo, newNotifiedFIFO_elt(sizeof(nr_rxtx_thread_data_t), 1,&txFifo,processSlotTX));
|
||||||
|
|
||||||
notifiedFIFO_t respPdsch;
|
int nbSlotProcessing=0;
|
||||||
UE->respPdsch = &respPdsch;
|
|
||||||
initNotifiedFIFO(&respPdsch);
|
|
||||||
|
|
||||||
int thread_idx=0;
|
int thread_idx=0;
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||||
int timing_advance = UE->timing_advance;
|
int timing_advance = UE->timing_advance;
|
||||||
|
|
||||||
bool syncRunning=false;
|
bool syncRunning=false;
|
||||||
const int nb_slot_frame = UE->frame_parms.slots_per_frame;
|
const int nb_slot_frame = UE->frame_parms.slots_per_frame;
|
||||||
int absolute_slot=0, decoded_frame_rx=-1, trashed_frames=0;
|
int absolute_slot=0, decoded_frame_rx=INT_MAX, trashed_frames=0;
|
||||||
|
|
||||||
for (int i=0; i<RX_NB_TH; i++) {
|
|
||||||
pushNotifiedFIFO_nothreadSafe(&rxFifo, newNotifiedFIFO_elt(sizeof(nr_rxtx_thread_data_t), RX_JOB_ID,&rxFifo,processSlotRX));
|
|
||||||
pushNotifiedFIFO_nothreadSafe(&txFifo, newNotifiedFIFO_elt(sizeof(nr_rxtx_thread_data_t), 1,&txFifo,processSlotTX));
|
|
||||||
pushNotifiedFIFO_nothreadSafe(&respPdsch, newNotifiedFIFO_elt(sizeof(pdsch_rx_thread_data_t), 1,&respPdsch,processPdsch));
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!oai_exit) {
|
while (!oai_exit) {
|
||||||
if (UE->lost_sync) {
|
if (UE->lost_sync) {
|
||||||
abortTpool(&(get_nrUE_params()->Tpool),RX_JOB_ID);
|
abortTpool(&(get_nrUE_params()->Tpool),0);
|
||||||
UE->is_synchronized = 0;
|
UE->is_synchronized = 0;
|
||||||
UE->lost_sync = 0;
|
UE->lost_sync = 0;
|
||||||
}
|
}
|
||||||
@@ -640,6 +635,18 @@ void *UE_thread(void *arg) {
|
|||||||
// this is general failure in UE !!!
|
// this is general failure in UE !!!
|
||||||
thread_idx = absolute_slot % RX_NB_TH;
|
thread_idx = absolute_slot % RX_NB_TH;
|
||||||
int slot_nr = absolute_slot % nb_slot_frame;
|
int slot_nr = absolute_slot % nb_slot_frame;
|
||||||
|
notifiedFIFO_elt_t *msgToPush;
|
||||||
|
AssertFatal((msgToPush=pullTpool(&rxFifo,&(get_nrUE_params()->Tpool))) != NULL,"chained list failure");
|
||||||
|
nr_rxtx_thread_data_t *curMsg=(nr_rxtx_thread_data_t *)NotifiedFifoData(msgToPush);
|
||||||
|
curMsg->UE=UE;
|
||||||
|
// update thread index for received subframe
|
||||||
|
curMsg->proc.thread_id = thread_idx;
|
||||||
|
curMsg->proc.CC_id = UE->CC_id;
|
||||||
|
curMsg->proc.nr_slot_rx = slot_nr;
|
||||||
|
curMsg->proc.nr_slot_tx = (absolute_slot + DURATION_RX_TO_TX) % nb_slot_frame;
|
||||||
|
curMsg->proc.frame_rx = (absolute_slot/nb_slot_frame) % MAX_FRAME_NUMBER;
|
||||||
|
curMsg->proc.frame_tx = ((absolute_slot+DURATION_RX_TO_TX)/nb_slot_frame) % MAX_FRAME_NUMBER;
|
||||||
|
curMsg->proc.decoded_frame_rx=-1;
|
||||||
//LOG_I(PHY,"Process slot %d thread Idx %d total gain %d\n", slot_nr, thread_idx, UE->rx_total_gain_dB);
|
//LOG_I(PHY,"Process slot %d thread Idx %d total gain %d\n", slot_nr, thread_idx, UE->rx_total_gain_dB);
|
||||||
|
|
||||||
#ifdef OAI_ADRV9371_ZC706
|
#ifdef OAI_ADRV9371_ZC706
|
||||||
@@ -695,30 +702,13 @@ void *UE_thread(void *arg) {
|
|||||||
LOG_E(PHY,"can't compensate: diff =%d\n", first_symbols);
|
LOG_E(PHY,"can't compensate: diff =%d\n", first_symbols);
|
||||||
}
|
}
|
||||||
|
|
||||||
notifiedFIFO_elt_t *msgToPush;
|
|
||||||
AssertFatal((msgToPush=pullTpool(&rxFifo,&(get_nrUE_params()->Tpool))) != NULL,"chained list failure");
|
|
||||||
nr_rxtx_thread_data_t *curMsg=(nr_rxtx_thread_data_t *)NotifiedFifoData(msgToPush);
|
|
||||||
// Extract the received frame number
|
|
||||||
if (curMsg->proc.decoded_frame_rx != -1)
|
|
||||||
decoded_frame_rx=(((mac->mib->systemFrameNumber.buf[0] >> mac->mib->systemFrameNumber.bits_unused)<<4) | curMsg->proc.decoded_frame_rx);
|
|
||||||
else
|
|
||||||
decoded_frame_rx=-1;
|
|
||||||
|
|
||||||
curMsg->UE=UE;
|
|
||||||
// update thread index for received subframe
|
|
||||||
curMsg->proc.thread_id = thread_idx;
|
|
||||||
curMsg->proc.CC_id = UE->CC_id;
|
|
||||||
curMsg->proc.nr_slot_rx = slot_nr;
|
|
||||||
curMsg->proc.nr_slot_tx = (absolute_slot + DURATION_RX_TO_TX) % nb_slot_frame;
|
|
||||||
curMsg->proc.frame_rx = (absolute_slot/nb_slot_frame) % MAX_FRAME_NUMBER;
|
|
||||||
curMsg->proc.frame_tx = ((absolute_slot+DURATION_RX_TO_TX)/nb_slot_frame) % MAX_FRAME_NUMBER;
|
|
||||||
curMsg->proc.decoded_frame_rx=-1;
|
|
||||||
curMsg->proc.timestamp_tx = timestamp+
|
curMsg->proc.timestamp_tx = timestamp+
|
||||||
UE->frame_parms.get_samples_slot_timestamp(slot_nr,
|
UE->frame_parms.get_samples_slot_timestamp(slot_nr,
|
||||||
&UE->frame_parms,DURATION_RX_TO_TX) - firstSymSamp;
|
&UE->frame_parms,DURATION_RX_TO_TX) - firstSymSamp;
|
||||||
|
|
||||||
// Check if the processed frame number is same as the received frame number;
|
decoded_frame_rx=-1;
|
||||||
if (decoded_frame_rx>0 && decoded_frame_rx != curMsg->proc.frame_rx)
|
|
||||||
|
if ( decoded_frame_rx>0 && decoded_frame_rx != curMsg->proc.frame_rx)
|
||||||
LOG_E(PHY,"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode\n",
|
LOG_E(PHY,"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode\n",
|
||||||
decoded_frame_rx, curMsg->proc.frame_rx );
|
decoded_frame_rx, curMsg->proc.frame_rx );
|
||||||
|
|
||||||
@@ -757,6 +747,8 @@ void *UE_thread(void *arg) {
|
|||||||
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
||||||
memset(txp[i], 0, writeBlockSize);
|
memset(txp[i], 0, writeBlockSize);
|
||||||
|
|
||||||
|
nbSlotProcessing++;
|
||||||
|
msgToPush->key=1;
|
||||||
pushTpool(&(get_nrUE_params()->Tpool), msgToPush);
|
pushTpool(&(get_nrUE_params()->Tpool), msgToPush);
|
||||||
|
|
||||||
} // while !oai_exit
|
} // while !oai_exit
|
||||||
|
|||||||
@@ -214,16 +214,9 @@ nrUE_params_t *get_nrUE_params(void) {
|
|||||||
}
|
}
|
||||||
/* initialie thread pools used for NRUE processing paralleliation */
|
/* initialie thread pools used for NRUE processing paralleliation */
|
||||||
void init_tpools(uint8_t nun_dlsch_threads) {
|
void init_tpools(uint8_t nun_dlsch_threads) {
|
||||||
char *params = NULL;
|
char *params=calloc(1,(RX_NB_TH*3)+1);
|
||||||
if (IS_SOFTMODEM_RFSIM) {
|
for (int i=0; i<RX_NB_TH; i++) {
|
||||||
params = calloc(1,2);
|
memcpy(params+(i*3),"-1,",3);
|
||||||
memcpy(params,"N",1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
params = calloc(1,(RX_NB_TH*RX_NB_TH_PL*3)+1);
|
|
||||||
for (int i=0; i<RX_NB_TH*RX_NB_TH_PL; i++) {
|
|
||||||
memcpy(params+(i*3),"-1,",3);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
initTpool(params, &(nrUE_params.Tpool), false);
|
initTpool(params, &(nrUE_params.Tpool), false);
|
||||||
free(params);
|
free(params);
|
||||||
@@ -247,6 +240,7 @@ static void get_options(void) {
|
|||||||
printf("%s\n",uecap_xer);
|
printf("%s\n",uecap_xer);
|
||||||
uecap_xer_in=1;
|
uecap_xer_in=1;
|
||||||
} /* UE with config file */
|
} /* UE with config file */
|
||||||
|
init_tpools(nrUE_params.nr_dlsch_parallel);
|
||||||
}
|
}
|
||||||
|
|
||||||
// set PHY vars from command line
|
// set PHY vars from command line
|
||||||
@@ -484,7 +478,6 @@ int main( int argc, char **argv ) {
|
|||||||
get_options (); //Command-line options specific for NRUE
|
get_options (); //Command-line options specific for NRUE
|
||||||
|
|
||||||
get_common_options(SOFTMODEM_5GUE_BIT );
|
get_common_options(SOFTMODEM_5GUE_BIT );
|
||||||
init_tpools(nrUE_params.nr_dlsch_parallel);
|
|
||||||
CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP);
|
CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP);
|
||||||
#if T_TRACER
|
#if T_TRACER
|
||||||
T_Config_Init();
|
T_Config_Init();
|
||||||
|
|||||||
@@ -1741,8 +1741,6 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t subframe);
|
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t subframe);
|
||||||
|
|
||||||
void *dlsch_thread(void *arg);
|
void *dlsch_thread(void *arg);
|
||||||
|
|
||||||
void processPdsch(void *arg);
|
|
||||||
/**@}*/
|
/**@}*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,6 @@
|
|||||||
|
|
||||||
#define RX_NB_TH_MAX 2
|
#define RX_NB_TH_MAX 2
|
||||||
#define RX_NB_TH 2
|
#define RX_NB_TH 2
|
||||||
#define RX_NB_TH_PL 2 //number of parallel jobs per slot
|
|
||||||
#define RX_NB_TH_DL 14
|
#define RX_NB_TH_DL 14
|
||||||
|
|
||||||
#define LTE_SLOTS_PER_SUBFRAME 2
|
#define LTE_SLOTS_PER_SUBFRAME 2
|
||||||
|
|||||||
@@ -1068,7 +1068,6 @@ typedef struct {
|
|||||||
#endif
|
#endif
|
||||||
notifiedFIFO_t *rxFifo;
|
notifiedFIFO_t *rxFifo;
|
||||||
notifiedFIFO_t *txFifo;
|
notifiedFIFO_t *txFifo;
|
||||||
notifiedFIFO_t *respPdsch;
|
|
||||||
|
|
||||||
int dl_stats[5];
|
int dl_stats[5];
|
||||||
|
|
||||||
@@ -1082,10 +1081,5 @@ typedef struct nr_rxtx_thread_data_s {
|
|||||||
PHY_VARS_NR_UE *UE;
|
PHY_VARS_NR_UE *UE;
|
||||||
} nr_rxtx_thread_data_t;
|
} nr_rxtx_thread_data_t;
|
||||||
|
|
||||||
typedef struct pdsch_rx_thread_data_s {
|
|
||||||
nr_rxtx_thread_data_t rxtxD;
|
|
||||||
int gNB_id;
|
|
||||||
uint8_t dlsch_parallel;
|
|
||||||
} pdsch_rx_thread_data_t;
|
|
||||||
#include "SIMULATION/ETH_TRANSPORT/defs.h"
|
#include "SIMULATION/ETH_TRANSPORT/defs.h"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1684,245 +1684,13 @@ int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void processPdsch(void *arg) {
|
|
||||||
|
|
||||||
pdsch_rx_thread_data_t *param = (pdsch_rx_thread_data_t *) arg;
|
|
||||||
UE_nr_rxtx_proc_t *proc = ¶m->rxtxD.proc;
|
|
||||||
PHY_VARS_NR_UE *ue = param->rxtxD.UE;
|
|
||||||
int gNB_id = param->gNB_id;
|
|
||||||
uint8_t dlsch_parallel = param->dlsch_parallel;
|
|
||||||
#if UE_TIMING_TRACE
|
|
||||||
start_meas(&ue->generic_stat);
|
|
||||||
#endif
|
|
||||||
// do procedures for C-RNTI
|
|
||||||
int ret_pdsch = 0;
|
|
||||||
if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1) {
|
|
||||||
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
|
|
||||||
ret_pdsch = nr_ue_pdsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
PDSCH,
|
|
||||||
ue->dlsch[proc->thread_id][gNB_id][0],
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
nr_ue_measurement_procedures(2, ue, proc, gNB_id, proc->nr_slot_rx);
|
|
||||||
}
|
|
||||||
|
|
||||||
// do procedures for SI-RNTI
|
|
||||||
if ((ue->dlsch_SI[gNB_id]) && (ue->dlsch_SI[gNB_id]->active == 1)) {
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_IN);
|
|
||||||
nr_ue_pdsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
SI_PDSCH,
|
|
||||||
ue->dlsch_SI[gNB_id],
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
nr_ue_dlsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
SI_PDSCH,
|
|
||||||
ue->dlsch_SI[gNB_id],
|
|
||||||
NULL,
|
|
||||||
&ue->dlsch_SI_errors[gNB_id],
|
|
||||||
dlsch_parallel);
|
|
||||||
|
|
||||||
// deactivate dlsch once dlsch proc is done
|
|
||||||
ue->dlsch_SI[gNB_id]->active = 0;
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_OUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
// do procedures for P-RNTI
|
|
||||||
if ((ue->dlsch_p[gNB_id]) && (ue->dlsch_p[gNB_id]->active == 1)) {
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_IN);
|
|
||||||
nr_ue_pdsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
P_PDSCH,
|
|
||||||
ue->dlsch_p[gNB_id],
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
nr_ue_dlsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
P_PDSCH,
|
|
||||||
ue->dlsch_p[gNB_id],
|
|
||||||
NULL,
|
|
||||||
&ue->dlsch_p_errors[gNB_id],
|
|
||||||
dlsch_parallel);
|
|
||||||
|
|
||||||
// deactivate dlsch once dlsch proc is done
|
|
||||||
ue->dlsch_p[gNB_id]->active = 0;
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_OUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
// do procedures for RA-RNTI
|
|
||||||
if ((ue->dlsch_ra[gNB_id]) && (ue->dlsch_ra[gNB_id]->active == 1) && (ue->UE_mode[gNB_id] != PUSCH)) {
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_IN);
|
|
||||||
nr_ue_pdsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
RA_PDSCH,
|
|
||||||
ue->dlsch_ra[gNB_id],
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
nr_ue_dlsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
RA_PDSCH,
|
|
||||||
ue->dlsch_ra[gNB_id],
|
|
||||||
NULL,
|
|
||||||
&ue->dlsch_ra_errors[gNB_id],
|
|
||||||
dlsch_parallel);
|
|
||||||
|
|
||||||
// deactivate dlsch once dlsch proc is done
|
|
||||||
ue->dlsch_ra[gNB_id]->active = 0;
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_OUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
// do procedures for C-RNTI
|
|
||||||
if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1) {
|
|
||||||
|
|
||||||
LOG_D(PHY, "DLSCH data reception at proc->nr_slot_rx: %d \n \n", proc->nr_slot_rx);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
|
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
|
||||||
start_meas(&ue->dlsch_procedures_stat[proc->thread_id]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ret_pdsch >= 0)
|
|
||||||
nr_ue_dlsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
PDSCH,
|
|
||||||
ue->dlsch[proc->thread_id][gNB_id][0],
|
|
||||||
ue->dlsch[proc->thread_id][gNB_id][1],
|
|
||||||
&ue->dlsch_errors[gNB_id],
|
|
||||||
dlsch_parallel);
|
|
||||||
|
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
|
||||||
stop_meas(&ue->dlsch_procedures_stat[proc->thread_id]);
|
|
||||||
#if DISABLE_LOG_X
|
|
||||||
printf("[SFN %d] Slot1: Pdsch Proc %5.2f\n",proc->nr_slot_rx,ue->pdsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
|
|
||||||
printf("[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",proc->nr_slot_rx,ue->dlsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
|
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[SFN %d] Slot1: Pdsch Proc %5.2f\n",proc->nr_slot_rx,ue->pdsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
|
|
||||||
LOG_D(PHY, "[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",proc->nr_slot_rx,ue->dlsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// deactivate dlsch once dlsch proc is done
|
|
||||||
ue->dlsch[proc->thread_id][gNB_id][0]->active = 0;
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
|
||||||
start_meas(&ue->generic_stat);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
if(proc->nr_slot_rx==5 && ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid]->nb_rb > 20){
|
|
||||||
//write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0);
|
|
||||||
//write_output("llr.m","llr", &ue->pdsch_vars[proc->thread_id][gNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
|
|
||||||
|
|
||||||
write_output("rxdataF0_current.m" , "rxdataF0", &ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][0],14*fp->ofdm_symbol_size,1,1);
|
|
||||||
//write_output("rxdataF0_previous.m" , "rxdataF0_prev_sss", &ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF[0][0],14*fp->ofdm_symbol_size,1,1);
|
|
||||||
|
|
||||||
//write_output("rxdataF0_previous.m" , "rxdataF0_prev", &ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF[0][0],14*fp->ofdm_symbol_size,1,1);
|
|
||||||
|
|
||||||
write_output("dl_ch_estimates.m", "dl_ch_estimates_sfn5", &ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].dl_ch_estimates[0][0][0],14*fp->ofdm_symbol_size,1,1);
|
|
||||||
write_output("dl_ch_estimates_ext.m", "dl_ch_estimatesExt_sfn5", &ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates_ext[0][0],14*fp->N_RB_DL*12,1,1);
|
|
||||||
write_output("rxdataF_comp00.m","rxdataF_comp00", &ue->pdsch_vars[proc->thread_id][gNB_id]->rxdataF_comp0[0][0],14*fp->N_RB_DL*12,1,1);
|
|
||||||
//write_output("magDLFirst.m", "magDLFirst", &phy_vars_ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_mag0[0][0],14*fp->N_RB_DL*12,1,1);
|
|
||||||
//write_output("magDLSecond.m", "magDLSecond", &phy_vars_ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_magb0[0][0],14*fp->N_RB_DL*12,1,1);
|
|
||||||
|
|
||||||
AssertFatal (0,"");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// duplicate harq structure
|
|
||||||
/*
|
|
||||||
uint8_t current_harq_pid = ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid;
|
|
||||||
NR_DL_UE_HARQ_t *current_harq_processes = ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[current_harq_pid];
|
|
||||||
NR_DL_UE_HARQ_t *harq_processes_dest = ue->dlsch[next1_thread_id][gNB_id][0]->harq_processes[current_harq_pid];
|
|
||||||
NR_DL_UE_HARQ_t *harq_processes_dest1 = ue->dlsch[next2_thread_id][gNB_id][0]->harq_processes[current_harq_pid];
|
|
||||||
*/
|
|
||||||
/*nr_harq_status_t *current_harq_ack = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_ack[proc->nr_slot_rx];
|
|
||||||
nr_harq_status_t *harq_ack_dest = &ue->dlsch[next1_thread_id][gNB_id][0]->harq_ack[proc->nr_slot_rx];
|
|
||||||
nr_harq_status_t *harq_ack_dest1 = &ue->dlsch[next2_thread_id][gNB_id][0]->harq_ack[proc->nr_slot_rx];
|
|
||||||
*/
|
|
||||||
|
|
||||||
//copy_harq_proc_struct(harq_processes_dest, current_harq_processes);
|
|
||||||
//copy_ack_struct(harq_ack_dest, current_harq_ack);
|
|
||||||
|
|
||||||
//copy_harq_proc_struct(harq_processes_dest1, current_harq_processes);
|
|
||||||
//copy_ack_struct(harq_ack_dest1, current_harq_ack);
|
|
||||||
|
|
||||||
if (proc->nr_slot_rx==9) {
|
|
||||||
if (proc->frame_rx % 10 == 0) {
|
|
||||||
if ((ue->dlsch_received[gNB_id] - ue->dlsch_received_last[gNB_id]) != 0)
|
|
||||||
ue->dlsch_fer[gNB_id] = (100*(ue->dlsch_errors[gNB_id] - ue->dlsch_errors_last[gNB_id]))/(ue->dlsch_received[gNB_id] - ue->dlsch_received_last[gNB_id]);
|
|
||||||
|
|
||||||
ue->dlsch_errors_last[gNB_id] = ue->dlsch_errors[gNB_id];
|
|
||||||
ue->dlsch_received_last[gNB_id] = ue->dlsch_received[gNB_id];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ue->bitrate[gNB_id] = (ue->total_TBS[gNB_id] - ue->total_TBS_last[gNB_id])*100;
|
|
||||||
ue->total_TBS_last[gNB_id] = ue->total_TBS[gNB_id];
|
|
||||||
LOG_D(PHY,"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits\n",
|
|
||||||
ue->Mod_id,proc->frame_rx,ue->total_TBS[gNB_id],
|
|
||||||
ue->total_TBS_last[gNB_id],(float) ue->bitrate[gNB_id]/1000.0);
|
|
||||||
|
|
||||||
#if UE_AUTOTEST_TRACE
|
|
||||||
if ((proc->frame_rx % 100 == 0)) {
|
|
||||||
LOG_I(PHY,"[UE %d] AUTOTEST Metric : UE_DLSCH_BITRATE = %5.2f kbps (frame = %d) \n", ue->Mod_id, (float) ue->bitrate[gNB_id]/1000.0, proc->frame_rx);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
|
||||||
stop_meas(&ue->generic_stat);
|
|
||||||
printf("after tubo until end of Rx %5.2f \n",ue->generic_stat.p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef EMOS
|
|
||||||
phy_procedures_emos_UE_RX(ue,slot,gNB_id);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
|
|
||||||
|
|
||||||
#if UE_TIMING_TRACE
|
|
||||||
stop_meas(&ue->phy_proc_rx[proc->thread_id]);
|
|
||||||
#if DISABLE_LOG_X
|
|
||||||
printf("------FULL RX PROC [SFN %d]: %5.2f ------\n",proc->nr_slot_rx,ue->phy_proc_rx[proc->thread_id].p_time/(cpuf*1000.0));
|
|
||||||
#else
|
|
||||||
LOG_D(PHY, "------FULL RX PROC [SFN %d]: %5.2f ------\n",proc->nr_slot_rx,ue->phy_proc_rx[proc->thread_id].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//#endif //pdsch
|
|
||||||
|
|
||||||
LOG_D(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", proc->frame_rx%1024, proc->nr_slot_rx);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
||||||
UE_nr_rxtx_proc_t *proc,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t gNB_id,
|
uint8_t gNB_id,
|
||||||
uint8_t dlsch_parallel
|
uint8_t dlsch_parallel
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
int frame_rx = proc->frame_rx;
|
int frame_rx = proc->frame_rx;
|
||||||
int nr_slot_rx = proc->nr_slot_rx;
|
int nr_slot_rx = proc->nr_slot_rx;
|
||||||
int slot_pbch;
|
int slot_pbch;
|
||||||
@@ -2087,26 +1855,239 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
#endif //NR_PDCCH_SCHED
|
#endif //NR_PDCCH_SCHED
|
||||||
|
|
||||||
|
// Start PUSCH processing here. It runs in parallel with PDSCH processing
|
||||||
notifiedFIFO_elt_t *res;
|
notifiedFIFO_elt_t *res;
|
||||||
// Start PDSCH processing
|
|
||||||
res = pullTpool(ue->respPdsch,&(get_nrUE_params()->Tpool));
|
|
||||||
pdsch_rx_thread_data_t *curMsgRx=(pdsch_rx_thread_data_t *)NotifiedFifoData(res);
|
|
||||||
curMsgRx->rxtxD.proc = *proc;
|
|
||||||
curMsgRx->rxtxD.UE = ue;
|
|
||||||
curMsgRx->gNB_id = gNB_id;
|
|
||||||
curMsgRx->dlsch_parallel = dlsch_parallel;
|
|
||||||
res->key = proc->nr_slot_rx;
|
|
||||||
pushTpool(&(get_nrUE_params()->Tpool), res);
|
|
||||||
|
|
||||||
// Start PUSCH processing
|
|
||||||
res = pullTpool(ue->txFifo,&(get_nrUE_params()->Tpool));
|
res = pullTpool(ue->txFifo,&(get_nrUE_params()->Tpool));
|
||||||
nr_rxtx_thread_data_t *curMsg=(nr_rxtx_thread_data_t *)NotifiedFifoData(res);
|
nr_rxtx_thread_data_t *curMsg=(nr_rxtx_thread_data_t *)NotifiedFifoData(res);
|
||||||
curMsg->proc = *proc;
|
curMsg->proc = *proc;
|
||||||
curMsg->UE = ue;
|
curMsg->UE = ue;
|
||||||
res->key = proc->nr_slot_tx;
|
res->key = 1;
|
||||||
pushTpool(&(get_nrUE_params()->Tpool), res);
|
pushTpool(&(get_nrUE_params()->Tpool), res);
|
||||||
|
|
||||||
return (0);
|
#if UE_TIMING_TRACE
|
||||||
|
start_meas(&ue->generic_stat);
|
||||||
|
#endif
|
||||||
|
// do procedures for C-RNTI
|
||||||
|
int ret_pdsch = 0;
|
||||||
|
if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1) {
|
||||||
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
|
||||||
|
ret_pdsch = nr_ue_pdsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
gNB_id,
|
||||||
|
PDSCH,
|
||||||
|
ue->dlsch[proc->thread_id][gNB_id][0],
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
nr_ue_measurement_procedures(2, ue, proc, gNB_id, nr_slot_rx);
|
||||||
|
}
|
||||||
|
|
||||||
|
// do procedures for SI-RNTI
|
||||||
|
if ((ue->dlsch_SI[gNB_id]) && (ue->dlsch_SI[gNB_id]->active == 1)) {
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_IN);
|
||||||
|
nr_ue_pdsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
gNB_id,
|
||||||
|
SI_PDSCH,
|
||||||
|
ue->dlsch_SI[gNB_id],
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
nr_ue_dlsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
gNB_id,
|
||||||
|
SI_PDSCH,
|
||||||
|
ue->dlsch_SI[gNB_id],
|
||||||
|
NULL,
|
||||||
|
&ue->dlsch_SI_errors[gNB_id],
|
||||||
|
dlsch_parallel);
|
||||||
|
|
||||||
|
// deactivate dlsch once dlsch proc is done
|
||||||
|
ue->dlsch_SI[gNB_id]->active = 0;
|
||||||
|
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_OUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
// do procedures for P-RNTI
|
||||||
|
if ((ue->dlsch_p[gNB_id]) && (ue->dlsch_p[gNB_id]->active == 1)) {
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_IN);
|
||||||
|
nr_ue_pdsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
gNB_id,
|
||||||
|
P_PDSCH,
|
||||||
|
ue->dlsch_p[gNB_id],
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
nr_ue_dlsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
gNB_id,
|
||||||
|
P_PDSCH,
|
||||||
|
ue->dlsch_p[gNB_id],
|
||||||
|
NULL,
|
||||||
|
&ue->dlsch_p_errors[gNB_id],
|
||||||
|
dlsch_parallel);
|
||||||
|
|
||||||
|
// deactivate dlsch once dlsch proc is done
|
||||||
|
ue->dlsch_p[gNB_id]->active = 0;
|
||||||
|
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_OUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
// do procedures for RA-RNTI
|
||||||
|
if ((ue->dlsch_ra[gNB_id]) && (ue->dlsch_ra[gNB_id]->active == 1) && (ue->UE_mode[gNB_id] != PUSCH)) {
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_IN);
|
||||||
|
nr_ue_pdsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
gNB_id,
|
||||||
|
RA_PDSCH,
|
||||||
|
ue->dlsch_ra[gNB_id],
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
nr_ue_dlsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
gNB_id,
|
||||||
|
RA_PDSCH,
|
||||||
|
ue->dlsch_ra[gNB_id],
|
||||||
|
NULL,
|
||||||
|
&ue->dlsch_ra_errors[gNB_id],
|
||||||
|
dlsch_parallel);
|
||||||
|
|
||||||
|
// deactivate dlsch once dlsch proc is done
|
||||||
|
ue->dlsch_ra[gNB_id]->active = 0;
|
||||||
|
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_OUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
// do procedures for C-RNTI
|
||||||
|
if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1) {
|
||||||
|
|
||||||
|
LOG_D(PHY, "DLSCH data reception at nr_slot_rx: %d \n \n", nr_slot_rx);
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
|
#if UE_TIMING_TRACE
|
||||||
|
start_meas(&ue->dlsch_procedures_stat[proc->thread_id]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (ret_pdsch >= 0)
|
||||||
|
nr_ue_dlsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
gNB_id,
|
||||||
|
PDSCH,
|
||||||
|
ue->dlsch[proc->thread_id][gNB_id][0],
|
||||||
|
ue->dlsch[proc->thread_id][gNB_id][1],
|
||||||
|
&ue->dlsch_errors[gNB_id],
|
||||||
|
dlsch_parallel);
|
||||||
|
|
||||||
|
|
||||||
|
#if UE_TIMING_TRACE
|
||||||
|
stop_meas(&ue->dlsch_procedures_stat[proc->thread_id]);
|
||||||
|
#if DISABLE_LOG_X
|
||||||
|
printf("[SFN %d] Slot1: Pdsch Proc %5.2f\n",nr_slot_rx,ue->pdsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
|
||||||
|
printf("[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",nr_slot_rx,ue->dlsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
|
||||||
|
#else
|
||||||
|
LOG_D(PHY, "[SFN %d] Slot1: Pdsch Proc %5.2f\n",nr_slot_rx,ue->pdsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
|
||||||
|
LOG_D(PHY, "[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",nr_slot_rx,ue->dlsch_procedures_stat[proc->thread_id].p_time/(cpuf*1000.0));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// deactivate dlsch once dlsch proc is done
|
||||||
|
ue->dlsch[proc->thread_id][gNB_id][0]->active = 0;
|
||||||
|
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UE_TIMING_TRACE
|
||||||
|
start_meas(&ue->generic_stat);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
if(nr_slot_rx==5 && ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid]->nb_rb > 20){
|
||||||
|
//write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0);
|
||||||
|
//write_output("llr.m","llr", &ue->pdsch_vars[proc->thread_id][gNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0);
|
||||||
|
|
||||||
|
write_output("rxdataF0_current.m" , "rxdataF0", &ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][0],14*fp->ofdm_symbol_size,1,1);
|
||||||
|
//write_output("rxdataF0_previous.m" , "rxdataF0_prev_sss", &ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF[0][0],14*fp->ofdm_symbol_size,1,1);
|
||||||
|
|
||||||
|
//write_output("rxdataF0_previous.m" , "rxdataF0_prev", &ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF[0][0],14*fp->ofdm_symbol_size,1,1);
|
||||||
|
|
||||||
|
write_output("dl_ch_estimates.m", "dl_ch_estimates_sfn5", &ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].dl_ch_estimates[0][0][0],14*fp->ofdm_symbol_size,1,1);
|
||||||
|
write_output("dl_ch_estimates_ext.m", "dl_ch_estimatesExt_sfn5", &ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates_ext[0][0],14*fp->N_RB_DL*12,1,1);
|
||||||
|
write_output("rxdataF_comp00.m","rxdataF_comp00", &ue->pdsch_vars[proc->thread_id][gNB_id]->rxdataF_comp0[0][0],14*fp->N_RB_DL*12,1,1);
|
||||||
|
//write_output("magDLFirst.m", "magDLFirst", &phy_vars_ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_mag0[0][0],14*fp->N_RB_DL*12,1,1);
|
||||||
|
//write_output("magDLSecond.m", "magDLSecond", &phy_vars_ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_magb0[0][0],14*fp->N_RB_DL*12,1,1);
|
||||||
|
|
||||||
|
AssertFatal (0,"");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// duplicate harq structure
|
||||||
|
/*
|
||||||
|
uint8_t current_harq_pid = ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid;
|
||||||
|
NR_DL_UE_HARQ_t *current_harq_processes = ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[current_harq_pid];
|
||||||
|
NR_DL_UE_HARQ_t *harq_processes_dest = ue->dlsch[next1_thread_id][gNB_id][0]->harq_processes[current_harq_pid];
|
||||||
|
NR_DL_UE_HARQ_t *harq_processes_dest1 = ue->dlsch[next2_thread_id][gNB_id][0]->harq_processes[current_harq_pid];
|
||||||
|
*/
|
||||||
|
/*nr_harq_status_t *current_harq_ack = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_ack[nr_slot_rx];
|
||||||
|
nr_harq_status_t *harq_ack_dest = &ue->dlsch[next1_thread_id][gNB_id][0]->harq_ack[nr_slot_rx];
|
||||||
|
nr_harq_status_t *harq_ack_dest1 = &ue->dlsch[next2_thread_id][gNB_id][0]->harq_ack[nr_slot_rx];
|
||||||
|
*/
|
||||||
|
|
||||||
|
//copy_harq_proc_struct(harq_processes_dest, current_harq_processes);
|
||||||
|
//copy_ack_struct(harq_ack_dest, current_harq_ack);
|
||||||
|
|
||||||
|
//copy_harq_proc_struct(harq_processes_dest1, current_harq_processes);
|
||||||
|
//copy_ack_struct(harq_ack_dest1, current_harq_ack);
|
||||||
|
|
||||||
|
if (nr_slot_rx==9) {
|
||||||
|
if (frame_rx % 10 == 0) {
|
||||||
|
if ((ue->dlsch_received[gNB_id] - ue->dlsch_received_last[gNB_id]) != 0)
|
||||||
|
ue->dlsch_fer[gNB_id] = (100*(ue->dlsch_errors[gNB_id] - ue->dlsch_errors_last[gNB_id]))/(ue->dlsch_received[gNB_id] - ue->dlsch_received_last[gNB_id]);
|
||||||
|
|
||||||
|
ue->dlsch_errors_last[gNB_id] = ue->dlsch_errors[gNB_id];
|
||||||
|
ue->dlsch_received_last[gNB_id] = ue->dlsch_received[gNB_id];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ue->bitrate[gNB_id] = (ue->total_TBS[gNB_id] - ue->total_TBS_last[gNB_id])*100;
|
||||||
|
ue->total_TBS_last[gNB_id] = ue->total_TBS[gNB_id];
|
||||||
|
LOG_D(PHY,"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits\n",
|
||||||
|
ue->Mod_id,frame_rx,ue->total_TBS[gNB_id],
|
||||||
|
ue->total_TBS_last[gNB_id],(float) ue->bitrate[gNB_id]/1000.0);
|
||||||
|
|
||||||
|
#if UE_AUTOTEST_TRACE
|
||||||
|
if ((frame_rx % 100 == 0)) {
|
||||||
|
LOG_I(PHY,"[UE %d] AUTOTEST Metric : UE_DLSCH_BITRATE = %5.2f kbps (frame = %d) \n", ue->Mod_id, (float) ue->bitrate[gNB_id]/1000.0, frame_rx);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UE_TIMING_TRACE
|
||||||
|
stop_meas(&ue->generic_stat);
|
||||||
|
printf("after tubo until end of Rx %5.2f \n",ue->generic_stat.p_time/(cpuf*1000.0));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef EMOS
|
||||||
|
phy_procedures_emos_UE_RX(ue,slot,gNB_id);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
|
||||||
|
|
||||||
|
#if UE_TIMING_TRACE
|
||||||
|
stop_meas(&ue->phy_proc_rx[proc->thread_id]);
|
||||||
|
#if DISABLE_LOG_X
|
||||||
|
printf("------FULL RX PROC [SFN %d]: %5.2f ------\n",nr_slot_rx,ue->phy_proc_rx[proc->thread_id].p_time/(cpuf*1000.0));
|
||||||
|
#else
|
||||||
|
LOG_D(PHY, "------FULL RX PROC [SFN %d]: %5.2f ------\n",nr_slot_rx,ue->phy_proc_rx[proc->thread_id].p_time/(cpuf*1000.0));
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#endif //pdsch
|
||||||
|
|
||||||
|
LOG_D(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, nr_slot_rx);
|
||||||
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user