Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
canghaiwuhen
OpenXG-RAN
Commits
de4712e7
Commit
de4712e7
authored
Nov 28, 2017
by
hbilel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
UE add new dlsch thread
parent
2528ed13
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
1428 additions
and
0 deletions
+1428
-0
openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
+1327
-0
openair1/PHY/LTE_TRANSPORT/proto.h
openair1/PHY/LTE_TRANSPORT/proto.h
+15
-0
openair1/PHY/defs.h
openair1/PHY/defs.h
+17
-0
openair1/SCHED/defs.h
openair1/SCHED/defs.h
+1
-0
openair1/SCHED/phy_procedures_lte_ue.c
openair1/SCHED/phy_procedures_lte_ue.c
+43
-0
targets/COMMON/threads_t.h
targets/COMMON/threads_t.h
+3
-0
targets/RT/USER/lte-softmodem.c
targets/RT/USER/lte-softmodem.c
+15
-0
targets/RT/USER/lte-ue.c
targets/RT/USER/lte-ue.c
+7
-0
No files found.
openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
View file @
de4712e7
...
...
@@ -36,6 +36,7 @@
#include "PHY/CODING/extern.h"
#include "SCHED/extern.h"
#include "SIMULATION/TOOLS/defs.h"
#include "targets/RT/USER/lte-softmodem.h"
//#define DEBUG_DLSCH_DECODING
extern
double
cpuf
;
...
...
@@ -758,6 +759,1332 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
return
(
ret
);
}
#ifdef UE_DLSCH_PARALLELISATION
uint32_t
dlsch_decoding_mthread
(
PHY_VARS_UE
*
phy_vars_ue
,
UE_rxtx_proc_t
*
proc
,
int
eNB_id
,
short
*
dlsch_llr
,
LTE_DL_FRAME_PARMS
*
frame_parms
,
LTE_UE_DLSCH_t
*
dlsch
,
LTE_DL_UE_HARQ_t
*
harq_process
,
uint32_t
frame
,
uint8_t
nr_tti_rx
,
uint8_t
harq_pid
,
uint8_t
is_crnti
,
uint8_t
llr8_flag
)
{
#if UE_TIMING_TRACE
time_stats_t
*
dlsch_rate_unmatching_stats
=&
phy_vars_ue
->
dlsch_rate_unmatching_stats
;
time_stats_t
*
dlsch_turbo_decoding_stats
=&
phy_vars_ue
->
dlsch_turbo_decoding_stats
;
time_stats_t
*
dlsch_deinterleaving_stats
=&
phy_vars_ue
->
dlsch_deinterleaving_stats
;
#endif
uint32_t
A
,
E
;
uint32_t
G
;
uint32_t
ret
,
offset
;
uint16_t
iind
;
// uint8_t dummy_channel_output[(3*8*block_length)+12];
short
dummy_w
[
MAX_NUM_DLSCH_SEGMENTS
][
3
*
(
6144
+
64
)];
uint32_t
r
,
r_offset
=
0
,
Kr
,
Kr_bytes
,
err_flag
=
0
;
uint8_t
crc_type
;
//UE_rxtx_proc_t *proc = &phy_vars_ue->proc;
int
Cby2
;
#ifdef DEBUG_DLSCH_DECODING
uint16_t
i
;
#endif
//#ifdef __AVX2__
#if 0
int Kr_last,skipped_last=0;
uint8_t (*tc_2cw)(int16_t *y,
int16_t *y2,
uint8_t *,
uint8_t *,
uint16_t,
uint16_t,
uint16_t,
uint8_t,
uint8_t,
uint8_t,
time_stats_t *,
time_stats_t *,
time_stats_t *,
time_stats_t *,
time_stats_t *,
time_stats_t *,
time_stats_t *);
#endif
uint8_t
(
*
tc
)(
int16_t
*
y
,
uint8_t
*
,
uint16_t
,
uint16_t
,
uint16_t
,
uint8_t
,
uint8_t
,
uint8_t
,
time_stats_t
*
,
time_stats_t
*
,
time_stats_t
*
,
time_stats_t
*
,
time_stats_t
*
,
time_stats_t
*
,
time_stats_t
*
);
if
(
!
dlsch_llr
)
{
printf
(
"dlsch_decoding.c: NULL dlsch_llr pointer
\n
"
);
return
(
dlsch
->
max_turbo_iterations
);
}
if
(
!
harq_process
)
{
printf
(
"dlsch_decoding.c: NULL harq_process pointer
\n
"
);
return
(
dlsch
->
max_turbo_iterations
);
}
if
(
!
frame_parms
)
{
printf
(
"dlsch_decoding.c: NULL frame_parms pointer
\n
"
);
return
(
dlsch
->
max_turbo_iterations
);
}
if
(
nr_tti_rx
>
(
10
*
frame_parms
->
ttis_per_subframe
-
1
))
{
printf
(
"dlsch_decoding.c: Illegal subframe index %d
\n
"
,
nr_tti_rx
);
return
(
dlsch
->
max_turbo_iterations
);
}
if
(
dlsch
->
harq_ack
[
nr_tti_rx
].
ack
!=
2
)
{
LOG_D
(
PHY
,
"[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!
\n
"
,
phy_vars_ue
->
Mod_id
,
nr_tti_rx
,
dlsch
->
harq_ack
[
nr_tti_rx
].
ack
);
}
if
(
llr8_flag
==
0
)
{
//#ifdef __AVX2__
#if 0
tc_2cw = phy_threegpplte_turbo_decoder16avx2;
#endif
tc
=
phy_threegpplte_turbo_decoder16
;
}
else
{
AssertFatal
(
harq_process
->
TBS
>=
256
,
"Mismatch flag nbRB=%d TBS=%d mcs=%d Qm=%d RIV=%d round=%d
\n
"
,
harq_process
->
nb_rb
,
harq_process
->
TBS
,
harq_process
->
mcs
,
harq_process
->
Qm
,
harq_process
->
rvidx
,
harq_process
->
round
);
tc
=
phy_threegpplte_turbo_decoder8
;
}
// nb_rb = dlsch->nb_rb;
/*
if (nb_rb > frame_parms->N_RB_DL) {
printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb);
return(max_turbo_iterations);
}*/
/*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]];
if (harq_pid >= 8) {
printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
return(max_turbo_iterations);
}
*/
harq_process
->
trials
[
harq_process
->
round
]
++
;
A
=
harq_process
->
TBS
;
//2072 for QPSK 1/3
ret
=
dlsch
->
max_turbo_iterations
;
G
=
harq_process
->
G
;
//get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe);
// printf("DLSCH Decoding, harq_pid %d Ndi %d\n",harq_pid,harq_process->Ndi);
if
(
harq_process
->
round
==
0
)
{
// This is a new packet, so compute quantities regarding segmentation
harq_process
->
B
=
A
+
24
;
lte_segmentation
(
NULL
,
NULL
,
harq_process
->
B
,
&
harq_process
->
C
,
&
harq_process
->
Cplus
,
&
harq_process
->
Cminus
,
&
harq_process
->
Kplus
,
&
harq_process
->
Kminus
,
&
harq_process
->
F
);
// CLEAR LLR's HERE for first packet in process
}
/*
else {
printf("dlsch_decoding.c: Ndi>0 not checked yet!!\n");
return(max_turbo_iterations);
}
*/
err_flag
=
0
;
r_offset
=
0
;
unsigned
char
bw_scaling
=
1
;
switch
(
frame_parms
->
N_RB_DL
)
{
case
6
:
bw_scaling
=
16
;
break
;
case
25
:
bw_scaling
=
4
;
break
;
case
50
:
bw_scaling
=
2
;
break
;
default:
bw_scaling
=
1
;
break
;
}
if
(
harq_process
->
C
>
MAX_NUM_DLSCH_SEGMENTS
/
bw_scaling
)
{
LOG_E
(
PHY
,
"Illegal harq_process->C %d > %d
\n
"
,
harq_process
->
C
,
MAX_NUM_DLSCH_SEGMENTS
/
bw_scaling
);
return
((
1
+
dlsch
->
max_turbo_iterations
));
}
#ifdef DEBUG_DLSCH_DECODING
printf
(
"Segmentation: C %d, Cminus %d, Kminus %d, Kplus %d
\n
"
,
harq_process
->
C
,
harq_process
->
Cminus
,
harq_process
->
Kminus
,
harq_process
->
Kplus
);
#endif
opp_enabled
=
1
;
if
(
harq_process
->
C
>
1
)
{
// wakeup worker if more than 1 segment
if
(
pthread_mutex_lock
(
&
proc
->
mutex_dlsch_td
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE %d][Slot0] error locking mutex for UE dlsch td
\n
"
,
phy_vars_ue
->
Mod_id
);
exit_fun
(
"nothing to add"
);
}
proc
->
instance_cnt_dlsch_td
++
;
proc
->
eNB_id
=
eNB_id
;
proc
->
harq_pid
=
harq_pid
;
proc
->
llr8_flag
=
llr8_flag
;
if
(
proc
->
instance_cnt_dlsch_td
==
0
)
{
LOG_D
(
PHY
,
"unblock slot1 dl processing thread blocked on instance_cnt_dlsch_td : %d
\n
"
,
proc
->
instance_cnt_dlsch_td
);
if
(
pthread_cond_signal
(
&
proc
->
cond_dlsch_td
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE %d][Slot0] ERROR pthread_cond_signal for UE dlsch td
\n
"
,
phy_vars_ue
->
Mod_id
);
exit_fun
(
"nothing to add"
);
}
if
(
pthread_mutex_unlock
(
&
proc
->
mutex_dlsch_td
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE %d][Slot0] error unlocking mutex for UE dlsch td
\n
"
,
phy_vars_ue
->
Mod_id
);
exit_fun
(
"nothing to add"
);
}
}
else
{
LOG_E
(
PHY
,
"[SCHED][UE %d] UE dlsch td thread busy (IC %d)!!
\n
"
,
phy_vars_ue
->
Mod_id
,
proc
->
instance_cnt_dlsch_td
);
if
(
proc
->
instance_cnt_dlsch_td
>
2
)
exit_fun
(
"instance_cnt_dlsch_td > 2"
);
}
//AssertFatal(pthread_cond_signal(&proc->cond_slot1_dl_processing) ==0 ,"");
AssertFatal
(
pthread_mutex_unlock
(
&
proc
->
mutex_dlsch_td
)
==
0
,
""
);
/*
if (pthread_mutex_timedlock(&proc->mutex_td,&wait) != 0) {
printf("[eNB] ERROR pthread_mutex_lock for TD thread (IC %d)\n", proc->instance_cnt_td);
exit_fun( "error locking mutex_fep" );
return -1;
}
if (proc->instance_cnt_td==0) {
printf("[UE] TD thread busy\n");
exit_fun("TD thread busy");
pthread_mutex_unlock( &proc->mutex_td );
return -1;
}
++proc->instance_cnt_td;
proc->tdp.UE = phy_vars_ue;
proc->tdp.eNB_id = eNB_id;
proc->tdp.harq_pid = harq_pid;
proc->tdp.llr8_flag = llr8_flag;
printf("----- 2thread llr flag %d tdp flag %d\n",llr8_flag, proc->tdp.llr8_flag);
// wakeup worker to do second half segments
if (pthread_cond_signal(&proc->cond_td) != 0) {
printf("[UE] ERROR pthread_cond_signal for td thread exit\n");
exit_fun( "ERROR pthread_cond_signal" );
return (1+dlsch->last_iteration_cnt);
}
pthread_mutex_unlock( &proc->mutex_td );*/
Cby2
=
harq_process
->
C
/
2
;
}
else
{
Cby2
=
1
;
}
for
(
r
=
0
;
r
<
Cby2
;
r
++
)
{
// Get Turbo interleaver parameters
if
(
r
<
harq_process
->
Cminus
)
Kr
=
harq_process
->
Kminus
;
else
Kr
=
harq_process
->
Kplus
;
Kr_bytes
=
Kr
>>
3
;
if
(
Kr_bytes
<=
64
)
iind
=
(
Kr_bytes
-
5
);
else
if
(
Kr_bytes
<=
128
)
iind
=
59
+
((
Kr_bytes
-
64
)
>>
1
);
else
if
(
Kr_bytes
<=
256
)
iind
=
91
+
((
Kr_bytes
-
128
)
>>
2
);
else
if
(
Kr_bytes
<=
768
)
iind
=
123
+
((
Kr_bytes
-
256
)
>>
3
);
else
{
printf
(
"dlsch_decoding: Illegal codeword size %d!!!
\n
"
,
Kr_bytes
);
return
(
dlsch
->
max_turbo_iterations
);
}
#ifdef DEBUG_DLSCH_DECODING
printf
(
"f1 %d, f2 %d, F %d
\n
"
,
f1f2mat_old
[
2
*
iind
],
f1f2mat_old
[
1
+
(
2
*
iind
)],(
r
==
0
)
?
harq_process
->
F
:
0
);
#endif
#if UE_TIMING_TRACE
start_meas
(
dlsch_rate_unmatching_stats
);
#endif
memset
(
&
dummy_w
[
r
][
0
],
0
,
3
*
(
6144
+
64
)
*
sizeof
(
short
));
harq_process
->
RTC
[
r
]
=
generate_dummy_w
(
4
+
(
Kr_bytes
*
8
),
(
uint8_t
*
)
&
dummy_w
[
r
][
0
],
(
r
==
0
)
?
harq_process
->
F
:
0
);
#ifdef DEBUG_DLSCH_DECODING
LOG_D
(
PHY
,
"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...
\n
"
,
harq_pid
,
r
,
G
,
Kr
*
3
,
harq_process
->
TBS
,
harq_process
->
Qm
,
harq_process
->
nb_rb
,
harq_process
->
Nl
,
harq_process
->
rvidx
,
harq_process
->
round
);
#endif
#ifdef DEBUG_DLSCH_DECODING
printf
(
" in decoding dlsch->harq_processes[harq_pid]->rvidx = %d
\n
"
,
dlsch
->
harq_processes
[
harq_pid
]
->
rvidx
);
#endif
if
(
lte_rate_matching_turbo_rx
(
harq_process
->
RTC
[
r
],
G
,
harq_process
->
w
[
r
],
(
uint8_t
*
)
&
dummy_w
[
r
][
0
],
dlsch_llr
+
r_offset
,
harq_process
->
C
,
dlsch
->
Nsoft
,
dlsch
->
Mdlharq
,
dlsch
->
Kmimo
,
harq_process
->
rvidx
,
(
harq_process
->
round
==
0
)
?
1
:
0
,
harq_process
->
Qm
,
harq_process
->
Nl
,
r
,
&
E
)
==-
1
)
{
#if UE_TIMING_TRACE
stop_meas
(
dlsch_rate_unmatching_stats
);
#endif
LOG_E
(
PHY
,
"dlsch_decoding.c: Problem in rate_matching
\n
"
);
return
(
dlsch
->
max_turbo_iterations
);
}
else
{
#if UE_TIMING_TRACE
stop_meas
(
dlsch_rate_unmatching_stats
);
#endif
}
r_offset
+=
E
;
/*
printf("Subblock deinterleaving, d %p w %p\n",
harq_process->d[r],
harq_process->w);
*/
#if UE_TIMING_TRACE
start_meas
(
dlsch_deinterleaving_stats
);
#endif
sub_block_deinterleaving_turbo
(
4
+
Kr
,
&
harq_process
->
d
[
r
][
96
],
harq_process
->
w
[
r
]);
#if UE_TIMING_TRACE
stop_meas
(
dlsch_deinterleaving_stats
);
#endif
#ifdef DEBUG_DLSCH_DECODING
/*
if (r==0) {
write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0);
write_output("decoder_in.m","dec",&harq_process->d[0][96],(3*8*Kr_bytes)+12,1,0);
}
printf("decoder input(segment %d) :",r);
int i; for (i=0;i<(3*8*Kr_bytes)+12;i++)
printf("%d : %d\n",i,harq_process->d[r][96+i]);
printf("\n");*/
#endif
// printf("Clearing c, %p\n",harq_process->c[r]);
memset
(
harq_process
->
c
[
r
],
0
,
Kr_bytes
);
// printf("done\n");
if
(
harq_process
->
C
==
1
)
crc_type
=
CRC24_A
;
else
crc_type
=
CRC24_B
;
/*
printf("decoder input(segment %d)\n",r);
for (i=0;i<(3*8*Kr_bytes)+12;i++)
if ((harq_process->d[r][96+i]>7) ||
(harq_process->d[r][96+i] < -8))
printf("%d : %d\n",i,harq_process->d[r][96+i]);
printf("\n");
*/
//#ifndef __AVX2__
#if 1
if
(
err_flag
==
0
)
{
/*
LOG_I(PHY, "turbo algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_turbo_iterations);
*/
if
(
llr8_flag
)
{
AssertFatal
(
Kr
>=
256
,
"turbo algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d
\n
"
,
Kr
,
r
,
harq_process
->
C
,
harq_process
->
nb_rb
,
A
,
harq_process
->
TBS
,
harq_process
->
B
,
harq_process
->
mcs
,
harq_process
->
Qm
,
harq_process
->
rvidx
,
harq_process
->
round
);
}
#if UE_TIMING_TRACE
start_meas
(
dlsch_turbo_decoding_stats
);
#endif
LOG_D
(
PHY
,
"AbsSubframe %d.%d Start turbo segment %d/%d
\n
"
,
frame
%
1024
,
nr_tti_rx
,
r
,
harq_process
->
C
-
1
);
ret
=
tc
(
&
harq_process
->
d
[
r
][
96
],
harq_process
->
c
[
r
],
Kr
,
f1f2mat_old
[
iind
*
2
],
f1f2mat_old
[(
iind
*
2
)
+
1
],
dlsch
->
max_turbo_iterations
,
crc_type
,
(
r
==
0
)
?
harq_process
->
F
:
0
,
&
phy_vars_ue
->
dlsch_tc_init_stats
,
&
phy_vars_ue
->
dlsch_tc_alpha_stats
,
&
phy_vars_ue
->
dlsch_tc_beta_stats
,
&
phy_vars_ue
->
dlsch_tc_gamma_stats
,
&
phy_vars_ue
->
dlsch_tc_ext_stats
,
&
phy_vars_ue
->
dlsch_tc_intl1_stats
,
&
phy_vars_ue
->
dlsch_tc_intl2_stats
);
//(is_crnti==0)?harq_pid:harq_pid+1);
#if UE_TIMING_TRACE
stop_meas
(
dlsch_turbo_decoding_stats
);
#endif
}
#else
if
((
harq_process
->
C
==
1
)
||
((
r
==
harq_process
->
C
-
1
)
&&
(
skipped_last
==
0
)))
{
// last segment with odd number of segments
#if UE_TIMING_TRACE
start_meas
(
dlsch_turbo_decoding_stats
);
#endif
ret
=
tc
(
&
harq_process
->
d
[
r
][
96
],
harq_process
->
c
[
r
],
Kr
,
f1f2mat_old
[
iind
*
2
],
f1f2mat_old
[(
iind
*
2
)
+
1
],
dlsch
->
max_turbo_iterations
,
crc_type
,
(
r
==
0
)
?
harq_process
->
F
:
0
,
&
phy_vars_ue
->
dlsch_tc_init_stats
,
&
phy_vars_ue
->
dlsch_tc_alpha_stats
,
&
phy_vars_ue
->
dlsch_tc_beta_stats
,
&
phy_vars_ue
->
dlsch_tc_gamma_stats
,
&
phy_vars_ue
->
dlsch_tc_ext_stats
,
&
phy_vars_ue
->
dlsch_tc_intl1_stats
,
&
phy_vars_ue
->
dlsch_tc_intl2_stats
);
//(is_crnti==0)?harq_pid:harq_pid+1);
#if UE_TIMING_TRACE
stop_meas
(
dlsch_turbo_decoding_stats
);
#endif
// printf("single decode, exit\n");
// exit(-1);
}
else
{
// we can merge code segments
if
((
skipped_last
==
0
)
&&
(
r
<
harq_process
->
C
-
1
))
{
skipped_last
=
1
;
Kr_last
=
Kr
;
}
else
{
skipped_last
=
0
;
if
(
Kr_last
==
Kr
)
{
// decode 2 code segments with AVX2 version
#ifdef DEBUG_DLSCH_DECODING
printf
(
"single decoding segment %d (%p)
\n
"
,
r
-
1
,
&
harq_process
->
d
[
r
-
1
][
96
]);
#endif
#if UE_TIMING_TRACE
start_meas
(
dlsch_turbo_decoding_stats
);
#endif
#ifdef DEBUG_DLSCH_DECODING
printf
(
"double decoding segments %d,%d (%p,%p)
\n
"
,
r
-
1
,
r
,
&
harq_process
->
d
[
r
-
1
][
96
],
&
harq_process
->
d
[
r
][
96
]);
#endif
ret
=
tc_2cw
(
&
harq_process
->
d
[
r
-
1
][
96
],
&
harq_process
->
d
[
r
][
96
],
harq_process
->
c
[
r
-
1
],
harq_process
->
c
[
r
],
Kr
,
f1f2mat_old
[
iind
*
2
],
f1f2mat_old
[(
iind
*
2
)
+
1
],
dlsch
->
max_turbo_iterations
,
crc_type
,
(
r
==
0
)
?
harq_process
->
F
:
0
,
&
phy_vars_ue
->
dlsch_tc_init_stats
,
&
phy_vars_ue
->
dlsch_tc_alpha_stats
,
&
phy_vars_ue
->
dlsch_tc_beta_stats
,
&
phy_vars_ue
->
dlsch_tc_gamma_stats
,
&
phy_vars_ue
->
dlsch_tc_ext_stats
,
&
phy_vars_ue
->
dlsch_tc_intl1_stats
,
&
phy_vars_ue
->
dlsch_tc_intl2_stats
);
//(is_crnti==0)?harq_pid:harq_pid+1);
/*
ret = tc
(&harq_process->d[r-1][96],
harq_process->c[r-1],
Kr_last,
f1f2mat_old[iind*2],
f1f2mat_old[(iind*2)+1],
dlsch->max_turbo_iterations,
crc_type,
(r==0) ? harq_process->F : 0,
&phy_vars_ue->dlsch_tc_init_stats,
&phy_vars_ue->dlsch_tc_alpha_stats,
&phy_vars_ue->dlsch_tc_beta_stats,
&phy_vars_ue->dlsch_tc_gamma_stats,
&phy_vars_ue->dlsch_tc_ext_stats,
&phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
exit(-1);*/
#if UE_TIMING_TRACE
stop_meas
(
dlsch_turbo_decoding_stats
);
#endif
}
else
{
// Kr_last != Kr
#if UE_TIMING_TRACE
start_meas
(
dlsch_turbo_decoding_stats
);
#endif
ret
=
tc
(
&
harq_process
->
d
[
r
-
1
][
96
],
harq_process
->
c
[
r
-
1
],
Kr_last
,
f1f2mat_old
[
iind
*
2
],
f1f2mat_old
[(
iind
*
2
)
+
1
],
dlsch
->
max_turbo_iterations
,
crc_type
,
(
r
==
0
)
?
harq_process
->
F
:
0
,
&
phy_vars_ue
->
dlsch_tc_init_stats
,
&
phy_vars_ue
->
dlsch_tc_alpha_stats
,
&
phy_vars_ue
->
dlsch_tc_beta_stats
,
&
phy_vars_ue
->
dlsch_tc_gamma_stats
,
&
phy_vars_ue
->
dlsch_tc_ext_stats
,
&
phy_vars_ue
->
dlsch_tc_intl1_stats
,
&
phy_vars_ue
->
dlsch_tc_intl2_stats
);
//(is_crnti==0)?harq_pid:harq_pid+1);
#if UE_TIMING_TRACE
stop_meas
(
dlsch_turbo_decoding_stats
);
start_meas
(
dlsch_turbo_decoding_stats
);
#endif
ret
=
tc
(
&
harq_process
->
d
[
r
][
96
],
harq_process
->
c
[
r
],
Kr
,
f1f2mat_old
[
iind
*
2
],
f1f2mat_old
[(
iind
*
2
)
+
1
],
dlsch
->
max_turbo_iterations
,
crc_type
,
(
r
==
0
)
?
harq_process
->
F
:
0
,
&
phy_vars_ue
->
dlsch_tc_init_stats
,
&
phy_vars_ue
->
dlsch_tc_alpha_stats
,
&
phy_vars_ue
->
dlsch_tc_beta_stats
,
&
phy_vars_ue
->
dlsch_tc_gamma_stats
,
&
phy_vars_ue
->
dlsch_tc_ext_stats
,
&
phy_vars_ue
->
dlsch_tc_intl1_stats
,
&
phy_vars_ue
->
dlsch_tc_intl2_stats
);
//(is_crnti==0)?harq_pid:harq_pid+1);
#if UE_TIMING_TRACE
stop_meas
(
dlsch_turbo_decoding_stats
);
/*printf("Segmentation: C %d r %d, dlsch_rate_unmatching_stats %5.3f dlsch_deinterleaving_stats %5.3f dlsch_turbo_decoding_stats %5.3f \n",
harq_process->C,
r,
dlsch_rate_unmatching_stats->p_time/(cpuf*1000.0),
dlsch_deinterleaving_stats->p_time/(cpuf*1000.0),
dlsch_turbo_decoding_stats->p_time/(cpuf*1000.0));*/
#endif
}
}
}
#endif
if
((
err_flag
==
0
)
&&
(
ret
>=
(
1
+
dlsch
->
max_turbo_iterations
)))
{
// a Code segment is in error so break;
LOG_D
(
PHY
,
"AbsSubframe %d.%d CRC failed, segment %d/%d
\n
"
,
frame
%
1024
,
nr_tti_rx
,
r
,
harq_process
->
C
-
1
);
err_flag
=
1
;
}
}
int32_t
frame_rx_prev
=
frame
;
int32_t
tti_rx_prev
=
nr_tti_rx
-
1
;
if
(
tti_rx_prev
<
0
)
{
frame_rx_prev
--
;
tti_rx_prev
+=
10
*
frame_parms
->
ttis_per_subframe
;
}
frame_rx_prev
=
frame_rx_prev
%
1024
;
if
(
err_flag
==
1
)
{
#if UE_DEBUG_TRACE
LOG_I
(
PHY
,
"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d
\n
"
,
phy_vars_ue
->
Mod_id
,
frame
,
nr_tti_rx
,
harq_pid
,
harq_process
->
status
,
harq_process
->
round
,
harq_process
->
TBS
,
harq_process
->
mcs
,
Kr
,
r
,
harq_process
->
round
);
#endif
dlsch
->
harq_ack
[
nr_tti_rx
].
ack
=
0
;
dlsch
->
harq_ack
[
nr_tti_rx
].
harq_id
=
harq_pid
;
dlsch
->
harq_ack
[
nr_tti_rx
].
send_harq_status
=
1
;
harq_process
->
errors
[
harq_process
->
round
]
++
;
harq_process
->
round
++
;
// printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
if
(
harq_process
->
round
>=
dlsch
->
Mdlharq
)
{
harq_process
->
status
=
SCH_IDLE
;
harq_process
->
round
=
0
;
}
if
(
is_crnti
)
{
LOG_D
(
PHY
,
"[UE %d] DLSCH: Setting NACK for nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
nr_tti_rx
,
harq_pid
,
harq_process
->
status
,
harq_process
->
round
,
dlsch
->
Mdlharq
,
harq_process
->
TBS
);
}
return
((
1
+
dlsch
->
max_turbo_iterations
));
}
else
{
#if UE_DEBUG_TRACE
LOG_I
(
PHY
,
"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d TBS %d mcs %d nb_rb %d
\n
"
,
phy_vars_ue
->
Mod_id
,
nr_tti_rx
,
harq_process
->
TBS
,
harq_process
->
mcs
,
harq_process
->
nb_rb
);
#endif
harq_process
->
status
=
SCH_IDLE
;
harq_process
->
round
=
0
;
dlsch
->
harq_ack
[
nr_tti_rx
].
ack
=
1
;
dlsch
->
harq_ack
[
nr_tti_rx
].
harq_id
=
harq_pid
;
dlsch
->
harq_ack
[
nr_tti_rx
].
send_harq_status
=
1
;
//LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
// phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
if
(
is_crnti
)
{
LOG_D
(
PHY
,
"[UE %d] DLSCH: Setting ACK for nr_tti_rx %d (pid %d, round %d, TBS %d)
\n
"
,
phy_vars_ue
->
Mod_id
,
nr_tti_rx
,
harq_pid
,
harq_process
->
round
,
harq_process
->
TBS
);
}
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
}
// Reassembly of Transport block here
offset
=
0
;
/*
printf("harq_pid %d\n",harq_pid);
printf("F %d, Fbytes %d\n",harq_process->F,harq_process->F>>3);
printf("C %d\n",harq_process->C);
*/
for
(
r
=
0
;
r
<
harq_process
->
C
;
r
++
)
{
if
(
r
<
harq_process
->
Cminus
)
Kr
=
harq_process
->
Kminus
;
else
Kr
=
harq_process
->
Kplus
;
Kr_bytes
=
Kr
>>
3
;
// printf("Segment %d : Kr= %d bytes\n",r,Kr_bytes);
if
(
r
==
0
)
{
memcpy
(
harq_process
->
b
,
&
harq_process
->
c
[
0
][(
harq_process
->
F
>>
3
)],
Kr_bytes
-
(
harq_process
->
F
>>
3
)
-
((
harq_process
->
C
>
1
)
?
3
:
0
));
offset
=
Kr_bytes
-
(
harq_process
->
F
>>
3
)
-
((
harq_process
->
C
>
1
)
?
3
:
0
);
// printf("copied %d bytes to b sequence (harq_pid %d)\n",
// Kr_bytes - (harq_process->F>>3),harq_pid);
// printf("b[0] = %x,c[%d] = %x\n",
// harq_process->b[0],
// harq_process->F>>3,
// harq_process->c[0][(harq_process->F>>3)]);
}
else
{
memcpy
(
harq_process
->
b
+
offset
,
harq_process
->
c
[
r
],
Kr_bytes
-
((
harq_process
->
C
>
1
)
?
3
:
0
));
offset
+=
(
Kr_bytes
-
((
harq_process
->
C
>
1
)
?
3
:
0
));
}
}
dlsch
->
last_iteration_cnt
=
ret
;
//wait for worker to finish
//wait_on_busy_condition(&proc->mutex_td,&proc->cond_td,&proc->instance_cnt_dlsch td,"dlsch td thread");
//return( (ret>proc->tdp.ret) ? ret : proc->tdp.ret );
return
(
ret
);
}
#endif
#ifdef UE_DLSCH_PARALLELISATION
#define FIFO_PRIORITY 39
uint32_t
dlsch_decoding_2thread0
(
void
*
arg
)
{
static
__thread
int
UE_dlsch_td_retval
;
struct
rx_tx_thread_data
*
rtd
=
arg
;
UE_rxtx_proc_t
*
proc
=
rtd
->
proc
;
PHY_VARS_UE
*
phy_vars_ue
=
rtd
->
UE
;
proc
->
instance_cnt_dlsch_td
=-
1
;
proc
->
nr_tti_rx
=
proc
->
sub_frame_start
;
char
threadname
[
256
];
sprintf
(
threadname
,
"UE_thread_dlsch_td_%d"
,
proc
->
sub_frame_start
);
cpu_set_t
cpuset
;
CPU_ZERO
(
&
cpuset
);
if
(
(
proc
->
sub_frame_start
+
1
)
%
RX_NB_TH
==
0
&&
threads
.
dlsch_td_one
!=
-
1
)
CPU_SET
(
threads
.
dlsch_td_one
,
&
cpuset
);
if
(
(
proc
->
sub_frame_start
+
1
)
%
RX_NB_TH
==
1
&&
threads
.
dlsch_td_two
!=
-
1
)
CPU_SET
(
threads
.
dlsch_td_two
,
&
cpuset
);
if
(
(
proc
->
sub_frame_start
+
1
)
%
RX_NB_TH
==
2
&&
threads
.
dlsch_td_three
!=
-
1
)
CPU_SET
(
threads
.
dlsch_td_three
,
&
cpuset
);
//PHY_VARS_UE *phy_vars_ue = tdp->UE;
int
eNB_id
=
proc
->
eNB_id
;
int
harq_pid
=
proc
->
harq_pid
;
int
llr8_flag1
=
proc
->
llr8_flag
;
//UE_rxtx_proc_t *proc = tdp->proc;
int
frame
=
proc
->
frame_rx
;
int
subframe
=
proc
->
subframe_rx
;
LTE_UE_DLSCH_t
*
dlsch
=
phy_vars_ue
->
dlsch
[
phy_vars_ue
->
current_thread_id
[
subframe
]][
eNB_id
][
0
];
LTE_DL_UE_HARQ_t
*
harq_process
=
dlsch
->
harq_processes
[
harq_pid
];
short
*
dlsch_llr
=
phy_vars_ue
->
pdsch_vars
[
phy_vars_ue
->
current_thread_id
[
subframe
]][
eNB_id
]
->
llr
[
0
];
//printf("2thread0 llr flag %d tdp flag %d\n",llr8_flag1, tdp->llr8_flag);
#if UE_TIMING_TRACE
time_stats_t
*
dlsch_rate_unmatching_stats
=&
phy_vars_ue
->
dlsch_rate_unmatching_stats
;
time_stats_t
*
dlsch_turbo_decoding_stats
=&
phy_vars_ue
->
dlsch_turbo_decoding_stats
;
time_stats_t
*
dlsch_deinterleaving_stats
=&
phy_vars_ue
->
dlsch_deinterleaving_stats
;
#endif
uint32_t
A
,
E
;
uint32_t
G
;
uint32_t
ret
,
offset
;
uint16_t
iind
;
// uint8_t dummy_channel_output[(3*8*block_length)+12];
short
dummy_w
[
MAX_NUM_DLSCH_SEGMENTS
][
3
*
(
6144
+
64
)];
uint32_t
r
,
r_offset
=
0
,
Kr
,
Kr_bytes
,
err_flag
=
0
;
uint8_t
crc_type
;
#ifdef DEBUG_DLSCH_DECODING
uint16_t
i
;
#endif
//#ifdef __AVX2__
uint8_t
(
*
tc
)(
int16_t
*
y
,
uint8_t
*
,
uint16_t
,
uint16_t
,
uint16_t
,
uint8_t
,
uint8_t
,
uint8_t
,
time_stats_t
*
,
time_stats_t
*
,
time_stats_t
*
,
time_stats_t
*
,
time_stats_t
*
,
time_stats_t
*
,
time_stats_t
*
);
if
(
llr8_flag1
==
0
)
{
//#ifdef __AVX2__
#if 0
tc_2cw = phy_threegpplte_turbo_decoder16avx2;
#endif
tc
=
phy_threegpplte_turbo_decoder16
;
}
else
{
//AssertFatal (harq_process->TBS >= 256 , "Mismatch flag nbRB=%d TBS=%d mcs=%d Qm=%d RIV=%d round=%d \n",
// harq_process->nb_rb, harq_process->TBS,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
tc
=
phy_threegpplte_turbo_decoder8
;
}
init_thread
(
900000
,
1000000
,
FIFO_PRIORITY
-
1
,
&
cpuset
,
threadname
);
while
(
!
oai_exit
)
{
if
(
pthread_mutex_lock
(
&
proc
->
mutex_dlsch_td
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE] error locking mutex for UE dlsch td
\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_dlsch_td
,
&
proc
->
mutex_dlsch_td
);
}
if
(
pthread_mutex_unlock
(
&
proc
->
mutex_dlsch_td
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE] error unlocking mutex for UE dlsch_td
\n
"
);
exit_fun
(
"nothing to add"
);
}
// nb_rb = dlsch->nb_rb;
/*
if (nb_rb > frame_parms->N_RB_DL) {
printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb);
return(max_turbo_iterations);
}*/
/*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]];
if (harq_pid >= 8) {
printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
return(max_turbo_iterations);
}
*/
harq_process
->
trials
[
harq_process
->
round
]
++
;
A
=
harq_process
->
TBS
;
//2072 for QPSK 1/3
ret
=
dlsch
->
max_turbo_iterations
;
G
=
harq_process
->
G
;
//get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe);
// printf("DLSCH Decoding, harq_pid %d Ndi %d\n",harq_pid,harq_process->Ndi);
if
(
harq_process
->
round
==
0
)
{
// This is a new packet, so compute quantities regarding segmentation
harq_process
->
B
=
A
+
24
;
lte_segmentation
(
NULL
,
NULL
,
harq_process
->
B
,
&
harq_process
->
C
,
&
harq_process
->
Cplus
,
&
harq_process
->
Cminus
,
&
harq_process
->
Kplus
,
&
harq_process
->
Kminus
,
&
harq_process
->
F
);
// CLEAR LLR's HERE for first packet in process
}
/*
else {
printf("dlsch_decoding.c: Ndi>0 not checked yet!!\n");
return(max_turbo_iterations);
}
*/
err_flag
=
0
;
r_offset
=
0
;
/*
unsigned char bw_scaling =1;
switch (frame_parms->N_RB_DL) {
case 6:
bw_scaling =16;
break;
case 25:
bw_scaling =4;
break;
case 50:
bw_scaling =2;
break;
default:
bw_scaling =1;
break;
}
if (harq_process->C > MAX_NUM_DLSCH_SEGMENTS/bw_scaling) {
LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,MAX_NUM_DLSCH_SEGMENTS/bw_scaling);
return((1+dlsch->max_turbo_iterations));
}*/
#ifdef DEBUG_DLSCH_DECODING
printf
(
"Segmentation: C %d, Cminus %d, Kminus %d, Kplus %d
\n
"
,
harq_process
->
C
,
harq_process
->
Cminus
,
harq_process
->
Kminus
,
harq_process
->
Kplus
);
#endif
opp_enabled
=
1
;
for
(
r
=
(
harq_process
->
C
)
/
2
;
r
<
harq_process
->
C
;
r
++
)
{
// Get Turbo interleaver parameters
if
(
r
<
harq_process
->
Cminus
)
Kr
=
harq_process
->
Kminus
;
else
Kr
=
harq_process
->
Kplus
;
Kr_bytes
=
Kr
>>
3
;
if
(
Kr_bytes
<=
64
)
iind
=
(
Kr_bytes
-
5
);
else
if
(
Kr_bytes
<=
128
)
iind
=
59
+
((
Kr_bytes
-
64
)
>>
1
);
else
if
(
Kr_bytes
<=
256
)
iind
=
91
+
((
Kr_bytes
-
128
)
>>
2
);
else
if
(
Kr_bytes
<=
768
)
iind
=
123
+
((
Kr_bytes
-
256
)
>>
3
);
else
{
printf
(
"dlsch_decoding: Illegal codeword size %d!!!
\n
"
,
Kr_bytes
);
return
(
dlsch
->
max_turbo_iterations
);
}
#ifdef DEBUG_DLSCH_DECODING
printf
(
"f1 %d, f2 %d, F %d
\n
"
,
f1f2mat_old
[
2
*
iind
],
f1f2mat_old
[
1
+
(
2
*
iind
)],(
r
==
0
)
?
harq_process
->
F
:
0
);
#endif
#if UE_TIMING_TRACE
start_meas
(
dlsch_rate_unmatching_stats
);
#endif
memset
(
&
dummy_w
[
r
][
0
],
0
,
3
*
(
6144
+
64
)
*
sizeof
(
short
));
harq_process
->
RTC
[
r
]
=
generate_dummy_w
(
4
+
(
Kr_bytes
*
8
),
(
uint8_t
*
)
&
dummy_w
[
r
][
0
],
(
r
==
0
)
?
harq_process
->
F
:
0
);
#ifdef DEBUG_DLSCH_DECODING
LOG_D
(
PHY
,
"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...
\n
"
,
harq_pid
,
r
,
G
,
Kr
*
3
,
harq_process
->
TBS
,
harq_process
->
Qm
,
harq_process
->
nb_rb
,
harq_process
->
Nl
,
harq_process
->
rvidx
,
harq_process
->
round
);
#endif
#ifdef DEBUG_DLSCH_DECODING
printf
(
" in decoding dlsch->harq_processes[harq_pid]->rvidx = %d
\n
"
,
dlsch
->
harq_processes
[
harq_pid
]
->
rvidx
);
#endif
if
(
lte_rate_matching_turbo_rx
(
harq_process
->
RTC
[
r
],
G
,
harq_process
->
w
[
r
],
(
uint8_t
*
)
&
dummy_w
[
r
][
0
],
dlsch_llr
+
r_offset
,
harq_process
->
C
,
dlsch
->
Nsoft
,
dlsch
->
Mdlharq
,
dlsch
->
Kmimo
,
harq_process
->
rvidx
,
(
harq_process
->
round
==
0
)
?
1
:
0
,
harq_process
->
Qm
,
harq_process
->
Nl
,
r
,
&
E
)
==-
1
)
{
#if UE_TIMING_TRACE
stop_meas
(
dlsch_rate_unmatching_stats
);
#endif
LOG_E
(
PHY
,
"dlsch_decoding.c: Problem in rate_matching
\n
"
);
return
(
dlsch
->
max_turbo_iterations
);
}
else
{
#if UE_TIMING_TRACE
stop_meas
(
dlsch_rate_unmatching_stats
);
#endif
}
r_offset
+=
E
;
/*
printf("Subblock deinterleaving, d %p w %p\n",
harq_process->d[r],
harq_process->w);
*/
#if UE_TIMING_TRACE
start_meas
(
dlsch_deinterleaving_stats
);
#endif
sub_block_deinterleaving_turbo
(
4
+
Kr
,
&
harq_process
->
d
[
r
][
96
],
harq_process
->
w
[
r
]);
#if UE_TIMING_TRACE
stop_meas
(
dlsch_deinterleaving_stats
);
#endif
#ifdef DEBUG_DLSCH_DECODING
/*
if (r==0) {
write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0);
write_output("decoder_in.m","dec",&harq_process->d[0][96],(3*8*Kr_bytes)+12,1,0);
}
printf("decoder input(segment %d) :",r);
int i; for (i=0;i<(3*8*Kr_bytes)+12;i++)
printf("%d : %d\n",i,harq_process->d[r][96+i]);
printf("\n");*/
#endif
// printf("Clearing c, %p\n",harq_process->c[r]);
memset
(
harq_process
->
c
[
r
],
0
,
Kr_bytes
);
// printf("done\n");
if
(
harq_process
->
C
==
1
)
crc_type
=
CRC24_A
;
else
crc_type
=
CRC24_B
;
/*
printf("decoder input(segment %d)\n",r);
for (i=0;i<(3*8*Kr_bytes)+12;i++)
if ((harq_process->d[r][96+i]>7) ||
(harq_process->d[r][96+i] < -8))
printf("%d : %d\n",i,harq_process->d[r][96+i]);
printf("\n");
*/
//#ifndef __AVX2__
#if 1
if
(
err_flag
==
0
)
{
/*
LOG_I(PHY, "turbo algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_turbo_iterations);
*/
if
(
llr8_flag1
)
{
AssertFatal
(
Kr
>=
256
,
"turbo algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d
\n
"
,
Kr
,
r
,
harq_process
->
C
,
harq_process
->
nb_rb
,
A
,
harq_process
->
TBS
,
harq_process
->
B
,
harq_process
->
mcs
,
harq_process
->
Qm
,
harq_process
->
rvidx
,
harq_process
->
round
);
}
#if UE_TIMING_TRACE
start_meas
(
dlsch_turbo_decoding_stats
);
#endif
// LOG_D(PHY,"AbsSubframe %d.%d Start turbo segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
ret
=
tc
(
&
harq_process
->
d
[
r
][
96
],
harq_process
->
c
[
r
],
Kr
,
f1f2mat_old
[
iind
*
2
],
f1f2mat_old
[(
iind
*
2
)
+
1
],
dlsch
->
max_turbo_iterations
,
crc_type
,
(
r
==
0
)
?
harq_process
->
F
:
0
,
&
phy_vars_ue
->
dlsch_tc_init_stats
,
&
phy_vars_ue
->
dlsch_tc_alpha_stats
,
&
phy_vars_ue
->
dlsch_tc_beta_stats
,
&
phy_vars_ue
->
dlsch_tc_gamma_stats
,
&
phy_vars_ue
->
dlsch_tc_ext_stats
,
&
phy_vars_ue
->
dlsch_tc_intl1_stats
,
&
phy_vars_ue
->
dlsch_tc_intl2_stats
);
//(is_crnti==0)?harq_pid:harq_pid+1);
#if UE_TIMING_TRACE
stop_meas
(
dlsch_turbo_decoding_stats
);
#endif
}
#else
if
((
harq_process
->
C
==
1
)
||
((
r
==
harq_process
->
C
-
1
)
&&
(
skipped_last
==
0
)))
{
// last segment with odd number of segments
#if UE_TIMING_TRACE
start_meas
(
dlsch_turbo_decoding_stats
);
#endif
ret
=
tc
(
&
harq_process
->
d
[
r
][
96
],
harq_process
->
c
[
r
],
Kr
,
f1f2mat_old
[
iind
*
2
],
f1f2mat_old
[(
iind
*
2
)
+
1
],
dlsch
->
max_turbo_iterations
,
crc_type
,
(
r
==
0
)
?
harq_process
->
F
:
0
,
&
phy_vars_ue
->
dlsch_tc_init_stats
,
&
phy_vars_ue
->
dlsch_tc_alpha_stats
,
&
phy_vars_ue
->
dlsch_tc_beta_stats
,
&
phy_vars_ue
->
dlsch_tc_gamma_stats
,
&
phy_vars_ue
->
dlsch_tc_ext_stats
,
&
phy_vars_ue
->
dlsch_tc_intl1_stats
,
&
phy_vars_ue
->
dlsch_tc_intl2_stats
);
//(is_crnti==0)?harq_pid:harq_pid+1);
#if UE_TIMING_TRACE
stop_meas
(
dlsch_turbo_decoding_stats
);
#endif
// printf("single decode, exit\n");
// exit(-1);
}
else
{
// we can merge code segments
if
((
skipped_last
==
0
)
&&
(
r
<
harq_process
->
C
-
1
))
{
skipped_last
=
1
;
Kr_last
=
Kr
;
}
else
{
skipped_last
=
0
;
if
(
Kr_last
==
Kr
)
{
// decode 2 code segments with AVX2 version
#ifdef DEBUG_DLSCH_DECODING
printf
(
"single decoding segment %d (%p)
\n
"
,
r
-
1
,
&
harq_process
->
d
[
r
-
1
][
96
]);
#endif
#if UE_TIMING_TRACE
start_meas
(
dlsch_turbo_decoding_stats
);
#endif
#ifdef DEBUG_DLSCH_DECODING
printf
(
"double decoding segments %d,%d (%p,%p)
\n
"
,
r
-
1
,
r
,
&
harq_process
->
d
[
r
-
1
][
96
],
&
harq_process
->
d
[
r
][
96
]);
#endif
ret
=
tc_2cw
(
&
harq_process
->
d
[
r
-
1
][
96
],
&
harq_process
->
d
[
r
][
96
],
harq_process
->
c
[
r
-
1
],
harq_process
->
c
[
r
],
Kr
,
f1f2mat_old
[
iind
*
2
],
f1f2mat_old
[(
iind
*
2
)
+
1
],
dlsch
->
max_turbo_iterations
,
crc_type
,
(
r
==
0
)
?
harq_process
->
F
:
0
,
&
phy_vars_ue
->
dlsch_tc_init_stats
,
&
phy_vars_ue
->
dlsch_tc_alpha_stats
,
&
phy_vars_ue
->
dlsch_tc_beta_stats
,
&
phy_vars_ue
->
dlsch_tc_gamma_stats
,
&
phy_vars_ue
->
dlsch_tc_ext_stats
,
&
phy_vars_ue
->
dlsch_tc_intl1_stats
,
&
phy_vars_ue
->
dlsch_tc_intl2_stats
);
//(is_crnti==0)?harq_pid:harq_pid+1);
/*
ret = tc
(&harq_process->d[r-1][96],
harq_process->c[r-1],
Kr_last,
f1f2mat_old[iind*2],
f1f2mat_old[(iind*2)+1],
dlsch->max_turbo_iterations,
crc_type,
(r==0) ? harq_process->F : 0,
&phy_vars_ue->dlsch_tc_init_stats,
&phy_vars_ue->dlsch_tc_alpha_stats,
&phy_vars_ue->dlsch_tc_beta_stats,
&phy_vars_ue->dlsch_tc_gamma_stats,
&phy_vars_ue->dlsch_tc_ext_stats,
&phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
exit(-1);*/
#if UE_TIMING_TRACE
stop_meas
(
dlsch_turbo_decoding_stats
);
#endif
}
else
{
// Kr_last != Kr
#if UE_TIMING_TRACE
start_meas
(
dlsch_turbo_decoding_stats
);
#endif
ret
=
tc
(
&
harq_process
->
d
[
r
-
1
][
96
],
harq_process
->
c
[
r
-
1
],
Kr_last
,
f1f2mat_old
[
iind
*
2
],
f1f2mat_old
[(
iind
*
2
)
+
1
],
dlsch
->
max_turbo_iterations
,
crc_type
,
(
r
==
0
)
?
harq_process
->
F
:
0
,
&
phy_vars_ue
->
dlsch_tc_init_stats
,
&
phy_vars_ue
->
dlsch_tc_alpha_stats
,
&
phy_vars_ue
->
dlsch_tc_beta_stats
,
&
phy_vars_ue
->
dlsch_tc_gamma_stats
,
&
phy_vars_ue
->
dlsch_tc_ext_stats
,
&
phy_vars_ue
->
dlsch_tc_intl1_stats
,
&
phy_vars_ue
->
dlsch_tc_intl2_stats
);
//(is_crnti==0)?harq_pid:harq_pid+1);
#if UE_TIMING_TRACE
stop_meas
(
dlsch_turbo_decoding_stats
);
start_meas
(
dlsch_turbo_decoding_stats
);
#endif
ret
=
tc
(
&
harq_process
->
d
[
r
][
96
],
harq_process
->
c
[
r
],
Kr
,
f1f2mat_old
[
iind
*
2
],
f1f2mat_old
[(
iind
*
2
)
+
1
],
dlsch
->
max_turbo_iterations
,
crc_type
,
(
r
==
0
)
?
harq_process
->
F
:
0
,
&
phy_vars_ue
->
dlsch_tc_init_stats
,
&
phy_vars_ue
->
dlsch_tc_alpha_stats
,
&
phy_vars_ue
->
dlsch_tc_beta_stats
,
&
phy_vars_ue
->
dlsch_tc_gamma_stats
,
&
phy_vars_ue
->
dlsch_tc_ext_stats
,
&
phy_vars_ue
->
dlsch_tc_intl1_stats
,
&
phy_vars_ue
->
dlsch_tc_intl2_stats
);
//(is_crnti==0)?harq_pid:harq_pid+1);
#if UE_TIMING_TRACE
stop_meas
(
dlsch_turbo_decoding_stats
);
/*printf("Segmentation: C %d r %d, dlsch_rate_unmatching_stats %5.3f dlsch_deinterleaving_stats %5.3f dlsch_turbo_decoding_stats %5.3f \n",
harq_process->C,
r,
dlsch_rate_unmatching_stats->p_time/(cpuf*1000.0),
dlsch_deinterleaving_stats->p_time/(cpuf*1000.0),
dlsch_turbo_decoding_stats->p_time/(cpuf*1000.0));*/
#endif
}
}
}
#endif
if
((
err_flag
==
0
)
&&
(
ret
>=
(
1
+
dlsch
->
max_turbo_iterations
)))
{
// a Code segment is in error so break;
// LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
err_flag
=
1
;
}
}
/*int32_t frame_rx_prev = frame;
int32_t subframe_rx_prev = subframe - 1;
if (subframe_rx_prev < 0) {
frame_rx_prev--;
subframe_rx_prev += 10;
}
frame_rx_prev = frame_rx_prev%1024;*/
if
(
err_flag
==
1
)
{
#if UE_DEBUG_TRACE
LOG_I
(
PHY
,
"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d
\n
"
,
phy_vars_ue
->
Mod_id
,
frame
,
subframe
,
harq_pid
,
harq_process
->
status
,
harq_process
->
round
,
harq_process
->
TBS
,
harq_process
->
mcs
,
Kr
,
r
,
harq_process
->
round
);
#endif
dlsch
->
harq_ack
[
subframe
].
ack
=
0
;
dlsch
->
harq_ack
[
subframe
].
harq_id
=
harq_pid
;
dlsch
->
harq_ack
[
subframe
].
send_harq_status
=
1
;
harq_process
->
errors
[
harq_process
->
round
]
++
;
harq_process
->
round
++
;
// printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
if
(
harq_process
->
round
>=
dlsch
->
Mdlharq
)
{
harq_process
->
status
=
SCH_IDLE
;
harq_process
->
round
=
0
;
}
/* if(is_crnti)
{
LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
}*/
return
((
1
+
dlsch
->
max_turbo_iterations
));
}
else
{
#if UE_DEBUG_TRACE
LOG_I
(
PHY
,
"[UE %d] DLSCH: Setting ACK for subframe %d TBS %d mcs %d nb_rb %d
\n
"
,
phy_vars_ue
->
Mod_id
,
subframe
,
harq_process
->
TBS
,
harq_process
->
mcs
,
harq_process
->
nb_rb
);
#endif
harq_process
->
status
=
SCH_IDLE
;
harq_process
->
round
=
0
;
dlsch
->
harq_ack
[
subframe
].
ack
=
1
;
dlsch
->
harq_ack
[
subframe
].
harq_id
=
harq_pid
;
dlsch
->
harq_ack
[
subframe
].
send_harq_status
=
1
;
//LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
// phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
/* if(is_crnti)
{
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round,harq_process->TBS);
}
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
}*/
// Reassembly of Transport block here
offset
=
0
;
/*
printf("harq_pid %d\n",harq_pid);
printf("F %d, Fbytes %d\n",harq_process->F,harq_process->F>>3);
printf("C %d\n",harq_process->C);
*/
for
(
r
=
0
;
r
<
harq_process
->
C
;
r
++
)
{
if
(
r
<
harq_process
->
Cminus
)
Kr
=
harq_process
->
Kminus
;
else
Kr
=
harq_process
->
Kplus
;
Kr_bytes
=
Kr
>>
3
;
// printf("Segment %d : Kr= %d bytes\n",r,Kr_bytes);
if
(
r
==
0
)
{
memcpy
(
harq_process
->
b
,
&
harq_process
->
c
[
0
][(
harq_process
->
F
>>
3
)],
Kr_bytes
-
(
harq_process
->
F
>>
3
)
-
((
harq_process
->
C
>
1
)
?
3
:
0
));
offset
=
Kr_bytes
-
(
harq_process
->
F
>>
3
)
-
((
harq_process
->
C
>
1
)
?
3
:
0
);
// printf("copied %d bytes to b sequence (harq_pid %d)\n",
// Kr_bytes - (harq_process->F>>3),harq_pid);
// printf("b[0] = %x,c[%d] = %x\n",
// harq_process->b[0],
// harq_process->F>>3,
// harq_process->c[0][(harq_process->F>>3)]);
}
else
{
memcpy
(
harq_process
->
b
+
offset
,
harq_process
->
c
[
r
],
Kr_bytes
-
((
harq_process
->
C
>
1
)
?
3
:
0
));
offset
+=
(
Kr_bytes
-
((
harq_process
->
C
>
1
)
?
3
:
0
));
}
}
dlsch
->
last_iteration_cnt
=
ret
;
return
(
ret
);
}
if
(
pthread_mutex_lock
(
&
proc
->
mutex_dlsch_td
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE] error locking mutex for UE RXTX
\n
"
);
exit_fun
(
"noting to add"
);
}
proc
->
instance_cnt_dlsch_td
--
;
if
(
pthread_mutex_unlock
(
&
proc
->
mutex_dlsch_td
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][UE] error unlocking mutex for UE td1
\n
"
);
exit_fun
(
"noting to add"
);
}
}
// thread finished
free
(
arg
);
return
&
UE_dlsch_td_retval
;
}
#endif
/*extern int oai_exit;
void *dlsch_td_thread(void *param) {
pthread_setname_np( pthread_self(), "dlsch td processing");
PHY_VARS_UE *UE = ((dlsch_td_params*)param)->UE;
UE_proc_t *proc = &UE->proc;
while (!oai_exit) {
if (wait_on_condition(&proc->mutex_td,&proc->cond_td,&proc->instance_cnt_td,"dlsch td thread")<0) break;
((dlsch_td_params*)param)->ret = dlsch_decoding_2thread0((dlsch_td_params*)param);
if (release_thread(&proc->mutex_td,&proc->instance_cnt_td,"dlsch td thread")<0) break;
if (pthread_cond_signal(&proc->cond_td) != 0) {
printf("[UE] ERROR pthread_cond_signal for dlsch td thread exit\n");
exit_fun( "ERROR pthread_cond_signal" );
return(NULL);
}
}
return(NULL);
}*/
#ifdef PHY_ABSTRACTION
#include "SIMULATION/TOOLS/defs.h"
#ifdef OPENAIR2
...
...
openair1/PHY/LTE_TRANSPORT/proto.h
View file @
de4712e7
...
...
@@ -166,6 +166,8 @@ int32_t dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
time_stats_t
*
te_stats
,
time_stats_t
*
i_stats
);
uint32_t
dlsch_decoding_2thread0
(
void
*
arg
);
void
dlsch_encoding_emul
(
PHY_VARS_eNB
*
phy_vars_eNB
,
uint8_t
*
DLSCH_pdu
,
LTE_eNB_DLSCH_t
*
dlsch
);
...
...
@@ -1324,6 +1326,19 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
uint8_t
harq_pid
,
uint8_t
is_crnti
,
uint8_t
llr8_flag
);
/*
uint32_t dlsch_decoding_mthread(PHY_VARS_UE *phy_vars_ue,
UE_rxtx_proc_t *proc,
int eNB_id,
int16_t *dlsch_llr,
LTE_DL_FRAME_PARMS *lte_frame_parms,
LTE_UE_DLSCH_t *dlsch,
LTE_DL_UE_HARQ_t *harq_process,
uint32_t frame,
uint8_t subframe,
uint8_t harq_pid,
uint8_t is_crnti,
uint8_t llr8_flag);*/
uint32_t
dlsch_decoding_emul
(
PHY_VARS_UE
*
phy_vars_ue
,
uint8_t
subframe
,
...
...
openair1/PHY/defs.h
View file @
de4712e7
...
...
@@ -424,6 +424,20 @@ typedef struct {
/// mutex for UE synch thread
//pthread_mutex_t mutex_slot0_dl_processing;
pthread_mutex_t
mutex_slot1_dl_processing
;
//int instance_cnt_slot0_dl_processing;
int
instance_cnt_dlsch_td
;
/// pthread descriptor fep_slot1 thread
//pthread_t pthread_slot0_dl_processing;
pthread_t
pthread_dlsch_td
;
/// pthread attributes for fep_slot1 processing thread
// pthread_attr_t attr_slot0_dl_processing;
pthread_attr_t
attr_dlsch_td
;
/// condition variable for UE fep_slot1 thread;
//pthread_cond_t cond_slot0_dl_processing;
pthread_cond_t
cond_dlsch_td
;
/// mutex for UE synch thread
//pthread_mutex_t mutex_slot0_dl_processing;
pthread_mutex_t
mutex_dlsch_td
;
//
uint8_t
chan_est_pilot0_slot1_available
;
uint8_t
chan_est_slot1_available
;
...
...
@@ -431,6 +445,9 @@ typedef struct {
uint8_t
dci_slot0_available
;
uint8_t
first_symbol_available
;
//uint8_t channel_level;
int
eNB_id
;
int
harq_pid
;
int
llr8_flag
;
/// scheduling parameters for fep_slot1 thread
struct
sched_param
sched_param_fep_slot1
;
...
...
openair1/SCHED/defs.h
View file @
de4712e7
...
...
@@ -44,6 +44,7 @@ enum THREAD_INDEX { OPENAIR_THREAD_INDEX = 0,
#define OPENAIR_THREAD_STACK_SIZE PTHREAD_STACK_MIN //4096 //RTL_PTHREAD_STACK_MIN*6
//#define DLC_THREAD_STACK_SIZE 4096 //DLC stack size
//#define UE_SLOT_PARALLELISATION
//#define UE_DLSCH_PARALLELISATION
enum
openair_SCHED_STATUS
{
openair_SCHED_STOPPED
=
1
,
...
...
openair1/SCHED/phy_procedures_lte_ue.c
View file @
de4712e7
...
...
@@ -3553,6 +3553,17 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs
ue
->
dlsch_MCH
[
0
]
->
harq_processes
[
0
]
->
G
,
ue
->
pdsch_vars_MCH
[
0
]
->
llr
[
0
],
0
,
nr_tti_rx
<<
1
);
#ifdef UE_DLSCH_PARALLELISATION
ret
=
dlsch_decoding_mthread
(
ue
,
proc
,
eNB_id
,
ue
->
pdsch_vars_MCH
[
0
]
->
llr
[
0
],
&
ue
->
frame_parms
,
ue
->
dlsch_MCH
[
0
],
ue
->
dlsch_MCH
[
0
]
->
harq_processes
[
0
],
frame_rx
,
nr_tti_rx
,
0
,
0
,
1
);
#else
ret
=
dlsch_decoding
(
ue
,
ue
->
pdsch_vars_MCH
[
0
]
->
llr
[
0
],
&
ue
->
frame_parms
,
...
...
@@ -3562,6 +3573,8 @@ void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abs
nr_tti_rx
,
0
,
0
,
1
);
printf
(
"start pmch dlsch decoding
\n
"
);
#endif
}
else
{
// abstraction
#ifdef PHY_ABSTRACTION
ret
=
dlsch_decoding_emul
(
ue
,
...
...
@@ -3973,6 +3986,19 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
dlsch_decoding_stats
[
ue
->
current_thread_id
[
nr_tti_rx
]]);
#endif
#ifdef UE_DLSCH_PARALLELISATION
ret
=
dlsch_decoding_mthread
(
ue
,
proc
,
eNB_id
,
pdsch_vars
->
llr
[
0
],
&
ue
->
frame_parms
,
dlsch0
,
dlsch0
->
harq_processes
[
harq_pid
],
frame_rx
,
nr_tti_rx
,
harq_pid
,
pdsch
==
PDSCH
?
1
:
0
,
dlsch0
->
harq_processes
[
harq_pid
]
->
TBS
>
256
?
1
:
0
);
#else
ret
=
dlsch_decoding
(
ue
,
pdsch_vars
->
llr
[
0
],
&
ue
->
frame_parms
,
...
...
@@ -3983,6 +4009,8 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
harq_pid
,
pdsch
==
PDSCH
?
1
:
0
,
dlsch0
->
harq_processes
[
harq_pid
]
->
TBS
>
256
?
1
:
0
);
printf
(
"start cW0 dlsch decoding
\n
"
);
#endif
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_decoding_stats
[
ue
->
current_thread_id
[
nr_tti_rx
]]);
...
...
@@ -4039,6 +4067,19 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
start_meas
(
&
ue
->
dlsch_decoding_stats
[
ue
->
current_thread_id
[
nr_tti_rx
]]);
#endif
#ifdef UE_DLSCH_PARALLELISATION
ret1
=
dlsch_decoding_mthread
(
ue
,
proc
,
eNB_id
,
pdsch_vars
->
llr
[
1
],
&
ue
->
frame_parms
,
dlsch1
,
dlsch1
->
harq_processes
[
harq_pid
],
frame_rx
,
nr_tti_rx
,
harq_pid
,
pdsch
==
PDSCH
?
1
:
0
,
dlsch1
->
harq_processes
[
harq_pid
]
->
TBS
>
256
?
1
:
0
);
#else
ret1
=
dlsch_decoding
(
ue
,
pdsch_vars
->
llr
[
1
],
&
ue
->
frame_parms
,
...
...
@@ -4049,6 +4090,8 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
harq_pid
,
pdsch
==
PDSCH
?
1
:
0
,
dlsch1
->
harq_processes
[
harq_pid
]
->
TBS
>
256
?
1
:
0
);
printf
(
"start cw1 dlsch decoding
\n
"
);
#endif
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_decoding_stats
[
ue
->
current_thread_id
[
nr_tti_rx
]]);
...
...
targets/COMMON/threads_t.h
View file @
de4712e7
...
...
@@ -9,6 +9,9 @@ typedef struct threads_s {
int
slot1_proc_one
;
int
slot1_proc_two
;
int
slot1_proc_three
;
int
dlsch_td_one
;
int
dlsch_td_two
;
int
dlsch_td_three
;
}
threads_t
;
#endif
/* _THREADS_T_H_ */
targets/RT/USER/lte-softmodem.c
View file @
de4712e7
...
...
@@ -649,6 +649,9 @@ static void get_options (int argc, char **argv) {
LONG_OPTION_THREADSLOT1PROCONE
,
LONG_OPTION_THREADSLOT1PROCTWO
,
LONG_OPTION_THREADSLOT1PROCTHREE
,
LONG_OPTION_THREADDLSCHTDONE
,
LONG_OPTION_THREADDLSCHTDTWO
,
LONG_OPTION_THREADDLSCHTDTHREE
,
LONG_OPTION_DCIFORMAT
,
LONG_OPTION_AGREGATIONLEVEL
,
LONG_OPTION_DEMOD_SHIFT
,
...
...
@@ -691,6 +694,9 @@ static void get_options (int argc, char **argv) {
{
"threadSlot1ProcOne"
,
required_argument
,
NULL
,
LONG_OPTION_THREADSLOT1PROCONE
},
{
"threadSlot1ProcTwo"
,
required_argument
,
NULL
,
LONG_OPTION_THREADSLOT1PROCTWO
},
{
"threadSlot1ProcThree"
,
required_argument
,
NULL
,
LONG_OPTION_THREADSLOT1PROCTHREE
},
{
"threadDlschTdOne"
,
required_argument
,
NULL
,
LONG_OPTION_THREADDLSCHTDONE
},
{
"threadDlschTdTwo"
,
required_argument
,
NULL
,
LONG_OPTION_THREADDLSCHTDTWO
},
{
"threadDlschTdThree"
,
required_argument
,
NULL
,
LONG_OPTION_THREADDLSCHTDTHREE
},
{
"DCIformat"
,
required_argument
,
NULL
,
LONG_OPTION_DCIFORMAT
},
{
"AgregationLevel"
,
required_argument
,
NULL
,
LONG_OPTION_AGREGATIONLEVEL
},
{
"dlsch-demod-shift"
,
required_argument
,
NULL
,
LONG_OPTION_DEMOD_SHIFT
},
...
...
@@ -836,6 +842,15 @@ static void get_options (int argc, char **argv) {
case
LONG_OPTION_THREADSLOT1PROCTHREE
:
threads
.
slot1_proc_three
=
atoi
(
optarg
);
break
;
case
LONG_OPTION_THREADDLSCHTDONE
:
threads
.
dlsch_td_one
=
atoi
(
optarg
);
break
;
case
LONG_OPTION_THREADDLSCHTDTWO
:
threads
.
dlsch_td_two
=
atoi
(
optarg
);
break
;
case
LONG_OPTION_THREADDLSCHTDTHREE
:
threads
.
dlsch_td_three
=
atoi
(
optarg
);
break
;
case
LONG_OPTION_DCIFORMAT
:
dci_Format
=
atoi
(
optarg
);
break
;
...
...
targets/RT/USER/lte-ue.c
View file @
de4712e7
...
...
@@ -46,6 +46,7 @@
#include "SCHED/extern.h"
#include "LAYER2/MAC/extern.h"
#include "LAYER2/MAC/proto.h"
#include "PHY/LTE_TRANSPORT/proto.h"
#include "UTIL/LOG/log_extern.h"
#include "UTIL/OTG/otg_tx.h"
...
...
@@ -930,6 +931,12 @@ void init_UE_threads(PHY_VARS_UE *UE) {
printf
(
"Init_UE_threads rtd %d proc %d nb_threads %d i %d
\n
"
,
rtd
->
proc
->
sub_frame_start
,
UE
->
proc
.
proc_rxtx
[
i
].
sub_frame_start
,
nb_threads
,
i
);
pthread_create
(
&
UE
->
proc
.
proc_rxtx
[
i
].
pthread_rxtx
,
NULL
,
UE_thread_rxn_txnp4
,
rtd
);
#ifdef UE_DLSCH_PARALLELISATION
pthread_mutex_init
(
&
UE
->
proc
.
proc_rxtx
[
i
].
mutex_dlsch_td
,
NULL
);
pthread_cond_init
(
&
UE
->
proc
.
proc_rxtx
[
i
].
cond_dlsch_td
,
NULL
);
pthread_create
(
&
UE
->
proc
.
proc_rxtx
[
i
].
pthread_dlsch_td
,
NULL
,
dlsch_decoding_2thread0
,
rtd
);
#endif
#ifdef UE_SLOT_PARALLELISATION
//pthread_mutex_init(&UE->proc.proc_rxtx[i].mutex_slot0_dl_processing,NULL);
//pthread_cond_init(&UE->proc.proc_rxtx[i].cond_slot0_dl_processing,NULL);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment