Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
oai
openairinterface5G
Commits
ed145f57
Commit
ed145f57
authored
Jul 17, 2017
by
tct-labo4
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[OAI-UE] slot0/1 parallelization part2
parent
bf7eb25c
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
564 additions
and
561 deletions
+564
-561
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+89
-10
openair1/PHY/LTE_TRANSPORT/initial_sync.c
openair1/PHY/LTE_TRANSPORT/initial_sync.c
+8
-10
openair1/PHY/defs.h
openair1/PHY/defs.h
+13
-5
openair1/SCHED/defs.h
openair1/SCHED/defs.h
+4
-2
openair1/SCHED/phy_procedures_lte_ue.c
openair1/SCHED/phy_procedures_lte_ue.c
+416
-270
targets/COMMON/threads_t.h
targets/COMMON/threads_t.h
+3
-0
targets/RT/USER/lte-softmodem.c
targets/RT/USER/lte-softmodem.c
+16
-1
targets/RT/USER/lte-softmodem.h
targets/RT/USER/lte-softmodem.h
+1
-0
targets/RT/USER/lte-ue.c
targets/RT/USER/lte-ue.c
+13
-262
targets/SIMU/USER/oaisim.c
targets/SIMU/USER/oaisim.c
+1
-1
No files found.
openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
View file @
ed145f57
...
...
@@ -112,10 +112,12 @@ int rx_pdsch(PHY_VARS_UE *ue,
int
avg_0
[
2
];
int
avg_1
[
2
];
uint8_t
slot
=
0
;
unsigned
char
aatx
,
aarx
;
unsigned
short
nb_rb
=
0
,
round
;
int
avgs
,
rb
;
int
avgs
=
0
,
rb
;
LTE_DL_UE_HARQ_t
*
dlsch0_harq
,
*
dlsch1_harq
=
0
;
uint8_t
beamforming_mode
;
...
...
@@ -248,6 +250,11 @@ int rx_pdsch(PHY_VARS_UE *ue,
return
(
-
1
);
}
}
if
(
symbol
>
ue
->
frame_parms
.
symbols_per_tti
>>
1
)
{
slot
=
1
;
}
#ifdef DEBUG_HARQ
printf
(
"Demod dlsch0_harq->pmi_alloc %d
\n
"
,
dlsch0_harq
->
pmi_alloc
);
#endif
...
...
@@ -257,6 +264,9 @@ int rx_pdsch(PHY_VARS_UE *ue,
LOG_I
(
PHY
,
"dlsch: using pmi %x (%p), rb_alloc %x
\n
"
,
pmi2hex_2Ar1
(
dlsch0_harq
->
pmi_alloc
),
dlsch
[
0
],
dlsch0_harq
->
rb_alloc_even
[
0
]);
#endif
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
]);
#endif
nb_rb
=
dlsch_extract_rbs_dual
(
common_vars
->
common_vars_rx_data_per_thread
[
subframe
%
RX_NB_TH
].
rxdataF
,
common_vars
->
common_vars_rx_data_per_thread
[
subframe
%
RX_NB_TH
].
dl_ch_estimates
[
eNB_id
],
pdsch_vars
[
eNB_id
]
->
rxdataF_ext
,
...
...
@@ -364,12 +374,20 @@ int rx_pdsch(PHY_VARS_UE *ue,
return
(
-
1
);
}
#ifdef DEBUG_PHY
LOG_D
(
PHY
,
"[DLSCH] nb_rb %d log2_maxh = %d (%d,%d)
\n
"
,
nb_rb
,
pdsch_vars
[
eNB_id
]
->
log2_maxh
,
avg
[
0
],
avgs
);
LOG_D
(
PHY
,
"[DLSCH] mimo_mode = %d
\n
"
,
dlsch0_harq
->
mimo_mode
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
]);
#if DISABLE_LOG_X
printf
(
"[AbsSFN %d.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f
\n
"
,
frame
,
subframe
,
slot
,
symbol
,
ue
->
high_speed_flag
,
type
,
symbol
,
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#else
LOG_I
(
PHY
,
"[AbsSFN %d.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f
\n
"
,
frame
,
subframe
,
slot
,
symbol
,
ue
->
high_speed_flag
,
type
,
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#endif
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
]);
#endif
aatx
=
frame_parms
->
nb_antenna_ports_eNB
;
aarx
=
frame_parms
->
nb_antennas_rx
;
...
...
@@ -392,6 +410,18 @@ int rx_pdsch(PHY_VARS_UE *ue,
nb_rb
);
}
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
]);
#if DISABLE_LOG_X
printf
(
"[AbsSFN %d.%d] Slot%d Symbol %d: Channel Scale %5.2f
\n
"
,
frame
,
subframe
,
slot
,
symbol
,
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#else
LOG_I
(
PHY
,
"[AbsSFN %d.%d] Slot%d Symbol %d: Channel Scale %5.2f
\n
"
,
frame
,
subframe
,
slot
,
symbol
,
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#endif
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
]);
#endif
if
(
first_symbol_flag
==
1
)
{
if
(
beamforming_mode
==
0
){
if
(
dlsch0_harq
->
mimo_mode
<
LARGE_CDD
)
{
...
...
@@ -482,6 +512,16 @@ int rx_pdsch(PHY_VARS_UE *ue,
avg
[
0
],
avgs
);
//LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
#endif
//wait until pdcch is decoded
proc
->
channel_level
=
1
;
}
uint32_t
wait
=
0
;
while
(
proc
->
channel_level
==
0
)
{
usleep
(
1
);
wait
++
;
}
#if T_TRACER
...
...
@@ -492,6 +532,19 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
#endif
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
]);
#if DISABLE_LOG_X
printf
(
"[AbsSFN %d.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f
\n
"
,
frame
,
subframe
,
slot
,
symbol
,
first_symbol_flag
,
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#else
LOG_I
(
PHY
,
"[AbsSFN %d.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f
\n
"
,
frame
,
subframe
,
slot
,
symbol
,
first_symbol_flag
,
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#endif
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
]);
#endif
// Now channel compensation
if
(
dlsch0_harq
->
mimo_mode
<
LARGE_CDD
)
{
dlsch_channel_compensation
(
pdsch_vars
[
eNB_id
]
->
rxdataF_ext
,
...
...
@@ -686,8 +739,18 @@ int rx_pdsch(PHY_VARS_UE *ue,
measurements
);
// log2_maxh+I0_shift
}
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
]);
#if DISABLE_LOG_X
printf
(
"[AbsSFN %d.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f
\n
"
,
frame
,
subframe
,
slot
,
symbol
,
pdsch_vars
[
eNB_id
]
->
log2_maxh
,
proc
->
channel_level
,
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#else
LOG_I
(
PHY
,
"[AbsSFN %d.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f
\n
"
,
frame
,
subframe
,
slot
,
symbol
,
pdsch_vars
[
eNB_id
]
->
log2_maxh
,
proc
->
channel_level
,
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#endif
// MRC
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
]);
#endif
if
(
frame_parms
->
nb_antennas_rx
>
1
)
{
if
((
dlsch0_harq
->
mimo_mode
==
LARGE_CDD
)
||
...
...
@@ -755,6 +818,18 @@ int rx_pdsch(PHY_VARS_UE *ue,
//i_mod should have been passed as a parameter
}
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
]);
#if DISABLE_LOG_X
printf
(
"[AbsSFN %d.%d] Slot%d Symbol %d: Channel Combine %5.2f
\n
"
,
frame
,
subframe
,
slot
,
symbol
,
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#else
LOG_I
(
PHY
,
"[AbsSFN %d.%d] Slot%d Symbol %d: Channel Combine %5.2f
\n
"
,
frame
,
subframe
,
slot
,
symbol
,
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#endif
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
]);
#endif
//printf("LLR dlsch0_harq->Qm %d rx_type %d cw0 %d cw1 %d symbol %d \n",dlsch0_harq->Qm,rx_type,codeword_TB0,codeword_TB1,symbol);
// compute LLRs
// -> // compute @pointer where llrs should filled for this ofdm-symbol
...
...
@@ -1102,6 +1177,14 @@ int rx_pdsch(PHY_VARS_UE *ue,
}
}
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
]);
#if DISABLE_LOG_X
printf
(
"[AbsSFN %d.%d] Slot%d Symbol %d: LLR Computation %5.2f
\n
"
,
frame
,
subframe
,
slot
,
symbol
,
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#else
LOG_I
(
PHY
,
"[AbsSFN %d.%d] Slot%d Symbol %d: LLR Computation %5.2f
\n
"
,
frame
,
subframe
,
slot
,
symbol
,
ue
->
generic_stat_bis
[
subframe
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#endif
// Please keep it: useful for debugging
#if 0
if( (symbol == 13) && (subframe==0) && (dlsch0_harq->Qm == 6) /*&& (nb_rb==25)*/)
...
...
@@ -1148,10 +1231,6 @@ int rx_pdsch(PHY_VARS_UE *ue,
T_BUFFER
(
&
pdsch_vars
[
eNB_id
]
->
rxdataF_comp0
[
eNB_id
][
0
],
2
*
/* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */
frame_parms
->
N_RB_UL
*
12
*
frame_parms
->
symbols_per_tti
*
2
));
#endif
if
(
symbol
==
(
ue
->
frame_parms
.
symbols_per_tti
>>
1
))
//(first_symbol_flag)
proc
->
first_symbol_available
=
1
;
return
(
0
);
}
...
...
openair1/PHY/LTE_TRANSPORT/initial_sync.c
View file @
ed145f57
...
...
@@ -233,19 +233,17 @@ int pbch_detection(PHY_VARS_UE *ue, runmode_t mode)
break
;
}
ue
->
proc
.
proc_rxtx
[
0
].
frame_rx
=
(((
ue
->
pbch_vars
[
0
]
->
decoded_output
[
2
]
&
3
)
<<
6
)
+
(
ue
->
pbch_vars
[
0
]
->
decoded_output
[
1
]
>>
2
))
<<
2
;
ue
->
proc
.
proc_rxtx
[
0
].
frame_rx
+=
frame_mod4
;
ue
->
proc
.
proc_rxtx
[
1
].
frame_rx
=
(((
ue
->
pbch_vars
[
0
]
->
decoded_output
[
2
]
&
3
)
<<
6
)
+
(
ue
->
pbch_vars
[
0
]
->
decoded_output
[
1
]
>>
2
))
<<
2
;
ue
->
proc
.
proc_rxtx
[
1
].
frame_rx
+=
frame_mod4
;
for
(
int
i
=
0
;
i
<
RX_NB_TH
;
i
++
)
{
ue
->
proc
.
proc_rxtx
[
i
].
frame_rx
=
(((
ue
->
pbch_vars
[
0
]
->
decoded_output
[
2
]
&
3
)
<<
6
)
+
(
ue
->
pbch_vars
[
0
]
->
decoded_output
[
1
]
>>
2
))
<<
2
;
ue
->
proc
.
proc_rxtx
[
i
].
frame_rx
=
(((
ue
->
pbch_vars
[
0
]
->
decoded_output
[
2
]
&
3
)
<<
6
)
+
(
ue
->
pbch_vars
[
0
]
->
decoded_output
[
1
]
>>
2
))
<<
2
;
#ifndef USER_MODE
// one frame delay
ue
->
proc
.
proc_rxtx
[
0
].
frame_rx
++
;
ue
->
proc
.
proc_rxtx
[
1
].
frame_rx
++
;
// one frame delay
ue
->
proc
.
proc_rxtx
[
i
].
frame_rx
++
;
#endif
ue
->
proc
.
proc_rxtx
[
0
].
frame_tx
=
ue
->
proc
.
proc_rxtx
[
0
].
frame_rx
;
ue
->
proc
.
proc_rxtx
[
1
].
frame_tx
=
ue
->
proc
.
proc_rxtx
[
1
].
frame_rx
;
ue
->
proc
.
proc_rxtx
[
i
].
frame_tx
=
ue
->
proc
.
proc_rxtx
[
0
].
frame_rx
;
}
#ifdef DEBUG_INITIAL_SYNCH
LOG_I
(
PHY
,
"[UE%d] Initial sync: pbch decoded sucessfully mode1_flag %d, tx_ant %d, frame %d, N_RB_DL %d, phich_duration %d, phich_resource %s!
\n
"
,
ue
->
Mod_id
,
...
...
openair1/PHY/defs.h
View file @
ed145f57
...
...
@@ -397,20 +397,27 @@ typedef struct {
struct
sched_param
sched_param_rxtx
;
/// internal This variable is protected by ref mutex_fep_slot1.
int
instance_cnt_fep_slot1
;
//int instance_cnt_slot0_dl_processing;
int
instance_cnt_slot1_dl_processing
;
/// pthread descriptor fep_slot1 thread
pthread_t
pthread_fep_slot1
;
//pthread_t pthread_slot0_dl_processing;
pthread_t
pthread_slot1_dl_processing
;
/// pthread attributes for fep_slot1 processing thread
pthread_attr_t
attr_fep_slot1
;
// pthread_attr_t attr_slot0_dl_processing;
pthread_attr_t
attr_slot1_dl_processing
;
/// condition variable for UE fep_slot1 thread;
pthread_cond_t
cond_fep_slot1
;
//pthread_cond_t cond_slot0_dl_processing;
pthread_cond_t
cond_slot1_dl_processing
;
/// mutex for UE synch thread
pthread_mutex_t
mutex_fep_slot1
;
//pthread_mutex_t mutex_slot0_dl_processing;
pthread_mutex_t
mutex_slot1_dl_processing
;
//
uint8_t
chan_est_pilot0_slot1_available
;
uint8_t
chan_est_slot1_available
;
uint8_t
llr_slot1_available
;
uint8_t
dci_slot0_available
;
uint8_t
first_symbol_available
;
uint8_t
channel_level
;
/// scheduling parameters for fep_slot1 thread
struct
sched_param
sched_param_fep_slot1
;
...
...
@@ -910,6 +917,7 @@ typedef struct {
time_stats_t
ulsch_multiplexing_stats
;
time_stats_t
generic_stat
;
time_stats_t
generic_stat_bis
[
RX_NB_TH
][
LTE_SLOTS_PER_SUBFRAME
];
time_stats_t
ue_front_end_stat
[
RX_NB_TH
];
time_stats_t
ue_front_end_per_slot_stat
[
RX_NB_TH
][
LTE_SLOTS_PER_SUBFRAME
];
time_stats_t
pdcch_procedures_stat
[
RX_NB_TH
];
...
...
openair1/SCHED/defs.h
View file @
ed145f57
...
...
@@ -140,9 +140,11 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t
@param phy_vars_rn pointer to RN variables
*/
int
phy_procedures_UE_RX
(
PHY_VARS_UE
*
phy_vars_ue
,
UE_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
,
PHY_VARS_RN
*
phy_vars_rn
);
int
phy_procedures_slot_parallelization_UE_RX
(
PHY_VARS_UE
*
ue
,
UE_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
,
PHY_VARS_RN
*
phy_vars_rn
);
#ifdef UE_SLOT_PARALLELISATION
void
*
UE_thread_
fep_
slot1
(
void
*
arg
);
void
*
UE_thread_slot1
_dl_processing
(
void
*
arg
);
#endif
/*! \brief Scheduling for UE TX procedures in TDD S-subframes.
...
...
openair1/SCHED/phy_procedures_lte_ue.c
View file @
ed145f57
...
...
@@ -30,12 +30,16 @@
* \warning
*/
#define _GNU_SOURCE
#include "assertions.h"
#include "defs.h"
#include "PHY/defs.h"
#include "PHY/extern.h"
#include "SCHED/defs.h"
#include "SCHED/extern.h"
#include <sched.h>
#include "targets/RT/USER/lte-softmodem.h"
#ifdef EMOS
#include "SCHED/phy_procedures_emos.h"
...
...
@@ -73,8 +77,6 @@ fifo_dump_emos_UE emos_dump_UE;
#define NS_PER_SLOT 500000
extern
int
oai_exit
;
extern
double
cpuf
;
...
...
@@ -2950,16 +2952,18 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin
{
ue
->
proc
.
proc_rxtx
[
th_id
].
frame_rx
=
proc
->
frame_rx
;
ue
->
proc
.
proc_rxtx
[
th_id
].
frame_tx
=
proc
->
frame_tx
;
printf
(
"[UE %d] frame %d, subframe %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d, rx_offset %d) => new frame %d
\n
"
,
ue
->
Mod_id
,
ue
->
proc
.
proc_rxtx
[
th_id
].
frame_rx
,
subframe_rx
,
pbch_tx_ant
,
frame_tx
,
pbch_phase
,
ue
->
rx_offset
,
proc
->
frame_rx
);
}
LOG_I
(
PHY
,
"[UE %d] frame %d, subframe %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d, rx_offset %d) => new frame %d
\n
"
,
ue
->
Mod_id
,
frame_rx
,
subframe_rx
,
pbch_tx_ant
,
frame_tx
,
pbch_phase
,
ue
->
rx_offset
,
proc
->
frame_rx
);
frame_rx
=
proc
->
frame_rx
;
...
...
@@ -3174,7 +3178,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
(
dci_alloc_rx
[
i
].
rnti
==
ue
->
pdcch_vars
[
subframe_rx
%
RX_NB_TH
][
eNB_id
]
->
crnti
)
&&
(
dci_alloc_rx
[
i
].
format
!=
format0
))
{
LOG_
I
(
PHY
,
"[UE %d][DCI][PDSCH %x] AbsSubframe %d.%d: format %d, num_pdcch_symbols %d, nCCE %d, total CCEs %d
\n
"
,
LOG_
D
(
PHY
,
"[UE %d][DCI][PDSCH %x] AbsSubframe %d.%d: format %d, num_pdcch_symbols %d, nCCE %d, total CCEs %d
\n
"
,
ue
->
Mod_id
,
dci_alloc_rx
[
i
].
rnti
,
frame_rx
%
1024
,
subframe_rx
,
dci_alloc_rx
[
i
].
format
,
...
...
@@ -3249,9 +3253,9 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
else
if
((
dci_alloc_rx
[
i
].
rnti
==
SI_RNTI
)
&&
((
dci_alloc_rx
[
i
].
format
==
format1A
)
||
(
dci_alloc_rx
[
i
].
format
==
format1C
)))
{
//
#ifdef DEBUG_PHY_PROC
LOG_
I
(
PHY
,
"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d
\n
"
,
ue
->
Mod_id
,
subframe_rx
,
dci_alloc_rx
[
i
].
rnti
,
dci_alloc_rx
[
i
].
format
==
format1A
?
"A"
:
"C"
,
i
);
//
#endif
#ifdef DEBUG_PHY_PROC
LOG_
D
(
PHY
,
"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d
\n
"
,
ue
->
Mod_id
,
subframe_rx
,
dci_alloc_rx
[
i
].
rnti
,
dci_alloc_rx
[
i
].
format
==
format1A
?
"A"
:
"C"
,
i
);
#endif
if
(
generate_ue_dlsch_params_from_dci
(
frame_rx
,
...
...
@@ -3273,7 +3277,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
ue
->
dlsch_SI_received
[
eNB_id
]
++
;
LOG_
I
(
PHY
,
"[UE %d] Frame %d, subframe %d : Generate UE DLSCH SI_RNTI format 1%s
\n
"
,
ue
->
Mod_id
,
frame_rx
,
subframe_rx
,
dci_alloc_rx
[
i
].
format
==
format1A
?
"A"
:
"C"
);
LOG_
D
(
PHY
,
"[UE %d] Frame %d, subframe %d : Generate UE DLSCH SI_RNTI format 1%s
\n
"
,
ue
->
Mod_id
,
frame_rx
,
subframe_rx
,
dci_alloc_rx
[
i
].
format
==
format1A
?
"A"
:
"C"
);
//dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
}
...
...
@@ -3282,9 +3286,9 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
else
if
((
dci_alloc_rx
[
i
].
rnti
==
P_RNTI
)
&&
((
dci_alloc_rx
[
i
].
format
==
format1A
)
||
(
dci_alloc_rx
[
i
].
format
==
format1C
)))
{
//
#ifdef DEBUG_PHY_PROC
LOG_
I
(
PHY
,
"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d
\n
"
,
ue
->
Mod_id
,
subframe_rx
,
dci_alloc_rx
[
i
].
rnti
,
dci_alloc_rx
[
i
].
format
==
format1A
?
"A"
:
"C"
,
i
);
//
#endif
#ifdef DEBUG_PHY_PROC
LOG_
D
(
PHY
,
"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d
\n
"
,
ue
->
Mod_id
,
subframe_rx
,
dci_alloc_rx
[
i
].
rnti
,
dci_alloc_rx
[
i
].
format
==
format1A
?
"A"
:
"C"
,
i
);
#endif
if
(
generate_ue_dlsch_params_from_dci
(
frame_rx
,
...
...
@@ -3314,13 +3318,13 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
(
dci_alloc_rx
[
i
].
rnti
==
ue
->
prach_resources
[
eNB_id
]
->
ra_RNTI
)
&&
(
dci_alloc_rx
[
i
].
format
==
format1A
))
{
//
#ifdef DEBUG_PHY_PROC
LOG_
I
(
PHY
,
"[UE %d][RAPROC] subframe %d: Found RA rnti %x, format 1A, dci_cnt %d
\n
"
,
ue
->
Mod_id
,
subframe_rx
,
dci_alloc_rx
[
i
].
rnti
,
i
);
#ifdef DEBUG_PHY_PROC
LOG_
D
(
PHY
,
"[UE %d][RAPROC] subframe %d: Found RA rnti %x, format 1A, dci_cnt %d
\n
"
,
ue
->
Mod_id
,
subframe_rx
,
dci_alloc_rx
[
i
].
rnti
,
i
);
//if (((frame_rx%100) == 0) || (frame_rx < 20))
//dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
//mac_xface->macphy_exit("so far so good...\n");
//
#endif
#endif
if
(
generate_ue_dlsch_params_from_dci
(
frame_rx
,
...
...
@@ -3682,9 +3686,9 @@ void ue_pdsch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, int eNB_id, PDSC
}
if
((
m
==
s0
)
&&
(
m
<
4
))
first_symbol_flag
=
1
;
first_symbol_flag
=
1
;
else
first_symbol_flag
=
0
;
first_symbol_flag
=
0
;
#if UE_TIMING_TRACE
uint8_t
slot
=
0
;
if
(
m
>=
ue
->
frame_parms
.
symbols_per_tti
>>
1
)
...
...
@@ -3706,13 +3710,19 @@ void ue_pdsch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, int eNB_id, PDSC
dlsch0
->
current_harq_pid
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_llr_stats
[
subframe_rx
%
RX_NB_TH
][
slot
]);
//#if DISABLE_LOG_X
// printf("[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f \n",proc->frame_rx,subframe_rx,m,ue->dlsch_llr_stats[subframe_rx%RX_NB_TH][slot].p_time/(cpuf*1000.0));
//#else
// LOG_D(PHY, "[AbsSFN %d.%d] LLR Computation Symbol %d %5.2fn %5.2f \n",proc->frame_rx,subframe_rx,m,ue->dlsch_llr_stats[subframe_rx%RX_NB_TH][slot].p_time/(cpuf*1000.0));
//#endif
#if DISABLE_LOG_X
printf
(
"[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f
\n
"
,
proc
->
frame_rx
,
subframe_rx
,
m
,
ue
->
dlsch_llr_stats
[
subframe_rx
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#else
LOG_D
(
PHY
,
"[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f
\n
"
,
proc
->
frame_rx
,
subframe_rx
,
m
,
ue
->
dlsch_llr_stats
[
subframe_rx
%
RX_NB_TH
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#endif
if
(
first_symbol_flag
)
{
proc
->
first_symbol_available
=
1
;
printf
(
"Set first_symbol_available to 1
\n
"
);
}
}
// CRNTI active
}
}
...
...
@@ -4039,9 +4049,9 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
if
(
ret
==
(
1
+
dlsch0
->
max_turbo_iterations
))
{
*
dlsch_errors
=*
dlsch_errors
+
1
;
//
if(dlsch0->rnti != 0xffff)
if
(
dlsch0
->
rnti
!=
0xffff
)
{
LOG_
I
(
PHY
,
"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : DLSCH CW0 in error (rv %d,round %d, mcs %d,TBS %d)
\n
"
,
LOG_
D
(
PHY
,
"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : DLSCH CW0 in error (rv %d,round %d, mcs %d,TBS %d)
\n
"
,
ue
->
Mod_id
,
dlsch0
->
rnti
,
harq_pid
,
frame_rx
,
subframe_rx
,
dlsch0
->
harq_processes
[
harq_pid
]
->
rvidx
,
...
...
@@ -4052,9 +4062,9 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
}
else
{
//
if(dlsch0->rnti != 0xffff)
if
(
dlsch0
->
rnti
!=
0xffff
)
{
LOG_
I
(
PHY
,
"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : Received DLSCH CW0 (rv %d,round %d, mcs %d,TBS %d)
\n
"
,
LOG_
D
(
PHY
,
"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : Received DLSCH CW0 (rv %d,round %d, mcs %d,TBS %d)
\n
"
,
ue
->
Mod_id
,
dlsch0
->
rnti
,
harq_pid
,
frame_rx
,
subframe_rx
,
dlsch0
->
harq_processes
[
harq_pid
]
->
rvidx
,
...
...
@@ -4189,8 +4199,6 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
}
//Merge 2017.w25
#ifdef UE_SLOT_PARALLELISATION
/*!
* \brief This is the UE synchronize thread.
* It performs band scanning and synchonization.
...
...
@@ -4198,15 +4206,297 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
*/
#define FIFO_PRIORITY 40
void
*
UE_thread_
fep_
slot1
(
void
*
arg
)
{
void
*
UE_thread_slot1
_dl_processing
(
void
*
arg
)
{
}
static
__thread
int
UE_dl_slot1_processing_retval
;
struct
rx_tx_thread_data
*
rtd
=
arg
;
UE_rxtx_proc_t
*
proc
=
rtd
->
proc
;
PHY_VARS_UE
*
ue
=
rtd
->
UE
;
int
frame_rx
;
uint8_t
subframe_rx
;
uint8_t
pilot0
;
uint8_t
pilot1
;
uint8_t
slot1
;
uint8_t
next_subframe_rx
;
uint8_t
next_subframe_slot0
;
proc
->
instance_cnt_slot1_dl_processing
=-
1
;
proc
->
subframe_rx
=
proc
->
sub_frame_start
;
char
threadname
[
256
];
sprintf
(
threadname
,
"UE_thread_slot1_dl_processing_%d"
,
proc
->
sub_frame_start
);
cpu_set_t
cpuset
;
CPU_ZERO
(
&
cpuset
);
if
(
(
proc
->
sub_frame_start
+
1
)
%
RX_NB_TH
==
0
&&
threads
.
slot1_proc_one
!=
-
1
)
CPU_SET
(
threads
.
slot1_proc_one
,
&
cpuset
);
if
(
(
proc
->
sub_frame_start
+
1
)
%
RX_NB_TH
==
1
&&
threads
.
slot1_proc_two
!=
-
1
)
CPU_SET
(
threads
.
slot1_proc_two
,
&
cpuset
);
if
(
(
proc
->
sub_frame_start
+
1
)
%
RX_NB_TH
==
2
&&
threads
.
slot1_proc_three
!=
-
1
)
CPU_SET
(
threads
.
slot1_proc_three
,
&
cpuset
);
init_thread
(
900000
,
1000000
,
FIFO_PRIORITY
-
1
,
&
cpuset
,
threadname
);
while
(
!
oai_exit
)
{
if
(
pthread_mutex_lock
(
&
proc
->
mutex_slot1_dl_processing
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE] error locking mutex for UE slot1 dl processing
\n
"
);
exit_fun
(
"nothing to add"
);
}
while
(
proc
->
instance_cnt_slot1_dl_processing
<
0
)
{
// most of the time, the thread is waiting here
pthread_cond_wait
(
&
proc
->
cond_slot1_dl_processing
,
&
proc
->
mutex_slot1_dl_processing
);
}
if
(
pthread_mutex_unlock
(
&
proc
->
mutex_slot1_dl_processing
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE] error unlocking mutex for UE slot1 dl processing
\n
"
);
exit_fun
(
"nothing to add"
);
}
/*for(int th_idx=0; th_idx< RX_NB_TH; th_idx++)
{
frame_rx = ue->proc.proc_rxtx[0].frame_rx;
subframe_rx = ue->proc.proc_rxtx[0].subframe_rx;
printf("AbsSubframe %d.%d execute dl slot1 processing \n", frame_rx, subframe_rx);
}*/
frame_rx
=
proc
->
frame_rx
;
subframe_rx
=
proc
->
subframe_rx
;
next_subframe_rx
=
(
1
+
subframe_rx
)
%
10
;
next_subframe_slot0
=
next_subframe_rx
<<
1
;
slot1
=
(
subframe_rx
<<
1
)
+
1
;
pilot0
=
0
;
printf
(
"AbsSubframe %d.%d execute dl slot1 processing
\n
"
,
frame_rx
,
subframe_rx
);
if
(
ue
->
frame_parms
.
Ncp
==
0
)
{
// normal prefix
pilot1
=
4
;
}
else
{
// extended prefix
pilot1
=
3
;
}
/**** Slot1 FE Processing ****/
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
ue_front_end_per_slot_stat
[
subframe_rx
%
RX_NB_TH
][
1
]);
#endif
// I- start dl slot1 processing
// do first symbol of next downlink subframe for channel estimation
/*
// 1- perform FFT for pilot ofdm symbols first (ofdmSym0 next subframe ofdmSym11)
if (subframe_select(&ue->frame_parms,next_subframe_rx) != SF_UL)
{
front_end_fft(ue,
pilot0,
next_subframe_slot0,
0,
0);
}
front_end_fft(ue,
pilot1,
slot1,
0,
0);
*/
// 1- perform FFT
for
(
int
l
=
1
;
l
<
ue
->
frame_parms
.
symbols_per_tti
>>
1
;
l
++
)
{
//if( (l != pilot0) && (l != pilot1))
{
#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
);
//printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,subframe_rx,slot1,l);
front_end_fft
(
ue
,
l
,
slot1
,
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
#if 1
int
phy_procedures_UE_RX
(
PHY_VARS_UE
*
ue
,
UE_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
,
PHY_VARS_RN
*
phy_vars_rn
)
{
if
(
subframe_select
(
&
ue
->
frame_parms
,
next_subframe_rx
)
!=
SF_UL
)
{
//printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,subframe_rx,next_subframe_slot0,pilot0);
front_end_fft
(
ue
,
pilot0
,
next_subframe_slot0
,
0
,
0
);
}
// 2- perform Channel Estimation for slot1
for
(
int
l
=
1
;
l
<
ue
->
frame_parms
.
symbols_per_tti
>>
1
;
l
++
)
{
if
(
l
==
pilot1
)
{
//wait until channel estimation for pilot0/slot1 is available
uint32_t
wait
=
0
;
while
(
proc
->
chan_est_pilot0_slot1_available
==
0
)
{
usleep
(
1
);
wait
++
;
}
printf
(
"[slot1 dl processing] ChanEst symbol %d slot %d wait%d
\n
"
,
l
,
slot1
,
wait
);
}
//printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,subframe_rx,slot1,l);
front_end_chanEst
(
ue
,
l
,
slot1
,
0
);
ue_measurement_procedures
(
l
-
1
,
ue
,
proc
,
0
,
1
+
(
subframe_rx
<<
1
),
0
,
ue
->
mode
);
}
//printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,subframe_rx,next_subframe_slot0,pilot0);
front_end_chanEst
(
ue
,
pilot0
,
next_subframe_slot0
,