Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Balaji Kolla
openairinterface5G
Commits
2df82e34
Commit
2df82e34
authored
Apr 02, 2019
by
Florian Kaltenberger
Browse files
Merge branch 'nr_pdsch_debug' into 'develop-nr'
Nr pdsch debug See merge request
oai/openairinterface5g!556
parents
07fd5107
10674d9b
Changes
5
Hide whitespace changes
Inline
Side-by-side
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
View file @
2df82e34
...
...
@@ -215,7 +215,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch,
nr_dlsch_encoding
(
harq
->
pdu
,
slot
,
&
dlsch
,
&
frame_parms
);
#ifdef DEBUG_DLSCH
printf
(
"PDSCH encoding:
\n
Payload:
\n
"
);
for
(
int
i
=
0
;
i
<
TBS
>>
7
;
i
++
)
{
for
(
int
i
=
0
;
i
<
harq
->
B
>>
7
;
i
++
)
{
for
(
int
j
=
0
;
j
<
16
;
j
++
)
printf
(
"0x%02x
\t
"
,
harq
->
pdu
[(
i
<<
4
)
+
j
]);
printf
(
"
\n
"
);
...
...
@@ -308,16 +308,13 @@ for (int i=0; i<n_dmrs>>4; i++) {
// Non interleaved VRB to PRB mapping
uint16_t
start_sc
=
frame_parms
.
first_carrier_offset
+
frame_parms
.
ssb_start_subcarrier
;
if
(
start_sc
>=
frame_parms
.
ofdm_symbol_size
)
start_sc
-=
frame_parms
.
ofdm_symbol_size
;
/*rel15->start_prb*NR_NB_SC_PER_RB +
((pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_COMMON) && (pdcch_params.dci_format == NFAPI_NR_DL_DCI_FORMAT_1_0))?\
((frame_parms.ssb_start_subcarrier/NR_NB_SC_PER_RB + pdcch_params.rb_offset)*NR_NB_SC_PER_RB) : 0;*/
uint16_t
start_sc
=
frame_parms
.
first_carrier_offset
+
rel15
->
start_prb
*
NR_NB_SC_PER_RB
;
if
(
start_sc
>=
frame_parms
.
ofdm_symbol_size
)
start_sc
-=
frame_parms
.
ofdm_symbol_size
;
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"PDSCH resource mapping started (start SC %d
\t
start symbol %d
\t
N_PRB %d
\t
nb_symbols %d)
\n
"
,
start_sc
,
rel15
->
start_symbol
,
rel15
->
n_prb
,
rel15
->
nb_symbols
);
printf
(
"PDSCH resource mapping started (start SC %d
\t
start symbol %d
\t
N_PRB %d
\t
nb_symbols %d)
\n
"
,
start_sc
,
rel15
->
start_symbol
,
rel15
->
n_prb
,
rel15
->
nb_symbols
);
#endif
for
(
int
ap
=
0
;
ap
<
rel15
->
nb_layers
;
ap
++
)
{
...
...
openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c
View file @
2df82e34
...
...
@@ -126,7 +126,7 @@ void nr_get_tbs(nfapi_nr_dl_config_dlsch_pdu *dlsch_pdu,
uint16_t
N_RE
,
Ninfo
,
Ninfo_prime
,
C
,
TBS
=
0
,
R
;
uint8_t
table_idx
,
Qm
,
n
,
scale
;
table_idx
=
get_table_idx
(
mcs_table
,
dci_format
,
rnti_type
,
ss_type
);
table_idx
=
1
;
//
get_table_idx(mcs_table, dci_format, rnti_type, ss_type);
scale
=
((
table_idx
==
2
)
&&
((
Imcs
==
20
)
||
(
Imcs
==
26
)))
?
11
:
10
;
N_RE
=
min
(
156
,
N_RE_prime
)
*
dlsch_rel15
->
n_prb
;
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
View file @
2df82e34
...
...
@@ -1985,18 +1985,18 @@ void nr_dlsch_channel_level(int **dl_ch_estimates_ext,
//==============================================================================================
unsigned
short
nr_dlsch_extract_rbs_single
(
int
**
rxdataF
,
int
**
dl_ch_estimates
,
int
**
rxdataF_ext
,
int
**
dl_ch_estimates_ext
,
unsigned
short
pmi
,
unsigned
char
*
pmi_ext
,
unsigned
int
*
rb_alloc
,
unsigned
char
symbol
,
unsigned
short
start_rb
,
unsigned
short
nb_rb_pdsch
,
unsigned
char
nr_tti_rx
,
uint32_t
high_speed_flag
,
NR_DL_FRAME_PARMS
*
frame_parms
)
{
int
**
dl_ch_estimates
,
int
**
rxdataF_ext
,
int
**
dl_ch_estimates_ext
,
unsigned
short
pmi
,
unsigned
char
*
pmi_ext
,
unsigned
int
*
rb_alloc
,
//unused in NR
unsigned
char
symbol
,
unsigned
short
start_rb
,
unsigned
short
nb_rb_pdsch
,
unsigned
char
nr_tti_rx
,
uint32_t
high_speed_flag
,
NR_DL_FRAME_PARMS
*
frame_parms
)
{
...
...
@@ -2008,20 +2008,8 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
unsigned
char
pilots
=
0
,
j
=
0
;
//symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
pilots
=
(
symbol
==
2
)
?
1
:
0
;
//to updated from config
//l=symbol;
//nsymb = (frame_parms->Ncp==NORMAL) ? 14:12;
k
=
frame_parms
->
first_carrier_offset
+
516
;
//0
/* if (frame_parms->frame_type == TDD) { // TDD
sss_symb = nsymb-1;
pss_symb = 2;
} else {
sss_symb = (nsymb>>1)-2;
pss_symb = (nsymb>>1)-1;
}*/
pilots
=
(
symbol
==
2
)
?
1
:
0
;
//to updated from config!!!
k
=
frame_parms
->
first_carrier_offset
+
12
*
start_rb
;
for
(
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
...
...
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
View file @
2df82e34
...
...
@@ -1264,37 +1264,6 @@ uint16_t nr_get_n1_pucch(PHY_VARS_NR_UE *ue,
}
#ifdef EMOS
void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) {
uint8_t harq_pid;
if (next_slot%2==0) {
// get harq_pid from nr_tti_tx relationship
harq_pid = nr_subframe2harq_pid(&ue->frame_parms,ue->frame,(next_slot>>1));
if (harq_pid==255) {
LOG_E(PHY,"[UE%d] Frame %d : FATAL ERROR: illegal harq_pid, returning\n",
0,ue->frame);
return;
}
if (ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
emos_dump_UE.uci_cnt[next_slot>>1] = 1;
memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o,ulsch[eNB_id]->o,MAX_CQI_BITS*sizeof(char));
emos_dump_UE.UCI_data[0][next_slot>>1].O = ulsch[eNB_id]->O;
memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_RI,ulsch[eNB_id]->o_RI,2*sizeof(char));
emos_dump_UE.UCI_data[0][next_slot>>1].O_RI = ulsch[eNB_id]->O_RI;
memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_ACK,ulsch[eNB_id]->o_ACK,4*sizeof(char));
emos_dump_UE.UCI_data[0][next_slot>>1].O_ACK = ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK;
}
else {
emos_dump_UE.uci_cnt[next_slot>>1] = 0;
}
}
}
#endif
void ulsch_common_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t empty_subframe) {
...
...
@@ -1602,10 +1571,10 @@ void ue_ulsch_uespec_procedures(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC
,
VCD_FUNCTION_IN
);
/* reset harq for tx of current rx slot because it is sure that transmission has already been achieved for this slot */
set_tx_harq_id
(
ue
->
ulsch
[
eNB_id
],
NR_MAX_HARQ_PROCESSES
,
proc
->
nr_tti_rx
);
set_tx_harq_id
(
ue
->
ulsch
[
ue
->
current_thread_id
[
nr_tti_tx
]][
eNB_id
]
[
0
]
,
NR_MAX_HARQ_PROCESSES
,
proc
->
nr_tti_rx
);
/* get harq pid related to this next tx slot */
harq_pid
=
get_tx_harq_id
(
ue
->
ulsch
[
eNB_id
],
nr_tti_tx
);
harq_pid
=
get_tx_harq_id
(
ue
->
ulsch
[
ue
->
current_thread_id
[
nr_tti_tx
]][
eNB_id
]
[
0
]
,
nr_tti_tx
);
#if 0
...
...
@@ -2500,8 +2469,10 @@ void phy_procedures_UE_TX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB
unsigned
int
aa
;
uint8_t
isSubframeSRS
;
/*
uint8_t next1_thread_id = ue->current_thread_id[proc->nr_tti_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[proc->nr_tti_rx]+1);
uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1);
*/
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX
,
VCD_FUNCTION_IN
);
...
...
@@ -2637,6 +2608,7 @@ void phy_procedures_UE_TX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB
ue
->
ulsch
[
eNB_id
]
->
o_ACK
,
&
N_bundled
,
0
);
/*
nr_reset_ack(&ue->frame_parms,
ue->dlsch[next1_thread_id][eNB_id][0]->harq_ack,
nr_tti_tx,
...
...
@@ -2651,6 +2623,7 @@ void phy_procedures_UE_TX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB
ue->ulsch[eNB_id]->o_ACK,
&N_bundled,
0);
*/
}
if
(
ue
->
dlsch_SI
[
eNB_id
]
!=
NULL
)
...
...
@@ -2765,93 +2738,6 @@ void nr_ue_measurement_procedures(
}
#ifdef EMOS
void
phy_procedures_emos_UE_RX
(
PHY_VARS_NR_UE
*
ue
,
uint8_t
last_slot
,
uint8_t
eNB_id
)
{
uint8_t
i
,
j
;
//uint16_t last_slot_emos;
uint32_t
bytes
;
int
Mod_id
=
ue
->
Mod_id
;
/*
if (last_slot<2)
last_slot_emos = last_slot;
else if (last_slot>9)
last_slot_emos = last_slot - 8;
else {
LOG_E(PHY,"emos rx last_slot_emos %d, last_slot %d\n", last_slot_emos,last_slot);
//mac_xface->macphy_exit("should never happen");
}
*/
#ifdef EMOS_CHANNEL
if
((
last_slot
==
10
)
||
(
last_slot
==
11
))
{
for
(
i
=
0
;
i
<
ue
->
frame_parms
.
nb_antennas_rx
;
i
++
)
for
(
j
=
0
;
j
<
ue
->
frame_parms
.
nb_antennas_tx
;
j
++
)
{
// first OFDM symbol with pilots
memcpy
(
&
emos_dump_UE
.
channel
[
i
][
j
][(
last_slot
%
2
)
*
2
*
ue
->
frame_parms
.
ofdm_symbol_size
],
&
ue
->
common_vars
.
dl_ch_estimates
[
eNB_id
][(
j
<<
1
)
+
i
][
0
],
ue
->
frame_parms
.
ofdm_symbol_size
*
sizeof
(
int
));
// second OFDM symbol with pilots
memcpy
(
&
emos_dump_UE
.
channel
[
i
][
j
][((
last_slot
%
2
)
*
2
+
1
)
*
ue
->
frame_parms
.
ofdm_symbol_size
],
&
ue
->
common_vars
.
dl_ch_estimates
[
eNB_id
][(
j
<<
1
)
+
i
][(
ue
->
frame_parms
.
Ncp
==
0
?
4
:
3
)
*
ue
->
frame_parms
.
ofdm_symbol_size
],
ue
->
frame_parms
.
ofdm_symbol_size
*
sizeof
(
int
));
}
}
#endif
if
(
last_slot
==
0
)
{
emos_dump_UE
.
timestamp
=
rt_get_time_ns
();
emos_dump_UE
.
frame_rx
=
proc
->
frame_rx
;
emos_dump_UE
.
UE_mode
=
ue
->
UE_mode
[
eNB_id
];
emos_dump_UE
.
mimo_mode
=
ue
->
transmission_mode
[
eNB_id
];
emos_dump_UE
.
freq_offset
=
ue
->
common_vars
.
freq_offset
;
emos_dump_UE
.
timing_advance
=
ue
->
timing_advance
;
emos_dump_UE
.
timing_offset
=
ue
->
rx_offset
;
emos_dump_UE
.
rx_total_gain_dB
=
ue
->
rx_total_gain_dB
;
emos_dump_UE
.
eNb_id
=
eNB_id
;
memcpy
(
&
emos_dump_UE
.
PHY_measurements
,
&
measurements
,
sizeof
(
PHY_MEASUREMENTS
));
}
if
(
last_slot
==
1
)
{
emos_dump_UE
.
pbch_errors
=
ue
->
pbch_vars
[
eNB_id
]
->
pdu_errors
;
emos_dump_UE
.
pbch_errors_last
=
ue
->
pbch_vars
[
eNB_id
]
->
pdu_errors_last
;
emos_dump_UE
.
pbch_errors_conseq
=
ue
->
pbch_vars
[
eNB_id
]
->
pdu_errors_conseq
;
emos_dump_UE
.
pbch_fer
=
ue
->
pbch_vars
[
eNB_id
]
->
pdu_fer
;
}
if
(
last_slot
==
19
)
{
emos_dump_UE
.
dlsch_errors
=
ue
->
dlsch_errors
[
eNB_id
];
emos_dump_UE
.
dlsch_errors_last
=
ue
->
dlsch_errors_last
[
eNB_id
];
emos_dump_UE
.
dlsch_received
=
ue
->
dlsch_received
[
eNB_id
];
emos_dump_UE
.
dlsch_received_last
=
ue
->
dlsch_received_last
[
eNB_id
];
emos_dump_UE
.
dlsch_fer
=
ue
->
dlsch_fer
[
eNB_id
];
emos_dump_UE
.
dlsch_cntl_errors
=
ue
->
dlsch_SI_errors
[
eNB_id
];
emos_dump_UE
.
dlsch_ra_errors
=
ue
->
dlsch_ra_errors
[
eNB_id
];
emos_dump_UE
.
total_TBS
=
ue
->
total_TBS
[
eNB_id
];
emos_dump_UE
.
total_TBS_last
=
ue
->
total_TBS_last
[
eNB_id
];
emos_dump_UE
.
bitrate
=
ue
->
bitrate
[
eNB_id
];
emos_dump_UE
.
total_received_bits
=
ue
->
total_received_bits
[
eNB_id
];
emos_dump_UE
.
pmi_saved
=
ue
->
dlsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
][
0
]
->
pmi_alloc
;
emos_dump_UE
.
mcs
=
ue
->
dlsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
][
0
]
->
harq_processes
[
ue
->
dlsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
][
0
]
->
current_harq_pid
]
->
mcs
;
emos_dump_UE
.
use_ia_receiver
=
openair_daq_vars
.
use_ia_receiver
;
bytes
=
rtf_put
(
CHANSOUNDER_FIFO_MINOR
,
&
emos_dump_UE
,
sizeof
(
fifo_dump_emos_UE
));
if
(
bytes
!=
sizeof
(
fifo_dump_emos_UE
))
{
LOG_W
(
PHY
,
"[UE %d] frame %d, slot %d, Problem writing EMOS data to FIFO
\n
"
,
Mod_id
,
proc
->
frame_rx
,
last_slot
);
}
else
{
if
(
proc
->
frame_rx
%
100
==
0
)
{
LOG_I
(
PHY
,
"[UE %d] frame %d, slot %d, Writing %d bytes EMOS data to FIFO
\n
"
,
Mod_id
,
proc
->
frame_rx
,
last_slot
,
bytes
);
}
}
}
}
#endif
#if 0
void restart_phy(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc, uint8_t eNB_id,uint8_t abstraction_flag)
...
...
@@ -3032,8 +2918,10 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
int
frame_rx
=
proc
->
frame_rx
;
int
nr_tti_rx
=
proc
->
nr_tti_rx
;
NR_DCI_ALLOC_t
dci_alloc_rx
[
8
];
/*
uint8_t next1_thread_id = ue->current_thread_id[nr_tti_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[nr_tti_rx]+1);
uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1);
*/
// table dci_fields_sizes_cnt contains dci_fields_sizes for each time a dci is decoded in the slot
// each element represents the size in bits for each dci field, for each decoded dci -> [dci_cnt-1]
...
...
@@ -3240,12 +3128,14 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
uint8_t
*
nCCE_current
=
&
ue
->
pdcch_vars
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
]
->
nCCE
[
nr_tti_rx
];
/*
uint8_t *nCCE_dest = &ue->pdcch_vars[next1_thread_id][eNB_id]->nCCE[nr_tti_rx];
uint8_t *nCCE_dest1 = &ue->pdcch_vars[next2_thread_id][eNB_id]->nCCE[nr_tti_rx];
memcpy(nCCE_dest, nCCE_current, sizeof(uint8_t));
memcpy(nCCE_dest1, nCCE_current, sizeof(uint8_t));
LOG_D(PHY,"current_thread %d next1_thread %d next2_thread %d \n", ue->current_thread_id[nr_tti_rx], next1_thread_id, next2_thread_id);
*/
LOG_D
(
PHY
,
"[UE %d] AbsSubFrame %d.%d, Mode %s: DCI found %i --> rnti %x / crnti %x : format %d
\n
"
,
ue
->
Mod_id
,
frame_rx
%
1024
,
nr_tti_rx
,
mode_string
[
ue
->
UE_mode
[
eNB_id
]],
...
...
@@ -3305,7 +3195,7 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
ue
->
pdcch_vars
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
],
ue
->
pdsch_vars
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
],
ue
->
dlsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
],
ue
->
ulsch
[
eNB_id
],
ue
->
ulsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
]
[
0
]
,
&
ue
->
frame_parms
,
ue
->
pdsch_config_dedicated
,
ue
->
transmission_mode
[
eNB_id
]
<
7
?
0
:
ue
->
transmission_mode
[
eNB_id
],
...
...
@@ -3753,7 +3643,6 @@ void nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB
#endif
#endif
if
(
first_symbol_flag
)
{
proc
->
first_symbol_available
=
1
;
...
...
@@ -3770,8 +3659,10 @@ void process_rar(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id, runmod
NR_UE_DLSCH_t *dlsch0 = ue->dlsch_ra[eNB_id];
int harq_pid = 0;
uint8_t *rar;
/*
uint8_t next1_thread_id = ue->current_thread_id[nr_tti_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[nr_tti_rx]+1);
uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1);
*/
LOG_D(PHY,"[UE %d][RAPROC] Frame %d nr_tti_rx %d Received RAR mode %d\n",
ue->Mod_id,
...
...
@@ -3796,9 +3687,11 @@ void process_rar(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_id, runmod
ue->prach_resources[eNB_id]->ra_PreambleIndex,
dlsch0->harq_processes[0]->b); // alter the 'b' buffer so it contains only the selected RAR header and RAR payload
*/
/*
ue->pdcch_vars[next1_thread_id][eNB_id]->crnti = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->crnti;
ue->pdcch_vars[next2_thread_id][eNB_id]->crnti = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->crnti;
*/
if (timing_advance!=0xffff) {
LOG_D(PHY,"[UE %d][RAPROC] Frame %d nr_tti_rx %d Got rnti %x and timing advance %d from RAR\n",
...
...
@@ -3875,7 +3768,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
// to be updated by higher layer
uint8_t
nb_re_dmrs
=
6
;
uint16_t
length_dmrs
=
1
;
uint16_t
nb_symb_sch
=
8
;
uint16_t
nb_symb_sch
=
9
;
if
(
dlsch0
==
NULL
)
AssertFatal
(
0
,
"dlsch0 should be defined at this level
\n
"
);
...
...
@@ -3940,20 +3833,20 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
// start ldpc decode for CW 0
dlsch0
->
harq_processes
[
harq_pid
]
->
G
=
nr_get_G
(
dlsch0
->
harq_processes
[
harq_pid
]
->
nb_rb
,
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
,
dlsch0
->
harq_processes
[
harq_pid
]
->
Qm
,
dlsch0
->
harq_processes
[
harq_pid
]
->
Nl
);
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
,
dlsch0
->
harq_processes
[
harq_pid
]
->
Qm
,
dlsch0
->
harq_processes
[
harq_pid
]
->
Nl
);
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
dlsch_unscrambling_stats
);
#endif
nr_dlsch_unscrambling
(
pdsch_vars
->
llr
[
0
],
dlsch0
->
harq_processes
[
harq_pid
]
->
G
,
dlsch0
->
harq_processes
[
harq_pid
]
->
G
,
0
,
ue
->
frame_parms
.
Nid_cell
,
dlsch0
->
rnti
);
ue
->
frame_parms
.
Nid_cell
,
dlsch0
->
rnti
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_unscrambling_stats
);
...
...
@@ -4020,11 +3913,11 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
{
// start ldpc decode for CW 1
dlsch1
->
harq_processes
[
harq_pid
]
->
G
=
nr_get_G
(
dlsch1
->
harq_processes
[
harq_pid
]
->
nb_rb
,
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
,
dlsch1
->
harq_processes
[
harq_pid
]
->
Qm
,
dlsch1
->
harq_processes
[
harq_pid
]
->
Nl
);
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
,
dlsch1
->
harq_processes
[
harq_pid
]
->
Qm
,
dlsch1
->
harq_processes
[
harq_pid
]
->
Nl
);
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
dlsch_unscrambling_stats
);
#endif
...
...
@@ -4403,527 +4296,6 @@ void *UE_thread_slot1_dl_processing(void *arg) {
}
#endif
#ifdef UE_SLOT_PARALLELISATION
int
phy_procedures_slot_parallelization_nrUE_RX
(
PHY_VARS_NR_UE
*
ue
,
UE_nr_rxtx_proc_t
*
proc
,
uint8_t
eNB_id
,
uint8_t
abstraction_flag
,
uint8_t
do_pdcch_flag
,
runmode_t
mode
,
relaying_type_t
r_type
)
{
int
l
,
l2
;
int
pmch_flag
=
0
;
int
frame_rx
=
proc
->
frame_rx
;
int
nr_tti_rx
=
proc
->
nr_tti_rx
;
uint8_t
pilot0
;
uint8_t
pilot1
;
uint8_t
slot0
;
uint8_t
slot1
;
uint8_t
first_ofdm_sym
;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX
,
VCD_FUNCTION_IN
);
#if T_TRACER
T
(
T_UE_PHY_DL_TICK
,
T_INT
(
ue
->
Mod_id
),
T_INT
(
frame_rx
%
1024
),
T_INT
(
nr_tti_rx
));
T
(
T_UE_PHY_INPUT_SIGNAL
,
T_INT
(
ue
->
Mod_id
),
T_INT
(
frame_rx
%
1024
),
T_INT
(
nr_tti_rx
),
T_INT
(
0
),
T_BUFFER
(
&
ue
->
common_vars
.
rxdata
[
0
][
nr_tti_rx
*
ue
->
frame_parms
.
samples_per_subframe
],
ue
->
frame_parms
.
samples_per_subframe
*
4
));
#endif
// start timers
#ifdef UE_DEBUG_TRACE
LOG_I
(
PHY
,
" ****** start RX-Chain for AbsSubframe %d.%d ******
\n
"
,
frame_rx
%
1024
,
nr_tti_rx
);
#endif
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
phy_proc_rx
[
ue
->
current_thread_id
[
nr_tti_rx
]]);
start_meas
(
&
ue
->
ue_front_end_stat
[
ue
->
current_thread_id
[
nr_tti_rx
]]);
#endif
pmch_flag
=
is_pmch_subframe
(
frame_rx
,
nr_tti_rx
,
&
ue
->
frame_parms
)
?
1
:
0
;
if
(
do_pdcch_flag
)
{
// deactivate reception until we scan pdcch
if
(
ue
->
dlsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
][
0
])
ue
->
dlsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
][
0
]
->
active
=
0
;
if
(
ue
->
dlsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
][
1
])
ue
->
dlsch
[
ue
->
current_thread_id
[
nr_tti_rx
]][
eNB_id
][
1
]
->
active
=
0
;
if
(
ue
->
dlsch_SI
[
eNB_id
])
ue
->
dlsch_SI
[
eNB_id
]
->
active
=
0
;
if
(
ue
->
dlsch_p
[
eNB_id
])
ue
->
dlsch_p
[
eNB_id
]
->
active
=
0
;
if
(
ue
->
dlsch_ra
[
eNB_id
])
ue
->
dlsch_ra
[
eNB_id
]
->
active
=
0
;
}
#ifdef DEBUG_PHY_PROC
LOG_D
(
PHY
,
"[%s %d] Frame %d nr_tti_rx %d: Doing phy_procedures_UE_RX
\n
"
,
(
r_type
==
multicast_relay
)
?
"RN/UE"
:
"UE"
,
ue
->
Mod_id
,
frame_rx
,
nr_tti_rx
);
#endif
if
(
nr_subframe_select
(
&
ue
->
frame_parms
,
nr_tti_rx
)
==
SF_S
)
{
// S-subframe, do first 5 symbols only
l2
=
5
;
}
else
if
(
pmch_flag
==
1
)
{
// do first 2 symbols only
l2
=
1
;
}
else
{
// normal nr_tti_rx, last symbol to be processed is the first of the second slot
l2
=
(
ue
->
frame_parms
.
symbols_per_tti
/
2
)
-
1
;
}
int
prev_nr_tti_rx
=
(
nr_tti_rx
-
1
)
<
0
?
9
:
(
nr_tti_rx
-
1
);
if
(
nr_subframe_select
(
&
ue
->
frame_parms
,
prev_nr_tti_rx
)
!=
SF_DL
)
{
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// RX processing of symbols l=0...l2
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
first_ofdm_sym
=
0
;
}
else
{
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// RX processing of symbols l=1...l2 (l=0 is done in last scheduling epoch)
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
first_ofdm_sym
=
1
;
}
slot0
=
(
nr_tti_rx
<<
1
);
slot1
=
(
nr_tti_rx
<<
1
)
+
1
;
pilot0
=
0
;
if
(
ue
->
frame_parms
.
Ncp
==
0
)
{
// normal prefix
pilot1
=
4
;
}
else
{
// extended prefix
pilot1
=
3
;
}
//LOG_I(PHY,"Set available channelEst to 0 AbsSubframe %d.%d \n",frame_rx,nr_tti_rx);
//LOG_I(PHY,"Set available llrs slot1 to 0 AbsSubframe %d.%d \n",frame_rx,nr_tti_rx);
//LOG_I(PHY,"Set available dci info slot0 to 0 AbsSubframe %d.%d \n",frame_rx,nr_tti_rx);
proc
->
chan_est_pilot0_slot1_available
=
0
;
proc
->
llr_slot1_available
=
0
;
proc
->
dci_slot0_available
=
0
;
proc
->
first_symbol_available
=
0
;
proc
->
chan_est_slot1_available
=
0
;
//proc->channel_level=0;
if
(
pthread_mutex_lock
(
&
proc
->
mutex_slot1_dl_processing
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE %d][Slot0] error locking mutex for UE slot1 dl processing
\n
"
,
ue
->
Mod_id
);
exit_fun
(
"nothing to add"
);
}
proc
->
instance_cnt_slot1_dl_processing
++
;
if
(
proc
->
instance_cnt_slot1_dl_processing
==
0
)
{
LOG_D
(
PHY
,
"unblock slot1 dl processing thread blocked on instance_cnt_slot1_dl_processing : %d
\n
"
,
proc
->
instance_cnt_slot1_dl_processing
);
if
(
pthread_cond_signal
(
&
proc
->
cond_slot1_dl_processing
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE %d][Slot0] ERROR pthread_cond_signal for UE slot1 processing thread
\n
"
,
ue
->
Mod_id
);
exit_fun
(
"nothing to add"
);
}
if
(
pthread_mutex_unlock
(
&
proc
->
mutex_slot1_dl_processing
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE %d][Slot0] error unlocking mutex for UE slot1 dl processing
\n
"
,
ue
->
Mod_id
);
exit_fun
(
"nothing to add"
);
}
}
else
{
LOG_E
(
PHY
,
"[SCHED][UE %d] UE RX thread busy (IC %d)!!
\n
"
,
ue
->
Mod_id
,
proc
->
instance_cnt_slot1_dl_processing
);
if
(
proc
->
instance_cnt_slot1_dl_processing
>
2
)
exit_fun
(
"instance_cnt_slot1_dl_processing > 2"
);
}
//AssertFatal(pthread_cond_signal(&proc->cond_slot1_dl_processing) ==0 ,"");
AssertFatal
(
pthread_mutex_unlock
(
&
proc
->
mutex_slot1_dl_processing
)
==
0
,
""
);
/**** Slot0 FE Processing ****/
// I- start main thread for FFT/ChanEst symbol: 0/1 --> 7
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
ue_front_end_per_slot_stat
[
ue
->
current_thread_id
[
nr_tti_rx
]][
0
]);
#endif
// 1- perform FFT for pilot ofdm symbols first (ofdmSym7 ofdmSym4 or (ofdmSym6 ofdmSym3))
//printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,nr_tti_rx,slot1,pilot0);
front_end_fft
(
ue
,
pilot0
,
slot1
,
0
,
0
);
//printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,nr_tti_rx,slot0,pilot1);
front_end_fft
(
ue
,
pilot1
,
slot0
,
0
,
0
);
//printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,nr_tti_rx,slot0,pilot1);
front_end_chanEst
(
ue
,
pilot1
,
slot0
,
0
);
//printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,nr_tti_rx,slot1,pilot0);
front_end_chanEst
(
ue
,
pilot0
,
slot1
,
0
);
proc
->
chan_est_pilot0_slot1_available
=
1
;
//printf("Set available channelEst to 1 AbsSubframe %d.%d \n",frame_rx,nr_tti_rx);
// 2- perform FFT for other ofdm symbols other than pilots
for
(
l
=
first_ofdm_sym
;
l
<=
l2
;
l
++
)
{
if
(
(
l
!=
pilot0
)
&&
(
l
!=
pilot1
))
{
//printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,nr_tti_rx,slot0,l);
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
ofdm_demod_stats
);
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP
,
VCD_FUNCTION_IN
);
front_end_fft
(
ue
,
l
,
slot0
,
0
,
0
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP
,
VCD_FUNCTION_OUT
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
ofdm_demod_stats
);
#endif
}
}
// for l=1..l2
// 3- perform Channel Estimation for slot0
for
(
l
=
first_ofdm_sym
;
l
<=
l2
;
l
++
)
{
if
(
(
l
!=
pilot0
)
&&
(
l
!=
pilot1
))
{
//printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,nr_tti_rx,slot0,l);
front_end_chanEst
(
ue
,
l
,
slot0
,
0
);
}
ue_measurement_procedures
(
l
-
1
,
ue
,
proc
,
eNB_id
,(
nr_tti_rx
<<
1
),
abstraction_flag
,
mode
);
}
if
(
do_pdcch_flag
)
{
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
pdcch_procedures_stat
[
ue
->
current_thread_id
[
nr_tti_rx
]]);
#endif
if
(
ue_pdcch_procedures
(
eNB_id
,
ue
,
proc
,
abstraction_flag
)
==
-
1
)
{
LOG_E
(
PHY
,
"[UE %d] Frame %d, nr_tti_rx %d: Error in pdcch procedures
\n
"
,
ue
->
Mod_id
,
frame_rx
,
nr_tti_rx
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
pdcch_procedures_stat
[
ue
->
current_thread_id
[
nr_tti_rx
]]);
#if DISABLE_LOG_X
printf
(
"[AbsSFN %d.%d] Slot0: PDCCH %5.2f
\n
"
,
frame_rx
,
nr_tti_rx
,
ue
->
pdcch_procedures_stat
[
ue
->
current_thread_id
[
nr_tti_rx
]].
p_time
/
(
cpuf
*
1000
.
0
));