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
lizhongxiao
OpenXG-RAN
Commits
ab3b6c88
Commit
ab3b6c88
authored
Jan 06, 2020
by
Francesco Mani
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'nr_segmentation_fixes' into NR_RRCConfiguration
parents
d27a8f07
ebcbad62
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
240 additions
and
150 deletions
+240
-150
openair1/PHY/INIT/nr_parms.c
openair1/PHY/INIT/nr_parms.c
+8
-4
openair1/PHY/NR_TRANSPORT/nr_dlsch.h
openair1/PHY/NR_TRANSPORT/nr_dlsch.h
+1
-1
openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+62
-16
openair1/PHY/NR_TRANSPORT/nr_ulsch.h
openair1/PHY/NR_TRANSPORT/nr_ulsch.h
+1
-1
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+47
-32
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+58
-62
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+3
-2
openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
+3
-3
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
+48
-20
openair1/PHY/defs_gNB.h
openair1/PHY/defs_gNB.h
+3
-3
openair1/PHY/defs_nr_common.h
openair1/PHY/defs_nr_common.h
+2
-2
openair1/SIMULATION/NR_PHY/dlschsim.c
openair1/SIMULATION/NR_PHY/dlschsim.c
+2
-2
openair1/SIMULATION/NR_PHY/ulschsim.c
openair1/SIMULATION/NR_PHY/ulschsim.c
+1
-0
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+1
-2
No files found.
openair1/PHY/INIT/nr_parms.c
View file @
ab3b6c88
...
...
@@ -84,7 +84,8 @@ int nr_init_frame_parms0(NR_DL_FRAME_PARMS *fp,
nfapi_nr_config_request_scf_t
*
cfg
,
int
mu0
,
int
Ncp
,
int
N_RB_DL
)
int
N_RB_DL
,
int
N_RB_UL
)
{
...
...
@@ -103,6 +104,7 @@ int nr_init_frame_parms0(NR_DL_FRAME_PARMS *fp,
fp
->
numerology_index
=
mu
;
fp
->
Ncp
=
Ncp
;
fp
->
N_RB_DL
=
N_RB_DL
;
fp
->
N_RB_UL
=
N_RB_UL
;
switch
(
mu
)
{
...
...
@@ -267,11 +269,13 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* config,
fp
->
frame_type
=
config
->
cell_config
.
frame_duplex_type
.
value
;
fp
->
L_ssb
=
(((
uint64_t
)
config
->
ssb_table
.
ssb_mask_list
[
1
].
ssb_mask
.
value
)
<<
32
)
|
config
->
ssb_table
.
ssb_mask_list
[
0
].
ssb_mask
.
value
;
int
N_RB_DL
=
config
->
carrier_config
.
dl_grid_size
[
config
->
ssb_config
.
scs_common
.
value
].
value
;
int
N_RB_UL
=
config
->
carrier_config
.
ul_grid_size
[
config
->
ssb_config
.
scs_common
.
value
].
value
;
return
nr_init_frame_parms0
(
fp
,
config
,
0
,
NFAPI_CP_NORMAL
,
N_RB_DL
);
N_RB_DL
,
N_RB_UL
);
}
int
nr_init_frame_parms_ue
(
NR_DL_FRAME_PARMS
*
fp
,
...
...
@@ -281,8 +285,8 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
int
n_ssb_crb
,
int
ssb_subcarrier_offset
)
{
/*n_ssb_crb and ssb_subcarrier_offset are given in 15kHz SCS*/
nr_init_frame_parms0
(
fp
,
NULL
,
mu
,
Ncp
,
N_RB_DL
);
int
N_RB_UL
=
N_RB_DL
;
nr_init_frame_parms0
(
fp
,
NULL
,
mu
,
Ncp
,
N_RB_DL
,
N_RB_UL
);
fp
->
ssb_start_subcarrier
=
(
12
*
n_ssb_crb
+
ssb_subcarrier_offset
);
return
0
;
}
...
...
openair1/PHY/NR_TRANSPORT/nr_dlsch.h
View file @
ab3b6c88
...
...
@@ -89,7 +89,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch,
time_stats_t
*
dlsch_segmentation_stats
);
void
free_gNB_dlsch
(
NR_gNB_DLSCH_t
*
dlsch
);
void
free_gNB_dlsch
(
NR_gNB_DLSCH_t
*
dlsch
,
uint16_t
N_RB
);
void
clean_gNB_dlsch
(
NR_gNB_DLSCH_t
*
dlsch
);
...
...
openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
View file @
ab3b6c88
...
...
@@ -49,12 +49,22 @@
//#define DEBUG_DLSCH_CODING
//#define DEBUG_DLSCH_FREE 1
void
free_gNB_dlsch
(
NR_gNB_DLSCH_t
*
dlsch
)
void
free_gNB_dlsch
(
NR_gNB_DLSCH_t
*
dlsch
,
uint16_t
N_RB
)
{
int
i
;
int
r
;
uint16_t
a_segments
=
MAX_NUM_NR_DLSCH_SEGMENTS
;
//number of segments to be allocated
if
(
dlsch
)
{
if
(
N_RB
!=
273
)
{
a_segments
=
a_segments
*
N_RB
;
a_segments
=
a_segments
/
273
;
}
uint16_t
dlsch_bytes
=
a_segments
*
1056
;
// allocated bytes per segment
#ifdef DEBUG_DLSCH_FREE
LOG_D
(
PHY
,
"Freeing dlsch %p
\n
"
,
dlsch
);
#endif
...
...
@@ -70,18 +80,34 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch)
#endif
if
(
dlsch
->
harq_processes
[
i
]
->
b
)
{
free16
(
dlsch
->
harq_processes
[
i
]
->
b
,
MAX_NR_DLSCH_PAYLOAD_BYTES
);
//this should be MAX_NR_DLSCH_PAYLOAD_BYTES
free16
(
dlsch
->
harq_processes
[
i
]
->
b
,
dlsch_bytes
);
dlsch
->
harq_processes
[
i
]
->
b
=
NULL
;
#ifdef DEBUG_DLSCH_FREE
LOG_D
(
PHY
,
"Freeing dlsch process %d b (%p)
\n
"
,
i
,
dlsch
->
harq_processes
[
i
]
->
b
);
#endif
}
if
(
dlsch
->
harq_processes
[
i
]
->
e
)
{
free16
(
dlsch
->
harq_processes
[
i
]
->
e
,
14
*
N_RB
*
12
*
8
);
dlsch
->
harq_processes
[
i
]
->
e
=
NULL
;
#ifdef DEBUG_DLSCH_FREE
printf
(
"Freeing dlsch process %d e (%p)
\n
"
,
i
,
dlsch
->
harq_processes
[
i
]
->
e
);
#endif
}
if
(
dlsch
->
harq_processes
[
i
]
->
f
)
{
free16
(
dlsch
->
harq_processes
[
i
]
->
f
,
14
*
N_RB
*
12
*
8
);
dlsch
->
harq_processes
[
i
]
->
f
=
NULL
;
#ifdef DEBUG_DLSCH_FREE
printf
(
"Freeing dlsch process %d f (%p)
\n
"
,
i
,
dlsch
->
harq_processes
[
i
]
->
f
);
#endif
}
#ifdef DEBUG_DLSCH_FREE
LOG_D
(
PHY
,
"Freeing dlsch process %d c (%p)
\n
"
,
i
,
dlsch
->
harq_processes
[
i
]
->
c
);
#endif
for
(
r
=
0
;
r
<
MAX_NUM_NR_DLSCH_SEGMENTS
;
r
++
)
{
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
{
#ifdef DEBUG_DLSCH_FREE
LOG_D
(
PHY
,
"Freeing dlsch process %d c[%d] (%p)
\n
"
,
i
,
r
,
dlsch
->
harq_processes
[
i
]
->
c
[
r
]);
...
...
@@ -119,9 +145,15 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
NR_gNB_DLSCH_t
*
dlsch
;
unsigned
char
exit_flag
=
0
,
i
,
r
,
aa
,
layer
;
int
re
;
unsigned
char
bw_scaling
=
1
;
uint16_t
a_segments
=
MAX_NUM_NR_DLSCH_SEGMENTS
;
//number of segments to be allocated
if
(
N_RB
!=
273
)
{
a_segments
=
a_segments
*
N_RB
;
a_segments
=
a_segments
/
273
;
}
uint16_t
dlsch_bytes
=
a_segments
*
1056
;
// allocated bytes per segment
if
(
N_RB
<=
107
)
bw_scaling
=
2
;
dlsch
=
(
NR_gNB_DLSCH_t
*
)
malloc16
(
sizeof
(
NR_gNB_DLSCH_t
));
...
...
@@ -161,31 +193,31 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
for
(
i
=
0
;
i
<
Mdlharq
;
i
++
)
{
dlsch
->
harq_processes
[
i
]
=
(
NR_DL_gNB_HARQ_t
*
)
malloc16
(
sizeof
(
NR_DL_gNB_HARQ_t
));
LOG_T
(
PHY
,
"Required mem size %d
(bw scaling %d),
dlsch->harq_processes[%d] %p
\n
"
,
MAX_NR_DLSCH_PAYLOAD_BYTES
/
bw_scaling
,
bw_scaling
,
i
,
dlsch
->
harq_processes
[
i
]);
LOG_T
(
PHY
,
"Required mem size %d dlsch->harq_processes[%d] %p
\n
"
,
dlsch_bytes
,
i
,
dlsch
->
harq_processes
[
i
]);
if
(
dlsch
->
harq_processes
[
i
])
{
bzero
(
dlsch
->
harq_processes
[
i
],
sizeof
(
NR_DL_gNB_HARQ_t
));
// dlsch->harq_processes[i]->first_tx=1;
dlsch
->
harq_processes
[
i
]
->
b
=
(
unsigned
char
*
)
malloc16
(
MAX_NR_DLSCH_PAYLOAD_BYTES
/
bw_scaling
);
dlsch
->
harq_processes
[
i
]
->
pdu
=
(
uint8_t
*
)
malloc16
(
MAX_NR_DLSCH_PAYLOAD_BYTES
/
bw_scaling
);
dlsch
->
harq_processes
[
i
]
->
b
=
(
unsigned
char
*
)
malloc16
(
dlsch_bytes
);
dlsch
->
harq_processes
[
i
]
->
pdu
=
(
uint8_t
*
)
malloc16
(
dlsch_bytes
);
if
(
dlsch
->
harq_processes
[
i
]
->
pdu
)
{
bzero
(
dlsch
->
harq_processes
[
i
]
->
pdu
,
MAX_NR_DLSCH_PAYLOAD_BYTES
/
bw_scaling
);
nr_emulate_dlsch_payload
(
dlsch
->
harq_processes
[
i
]
->
pdu
,
(
MAX_NR_DLSCH_PAYLOAD_BYTES
/
bw_scaling
)
>>
3
);
bzero
(
dlsch
->
harq_processes
[
i
]
->
pdu
,
dlsch_bytes
);
nr_emulate_dlsch_payload
(
dlsch
->
harq_processes
[
i
]
->
pdu
,
(
dlsch_bytes
)
>>
3
);
}
else
{
LOG_D
(
PHY
,
"Can't allocate PDU
\n
"
);
exit_flag
=
1
;
}
if
(
dlsch
->
harq_processes
[
i
]
->
b
)
{
bzero
(
dlsch
->
harq_processes
[
i
]
->
b
,
MAX_NR_DLSCH_PAYLOAD_BYTES
/
bw_scaling
);
bzero
(
dlsch
->
harq_processes
[
i
]
->
b
,
dlsch_bytes
);
}
else
{
LOG_D
(
PHY
,
"Can't get b
\n
"
);
exit_flag
=
1
;
}
if
(
abstraction_flag
==
0
)
{
for
(
r
=
0
;
r
<
MAX_NUM_NR_DLSCH_SEGMENTS
/
bw_scaling
;
r
++
)
{
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
{
// account for filler in first segment and CRCs for multiple segment case
// [hna] 8448 is the maximum CB size in NR
// 68*348 = 68*(maximum size of Zc)
...
...
@@ -205,6 +237,20 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
exit_flag
=
2
;
}
}
dlsch
->
harq_processes
[
i
]
->
e
=
(
uint8_t
*
)
malloc16
(
14
*
N_RB
*
12
*
8
);
if
(
dlsch
->
harq_processes
[
i
]
->
e
)
{
bzero
(
dlsch
->
harq_processes
[
i
]
->
e
,
14
*
N_RB
*
12
*
8
);
}
else
{
printf
(
"Can't get e
\n
"
);
exit_flag
=
1
;
}
dlsch
->
harq_processes
[
i
]
->
f
=
(
uint8_t
*
)
malloc16
(
14
*
N_RB
*
12
*
8
);
if
(
dlsch
->
harq_processes
[
i
]
->
f
)
{
bzero
(
dlsch
->
harq_processes
[
i
]
->
f
,
14
*
N_RB
*
12
*
8
);
}
else
{
printf
(
"Can't get f
\n
"
);
exit_flag
=
1
;
}
}
}
else
{
LOG_D
(
PHY
,
"Can't get harq_p %d
\n
"
,
i
);
...
...
@@ -223,7 +269,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
LOG_D
(
PHY
,
"new_gNB_dlsch exit flag %d, size of %ld
\n
"
,
exit_flag
,
sizeof
(
NR_gNB_DLSCH_t
));
free_gNB_dlsch
(
dlsch
);
free_gNB_dlsch
(
dlsch
,
N_RB
);
return
(
NULL
);
...
...
@@ -325,7 +371,7 @@ int nr_dlsch_encoding(unsigned char *a,
dlsch
->
harq_processes
[
harq_pid
]
->
B
=
A
+
24
;
// dlsch->harq_processes[harq_pid]->b = a;
AssertFatal
((
A
/
8
)
+
3
<=
MAX_NR_DLSCH_PAYLOAD_BYTES
,
"A %d is too big (A/8+4 = %d > %d)
\n
"
,
A
,(
A
/
8
)
+
4
,
MAX_NR_DLSCH_PAYLOAD_BYTES
);
AssertFatal
((
A
/
8
)
+
4
<=
MAX_NR_DLSCH_PAYLOAD_BYTES
,
"A %d is too big (A/8+4 = %d > %d)
\n
"
,
A
,(
A
/
8
)
+
4
,
MAX_NR_DLSCH_PAYLOAD_BYTES
);
memcpy
(
dlsch
->
harq_processes
[
harq_pid
]
->
b
,
a
,(
A
/
8
)
+
4
);
// why is this +4 if the CRC is only 3 bytes?
}
...
...
@@ -391,7 +437,7 @@ int nr_dlsch_encoding(unsigned char *a,
//ldpc_encoder_optim((unsigned char*)dlsch->harq_processes[harq_pid]->c[r],(unsigned char*)&dlsch->harq_processes[harq_pid]->d[r][0],*Zc,Kb,Kr,BG,NULL,NULL,NULL,NULL);
}
for
(
int
j
=
0
;
j
<
(
dlsch
->
harq_processes
[
harq_pid
]
->
C
/
8
+
1
);
j
++
)
{
for
(
int
j
=
0
;
j
<
(
(
dlsch
->
harq_processes
[
harq_pid
]
->
C
-
1
)
/
8
+
1
);
j
++
)
{
ldpc_encoder_optim_8seg_multi
(
dlsch
->
harq_processes
[
harq_pid
]
->
c
,
dlsch
->
harq_processes
[
harq_pid
]
->
d
,
*
Zc
,
Kb
,
Kr
,
BG
,
dlsch
->
harq_processes
[
harq_pid
]
->
C
,
j
,
tinput
,
tprep
,
tparity
,
toutput
);
...
...
openair1/PHY/NR_TRANSPORT/nr_ulsch.h
View file @
ab3b6c88
...
...
@@ -32,7 +32,7 @@
#include "PHY/defs_gNB.h"
void
free_gNB_ulsch
(
NR_gNB_ULSCH_t
**
ulsch
);
void
free_gNB_ulsch
(
NR_gNB_ULSCH_t
**
ulsch
,
uint8_t
N_RB_UL
);
NR_gNB_ULSCH_t
*
new_gNB_ulsch
(
uint8_t
max_ldpc_iterations
,
uint8_t
N_RB_UL
,
uint8_t
abstraction_flag
);
...
...
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
View file @
ab3b6c88
...
...
@@ -58,29 +58,45 @@ static uint64_t nb_error_decod =0;
//extern double cpuf;
void
free_gNB_ulsch
(
NR_gNB_ULSCH_t
**
ulschptr
)
{
void
free_gNB_ulsch
(
NR_gNB_ULSCH_t
**
ulschptr
,
uint8_t
N_RB_UL
)
{
int
i
,
r
;
uint16_t
a_segments
=
MAX_NUM_NR_ULSCH_SEGMENTS
;
//number of segments to be allocated
NR_gNB_ULSCH_t
*
ulsch
=
*
ulschptr
;
if
(
ulsch
)
{
if
(
N_RB_UL
!=
273
)
{
a_segments
=
a_segments
*
N_RB_UL
;
a_segments
=
a_segments
/
273
;
}
uint16_t
ulsch_bytes
=
a_segments
*
1056
;
// allocated bytes per segment
for
(
i
=
0
;
i
<
NR_MAX_ULSCH_HARQ_PROCESSES
;
i
++
)
{
if
(
ulsch
->
harq_processes
[
i
])
{
if
(
ulsch
->
harq_processes
[
i
]
->
b
)
{
free16
(
ulsch
->
harq_processes
[
i
]
->
b
,
MAX_NR_ULSCH_PAYLOAD_BYTES
);
free16
(
ulsch
->
harq_processes
[
i
]
->
b
,
ulsch_bytes
);
ulsch
->
harq_processes
[
i
]
->
b
=
NULL
;
}
for
(
r
=
0
;
r
<
MAX_NUM_NR_ULSCH_SEGMENTS
;
r
++
)
{
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
{
free16
(
ulsch
->
harq_processes
[
i
]
->
c
[
r
],(
8448
)
*
sizeof
(
uint8_t
));
ulsch
->
harq_processes
[
i
]
->
c
[
r
]
=
NULL
;
}
for
(
r
=
0
;
r
<
MAX_NUM_NR_ULSCH_SEGMENTS
;
r
++
)
{
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
{
if
(
ulsch
->
harq_processes
[
i
]
->
d
[
r
])
{
free16
(
ulsch
->
harq_processes
[
i
]
->
d
[
r
],(
68
*
384
)
*
sizeof
(
int16_t
));
ulsch
->
harq_processes
[
i
]
->
d
[
r
]
=
NULL
;
}
}
for
(
r
=
0
;
r
<
(
MAX_NUM_NR_ULSCH_SEGMENTS
);
r
++
)
{
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
{
if
(
ulsch
->
harq_processes
[
i
]
->
w
[
r
])
{
free16
(
ulsch
->
harq_processes
[
i
]
->
w
[
r
],(
3
*
(
6144
+
64
))
*
sizeof
(
int16_t
));
ulsch
->
harq_processes
[
i
]
->
w
[
r
]
=
NULL
;
}
}
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
{
if
(
ulsch
->
harq_processes
[
i
]
->
p_nrLDPC_procBuf
[
r
]){
nrLDPC_free_mem
(
ulsch
->
harq_processes
[
i
]
->
p_nrLDPC_procBuf
[
r
]);
ulsch
->
harq_processes
[
i
]
->
p_nrLDPC_procBuf
[
r
]
=
NULL
;
...
...
@@ -101,17 +117,14 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations,uint8_t N_RB_UL, uint8
NR_gNB_ULSCH_t
*
ulsch
;
uint8_t
exit_flag
=
0
,
i
,
r
;
u
nsigned
char
bw_scaling
=
1
;
u
int16_t
a_segments
=
MAX_NUM_NR_ULSCH_SEGMENTS
;
//number of segments to be allocated
switch
(
N_RB_UL
)
{
case
106
:
bw_scaling
=
2
;
break
;
if
(
N_RB_UL
!=
273
)
{
a_segments
=
a_segments
*
N_RB_UL
;
a_segments
=
a_segments
/
273
;
}
default:
bw_scaling
=
1
;
break
;
}
uint16_t
ulsch_bytes
=
a_segments
*
1056
;
// allocated bytes per segment
ulsch
=
(
NR_gNB_ULSCH_t
*
)
malloc16
(
sizeof
(
NR_gNB_ULSCH_t
));
...
...
@@ -130,15 +143,15 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations,uint8_t N_RB_UL, uint8
memset
(
ulsch
->
harq_processes
[
i
],
0
,
sizeof
(
NR_UL_gNB_HARQ_t
));
ulsch
->
harq_processes
[
i
]
->
b
=
(
uint8_t
*
)
malloc16
(
MAX_NR_ULSCH_PAYLOAD_BYTES
/
bw_scaling
);
ulsch
->
harq_processes
[
i
]
->
b
=
(
uint8_t
*
)
malloc16
(
ulsch_bytes
);
if
(
ulsch
->
harq_processes
[
i
]
->
b
)
memset
(
ulsch
->
harq_processes
[
i
]
->
b
,
0
,
MAX_NR_ULSCH_PAYLOAD_BYTES
/
bw_scaling
);
memset
(
ulsch
->
harq_processes
[
i
]
->
b
,
0
,
ulsch_bytes
);
else
exit_flag
=
3
;
if
(
abstraction_flag
==
0
)
{
for
(
r
=
0
;
r
<
MAX_NUM_NR_ULSCH_SEGMENTS
/
bw_scaling
;
r
++
)
{
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
{
ulsch
->
harq_processes
[
i
]
->
p_nrLDPC_procBuf
[
r
]
=
nrLDPC_init_mem
();
...
...
@@ -155,6 +168,13 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations,uint8_t N_RB_UL, uint8
memset
(
ulsch
->
harq_processes
[
i
]
->
d
[
r
],
0
,(
68
*
384
)
*
sizeof
(
int16_t
));
else
exit_flag
=
2
;
ulsch
->
harq_processes
[
i
]
->
w
[
r
]
=
(
int16_t
*
)
malloc16
((
3
*
(
6144
+
64
))
*
sizeof
(
int16_t
));
if
(
ulsch
->
harq_processes
[
i
]
->
w
[
r
])
memset
(
ulsch
->
harq_processes
[
i
]
->
w
[
r
],
0
,(
3
*
(
6144
+
64
))
*
sizeof
(
int16_t
));
else
exit_flag
=
2
;
}
}
}
else
{
...
...
@@ -167,7 +187,8 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations,uint8_t N_RB_UL, uint8
}
printf
(
"new_gNB_ulsch with size %zu: exit_flag = %u
\n
"
,
sizeof
(
NR_UL_gNB_HARQ_t
),
exit_flag
);
free_gNB_ulsch
(
&
ulsch
);
free_gNB_ulsch
(
&
ulsch
,
N_RB_UL
);
return
(
NULL
);
}
...
...
@@ -263,7 +284,7 @@ void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch)
/// Temporary h sequence to flag PUSCH_x/PUSCH_y symbols which are not scrambled
//uint8_t h[MAX_NUM_CHANNEL_BITS];
/// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
//int16_t w[MAX_NUM_ULSCH_SEGMENTS][3*(6144+64)];
//int16_t w[MAX_NUM_
NR_
ULSCH_SEGMENTS][3*(6144+64)];
}
}
}
...
...
@@ -420,21 +441,15 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
err_flag
=
0
;
r_offset
=
0
;
u
nsigned
char
bw_scaling
=
1
;
u
int16_t
a_segments
=
MAX_NUM_NR_ULSCH_SEGMENTS
;
//number of segments to be allocated
switch
(
frame_parms
->
N_RB_UL
)
{
case
106
:
bw_scaling
=
2
;
break
;
default:
bw_scaling
=
1
;
break
;
}
if
(
nb_rb
!=
273
)
{
a_segments
=
a_segments
*
nb_rb
;
a_segments
=
a_segments
/
273
;
}
if
(
harq_process
->
C
>
MAX_NUM_NR_ULSCH_SEGMENTS
/
bw_scaling
)
{
LOG_E
(
PHY
,
"Illegal harq_process->C %d > %d
\n
"
,
harq_process
->
C
,
MAX_NUM_NR_ULSCH_SEGMENTS
/
bw_scaling
);
if
(
harq_process
->
C
>
a_segments
)
{
LOG_E
(
PHY
,
"Illegal harq_process->C %d > %d
\n
"
,
harq_process
->
C
,
a_segments
);
return
(
ulsch
->
max_ldpc_iterations
+
1
);
}
#ifdef DEBUG_ULSCH_DECODING
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
View file @
ab3b6c88
...
...
@@ -56,31 +56,46 @@ notifiedFIFO_elt_t *msgToPush;
//extern double cpuf;
void
free_nr_ue_dlsch
(
NR_UE_DLSCH_t
**
dlschptr
)
void
free_nr_ue_dlsch
(
NR_UE_DLSCH_t
**
dlschptr
,
uint8_t
N_RB_DL
)
{
int
i
,
r
;
uint16_t
a_segments
=
MAX_NUM_NR_DLSCH_SEGMENTS
;
//number of segments to be allocated
NR_UE_DLSCH_t
*
dlsch
=*
dlschptr
;
if
(
dlsch
)
{
if
(
N_RB_DL
!=
273
)
{
a_segments
=
a_segments
*
N_RB_DL
;
a_segments
=
a_segments
/
273
;
}
uint16_t
dlsch_bytes
=
a_segments
*
1056
;
// allocated bytes per segment
for
(
i
=
0
;
i
<
dlsch
->
Mdlharq
;
i
++
)
{
if
(
dlsch
->
harq_processes
[
i
])
{
if
(
dlsch
->
harq_processes
[
i
]
->
b
)
{
free16
(
dlsch
->
harq_processes
[
i
]
->
b
,
MAX_NR_DLSCH_PAYLOAD_BYTES
);
free16
(
dlsch
->
harq_processes
[
i
]
->
b
,
dlsch_bytes
);
dlsch
->
harq_processes
[
i
]
->
b
=
NULL
;
}
for
(
r
=
0
;
r
<
MAX_NUM_NR_DLSCH_SEGMENTS
;
r
++
)
{
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
{
free16
(
dlsch
->
harq_processes
[
i
]
->
c
[
r
],
1056
);
dlsch
->
harq_processes
[
i
]
->
c
[
r
]
=
NULL
;
}
for
(
r
=
0
;
r
<
MAX_NUM_NR_DLSCH_SEGMENTS
;
r
++
)
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
if
(
dlsch
->
harq_processes
[
i
]
->
d
[
r
])
{
free16
(
dlsch
->
harq_processes
[
i
]
->
d
[
r
],(
3
*
8448
)
*
sizeof
(
short
));
dlsch
->
harq_processes
[
i
]
->
d
[
r
]
=
NULL
;
}
for
(
r
=
0
;
r
<
(
MAX_NUM_NR_DLSCH_SEGMENTS
);
r
++
)
{
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
if
(
dlsch
->
harq_processes
[
i
]
->
w
[
r
])
{
free16
(
dlsch
->
harq_processes
[
i
]
->
w
[
r
],(
3
*
8448
)
*
sizeof
(
short
));
dlsch
->
harq_processes
[
i
]
->
w
[
r
]
=
NULL
;
}
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
{
if
(
dlsch
->
harq_processes
[
i
]
->
p_nrLDPC_procBuf
[
r
]){
nrLDPC_free_mem
(
dlsch
->
harq_processes
[
i
]
->
p_nrLDPC_procBuf
[
r
]);
dlsch
->
harq_processes
[
i
]
->
p_nrLDPC_procBuf
[
r
]
=
NULL
;
...
...
@@ -103,25 +118,14 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
NR_UE_DLSCH_t
*
dlsch
;
uint8_t
exit_flag
=
0
,
i
,
r
;
u
nsigned
char
bw_scaling
=
1
;
u
int16_t
a_segments
=
MAX_NUM_NR_DLSCH_SEGMENTS
;
//number of segments to be allocated
switch
(
N_RB_DL
)
{
case
6
:
bw_scaling
=
16
;
break
;
if
(
N_RB_DL
!=
273
)
{
a_segments
=
a_segments
*
N_RB_DL
;
a_segments
=
a_segments
/
273
;
}
case
25
:
bw_scaling
=
4
;
break
;
case
50
:
bw_scaling
=
2
;
break
;
default:
bw_scaling
=
1
;
break
;
}
uint16_t
dlsch_bytes
=
a_segments
*
1056
;
// allocated bytes per segment
dlsch
=
(
NR_UE_DLSCH_t
*
)
malloc16
(
sizeof
(
NR_UE_DLSCH_t
));
...
...
@@ -140,15 +144,15 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
if
(
dlsch
->
harq_processes
[
i
])
{
memset
(
dlsch
->
harq_processes
[
i
],
0
,
sizeof
(
NR_DL_UE_HARQ_t
));
dlsch
->
harq_processes
[
i
]
->
first_tx
=
1
;
dlsch
->
harq_processes
[
i
]
->
b
=
(
uint8_t
*
)
malloc16
(
MAX_NR_DLSCH_PAYLOAD_BYTES
/
bw_scaling
);
dlsch
->
harq_processes
[
i
]
->
b
=
(
uint8_t
*
)
malloc16
(
dlsch_bytes
);
if
(
dlsch
->
harq_processes
[
i
]
->
b
)
memset
(
dlsch
->
harq_processes
[
i
]
->
b
,
0
,
MAX_NR_DLSCH_PAYLOAD_BYTES
/
bw_scaling
);
memset
(
dlsch
->
harq_processes
[
i
]
->
b
,
0
,
dlsch_bytes
);
else
exit_flag
=
3
;
if
(
abstraction_flag
==
0
)
{
for
(
r
=
0
;
r
<
MAX_NUM_NR_DLSCH_SEGMENTS
/
bw_scaling
;
r
++
)
{
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
{
dlsch
->
harq_processes
[
i
]
->
p_nrLDPC_procBuf
[
r
]
=
nrLDPC_init_mem
();
dlsch
->
harq_processes
[
i
]
->
c
[
r
]
=
(
uint8_t
*
)
malloc16
(
1056
);
...
...
@@ -163,6 +167,13 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
memset
(
dlsch
->
harq_processes
[
i
]
->
d
[
r
],
0
,(
3
*
8448
)
*
sizeof
(
short
));
else
exit_flag
=
2
;
dlsch
->
harq_processes
[
i
]
->
w
[
r
]
=
(
short
*
)
malloc16
((
3
*
8448
)
*
sizeof
(
short
));
if
(
dlsch
->
harq_processes
[
i
]
->
w
[
r
])
memset
(
dlsch
->
harq_processes
[
i
]
->
w
[
r
],
0
,(
3
*
8448
)
*
sizeof
(
short
));
else
exit_flag
=
2
;
}
}
}
else
{
...
...
@@ -175,7 +186,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
}
printf
(
"new_ue_dlsch with size %zu: exit_flag = %u
\n
"
,
sizeof
(
NR_DL_UE_HARQ_t
),
exit_flag
);
free_nr_ue_dlsch
(
&
dlsch
);
free_nr_ue_dlsch
(
&
dlsch
,
N_RB_DL
);
return
(
NULL
);
}
...
...
@@ -392,20 +403,15 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
err_flag
=
0
;
r_offset
=
0
;
u
nsigned
char
bw_scaling
=
1
;
u
int16_t
a_segments
=
MAX_NUM_NR_DLSCH_SEGMENTS
;
//number of segments to be allocated
switch
(
frame_parms
->
N_RB_DL
)
{
case
106
:
bw_scaling
=
2
;
break
;
default:
bw_scaling
=
1
;
break
;
}
if
(
nb_rb
!=
273
)
{
a_segments
=
a_segments
*
nb_rb
;
a_segments
=
a_segments
/
273
;
}
if
(
harq_process
->
C
>
MAX_NUM_NR_DLSCH_SEGMENTS
/
bw_scaling
)
{
LOG_E
(
PHY
,
"Illegal harq_process->C %d > %d
\n
"
,
harq_process
->
C
,
MAX_NUM_NR_DLSCH_SEGMENTS
/
bw_scaling
);
if
(
harq_process
->
C
>
a_segments
)
{
LOG_E
(
PHY
,
"Illegal harq_process->C %d > %d
\n
"
,
harq_process
->
C
,
a_segments
);
return
((
1
+
dlsch
->
max_ldpc_iterations
));
}
...
...
@@ -938,20 +944,15 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
err_flag
=
0
;
r_offset
=
0
;
u
nsigned
char
bw_scaling
=
1
;
u
int16_t
a_segments
=
MAX_NUM_NR_DLSCH_SEGMENTS
;
//number of segments to be allocated
switch
(
frame_parms
->
N_RB_DL
)
{
case
106
:
bw_scaling
=
2
;
break
;
if
(
nb_rb
!=
273
)
{
a_segments
=
a_segments
*
nb_rb
;
a_segments
=
a_segments
/
273
;
}
default:
bw_scaling
=
1
;
break
;
}
if
(
harq_process
->
C
>
MAX_NUM_NR_DLSCH_SEGMENTS
/
bw_scaling
)
{
LOG_E
(
PHY
,
"Illegal harq_process->C %d > %d
\n
"
,
harq_process
->
C
,
MAX_NUM_NR_DLSCH_SEGMENTS
/
bw_scaling
);
if
(
harq_process
->
C
>
a_segments
)
{
LOG_E
(
PHY
,
"Illegal harq_process->C %d > %d
\n
"
,
harq_process
->
C
,
a_segments
);
return
((
1
+
dlsch
->
max_ldpc_iterations
));
}
#ifdef DEBUG_DLSCH_DECODING
...
...
@@ -1516,20 +1517,15 @@ void *nr_dlsch_decoding_process(void *arg)
//r_offset = 0;
/*
u
nsigned char bw_scaling =1;
u
int16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated
switch (frame_parms->N_RB_DL) {
case 106:
bw_scaling =2;
break;
default:
bw_scaling =1;
break;
}
if (nb_rb != 273) {
a_segments = a_segments*nb_rb;
a_segments = a_segments/273;
}
if (harq_process->C >
MAX_NUM_NR_DLSCH_SEGMENTS/bw_scaling
) {
LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,
MAX_NUM_NR_DLSCH_SEGMENTS/bw_scaling
);
if (harq_process->C >
a_segments
) {
LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,
a_segments
);
return((1+dlsch->max_ldpc_iterations));
}*/
#ifdef DEBUG_DLSCH_DECODING
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
View file @
ab3b6c88
...
...
@@ -47,7 +47,8 @@
\brief This function frees memory allocated for a particular DLSCH at UE
@param dlsch Pointer to DLSCH to be removed
*/
void
free_nr_ue_dlsch
(
NR_UE_DLSCH_t
**
dlsch
);
void
free_nr_ue_dlsch
(
NR_UE_DLSCH_t
**
dlsch
,
uint8_t
N_RB_DL
);
/** \fn new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t abstraction_flag)
\brief This function allocates structures for a particular DLSCH at UE
...
...
@@ -61,7 +62,7 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlsch);
NR_UE_DLSCH_t
*
new_nr_ue_dlsch
(
uint8_t
Kmimo
,
uint8_t
Mdlharq
,
uint32_t
Nsoft
,
uint8_t
max_turbo_iterations
,
uint8_t
N_RB_DL
,
uint8_t
abstraction_flag
);
void
free_nr_ue_ulsch
(
NR_UE_ULSCH_t
*
ulsch
);
void
free_nr_ue_ulsch
(
NR_UE_ULSCH_t
*
ulsch
,
unsigned
char
N_RB_UL
);
NR_UE_ULSCH_t
*
new_nr_ue_ulsch
(
unsigned
char
N_RB_UL
,
int
number_of_harq_pids
,
uint8_t
abstraction_flag
);
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
View file @
ab3b6c88
...
...
@@ -127,9 +127,9 @@ typedef struct {
/// LDPC-code outputs
uint8_t
*
d
[
MAX_NUM_NR_ULSCH_SEGMENTS
];
/// LDPC-code outputs (TS 36.212 V15.4.0, Sec 5.3.2 p. 17)
uint8_t
e
[
MAX_NUM_NR_CHANNEL_BITS
]
__attribute__
((
aligned
(
32
)))
;
uint8_t
*
e
;
/// Rate matching (Interleaving) outputs (TS 36.212 V15.4.0, Sec 5.4.2.2 p. 30)
uint8_t
f
[
MAX_NUM_NR_CHANNEL_BITS
]
__attribute__
((
aligned
(
32
)))
;
uint8_t
*
f
;
/// Number of code segments
uint32_t
C
;
/// Number of bits in code segments
...
...
@@ -278,7 +278,7 @@ typedef struct {
/// MIMO mode for this DLSCH
MIMO_nrmode_t
mimo_mode
;
/// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
int16_t
w
[
MAX_NUM_NR_DLSCH_SEGMENTS
][
3
*
8448
];
int16_t
*
w
[
MAX_NUM_NR_DLSCH_SEGMENTS
];
/// for abstraction soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
//double w_abs[MAX_NUM_NR_DLSCH_SEGMENTS][3*8448];
/// soft bits for each received segment ("d"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
View file @
ab3b6c88
...
...
@@ -42,7 +42,7 @@
void
free_nr_ue_ulsch
(
NR_UE_ULSCH_t
*
ulsch
)
void
free_nr_ue_ulsch
(
NR_UE_ULSCH_t
*
ulsch
,
unsigned
char
N_RB_UL
)
{
int
i
,
r
;
...
...
@@ -51,18 +51,35 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t *ulsch)
printf
(
"Freeing ulsch %p
\n
"
,
ulsch
);
#endif
uint16_t
a_segments
=
MAX_NUM_NR_ULSCH_SEGMENTS
;
//number of segments to be allocated
if
(
N_RB_UL
!=
273
)
{
a_segments
=
a_segments
*
N_RB_UL
;
a_segments
=
a_segments
/
273
;
}
uint16_t
ulsch_bytes
=
a_segments
*
1056
;
// allocated bytes per segment
for
(
i
=
0
;
i
<
NR_MAX_ULSCH_HARQ_PROCESSES
;
i
++
)
{
if
(
ulsch
->
harq_processes
[
i
])
{
if
(
ulsch
->
harq_processes
[
i
]
->
a
)
{
free16
(
ulsch
->
harq_processes
[
i
]
->
a
,
MAX_NR_ULSCH_PAYLOAD_BYTES
);
free16
(
ulsch
->
harq_processes
[
i
]
->
a
,
ulsch_bytes
);
ulsch
->
harq_processes
[
i
]
->
a
=
NULL
;
}
if
(
ulsch
->
harq_processes
[
i
]
->
b
)
{
free16
(
ulsch
->
harq_processes
[
i
]
->
b
,
MAX_NR_ULSCH_PAYLOAD_BYTES
);
free16
(
ulsch
->
harq_processes
[
i
]
->
b
,
ulsch_bytes
);
ulsch
->
harq_processes
[
i
]
->
b
=
NULL
;
}
for
(
r
=
0
;
r
<
MAX_NUM_NR_ULSCH_SEGMENTS
;
r
++
)
{
if
(
ulsch
->
harq_processes
[
i
]
->
e
)
{
free16
(
ulsch
->
harq_processes
[
i
]
->
e
,
14
*
N_RB_UL
*
12
*
8
);
ulsch
->
harq_processes
[
i
]
->
e
=
NULL
;
}
if
(
ulsch
->
harq_processes
[
i
]
->
f
)
{
free16
(
ulsch
->
harq_processes
[
i
]
->
f
,
14
*
N_RB_UL
*
12
*
8
);
ulsch
->
harq_processes
[
i
]
->
f
=
NULL
;
}
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
{
if
(
ulsch
->
harq_processes
[
i
]
->
c
[
r
])
{
free16
(
ulsch
->
harq_processes
[
i
]
->
c
[
r
],((
r
==
0
)
?
8
:
0
)
+
3
+
768
);
ulsch
->
harq_processes
[
i
]
->
c
[
r
]
=
NULL
;
...
...
@@ -92,18 +109,14 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(unsigned char N_RB_UL,
{
NR_UE_ULSCH_t
*
ulsch
;
unsigned
char
exit_flag
=
0
,
i
,
r
;
u
nsigned
char
bw_scaling
=
1
;
u
int16_t
a_segments
=
MAX_NUM_NR_ULSCH_SEGMENTS
;
//number of segments to be allocated
switch
(
N_RB_UL
)
{
if
(
N_RB_UL
!=
273
)
{
a_segments
=
a_segments
*
N_RB_UL
;
a_segments
=
a_segments
/
273
;
}
case
106
:
bw_scaling
=
2
;
break
;
default:
bw_scaling
=
1
;
break
;
}
uint16_t
ulsch_bytes
=
a_segments
*
1056
;
// allocated bytes per segment
ulsch
=
(
NR_UE_ULSCH_t
*
)
malloc16
(
sizeof
(
NR_UE_ULSCH_t
));
...
...
@@ -123,25 +136,25 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(unsigned char N_RB_UL,
// printf("ulsch->harq_processes[%d] %p\n",i,ulsch->harq_processes[i]);
if
(
ulsch
->
harq_processes
[
i
])
{
memset
(
ulsch
->
harq_processes
[
i
],
0
,
sizeof
(
NR_UL_UE_HARQ_t
));
ulsch
->
harq_processes
[
i
]
->
b
=
(
uint8_t
*
)
malloc16
(
MAX_NR_ULSCH_PAYLOAD_BYTES
/
bw_scaling
);
ulsch
->
harq_processes
[
i
]
->
a
=
(
unsigned
char
*
)
malloc16
(
MAX_NR_ULSCH_PAYLOAD_BYTES
/
bw_scaling
);
ulsch
->
harq_processes
[
i
]
->
b
=
(
uint8_t
*
)
malloc16
(
ulsch_bytes
);
ulsch
->
harq_processes
[
i
]
->
a
=
(
unsigned
char
*
)
malloc16
(
ulsch_bytes
);
if
(
ulsch
->
harq_processes
[
i
]
->
a
)
{
bzero
(
ulsch
->
harq_processes
[
i
]
->
a
,
MAX_NR_ULSCH_PAYLOAD_BYTES
/
bw_scaling
);
bzero
(
ulsch
->
harq_processes
[
i
]
->
a
,
ulsch_bytes
);
}
else
{
printf
(
"Can't allocate PDU
\n
"
);
exit_flag
=
1
;
}
if
(
ulsch
->
harq_processes
[
i
]
->
b
)
bzero
(
ulsch
->
harq_processes
[
i
]
->
b
,
MAX_NR_ULSCH_PAYLOAD_BYTES
/
bw_scaling
);
bzero
(
ulsch
->
harq_processes
[
i
]
->
b
,
ulsch_bytes
);
else
{
LOG_E
(
PHY
,
"Can't get b
\n
"
);
exit_flag
=
1
;
}
if
(
abstraction_flag
==
0
)
{
for
(
r
=
0
;
r
<
MAX_NUM_NR_ULSCH_SEGMENTS
/
bw_scaling
;
r
++
)
{
for
(
r
=
0
;
r
<
a_segments
;
r
++
)
{
// account for filler in first segment and CRCs for multiple segment case
ulsch
->
harq_processes
[
i
]
->
c
[
r
]
=
(
uint8_t
*
)
malloc16
(
8448
);
ulsch
->
harq_processes
[
i
]
->
d
[
r
]
=
(
uint8_t
*
)
malloc16
(
68
*
384
);
//max size for coded output
...
...
@@ -159,6 +172,20 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(unsigned char N_RB_UL,
exit_flag
=
2
;
}
}
ulsch
->
harq_processes
[
i
]
->
e
=
(
uint8_t
*
)
malloc16
(
14
*
N_RB_UL
*
12
*
8
);
if
(
ulsch
->
harq_processes
[
i
]
->
e
)
{
bzero
(
ulsch
->
harq_processes
[
i
]
->
e
,
14
*
N_RB_UL
*
12
*
8
);
}
else
{
printf
(
"Can't get e
\n
"
);
exit_flag
=
1
;
}
ulsch
->
harq_processes
[
i
]
->
f
=
(
uint8_t
*
)
malloc16
(
14
*
N_RB_UL
*
12
*
8
);
if
(
ulsch
->
harq_processes
[
i
]
->
f
)
{
bzero
(
ulsch
->
harq_processes
[
i
]
->
f
,
14
*
N_RB_UL
*
12
*
8
);
}
else
{
printf
(
"Can't get f
\n
"
);
exit_flag
=
1
;
}
}
ulsch
->
harq_processes
[
i
]
->
subframe_scheduling_flag
=
0
;
...
...
@@ -179,7 +206,7 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(unsigned char N_RB_UL,
}
LOG_E
(
PHY
,
"new_ue_ulsch exit flag, size of %d , %zu
\n
"
,
exit_flag
,
sizeof
(
LTE_UE_ULSCH_t
));
free_nr_ue_ulsch
(
ulsch
);
free_nr_ue_ulsch
(
ulsch
,
N_RB_UL
);
return
(
NULL
);
...
...
@@ -238,6 +265,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
///////////
/////////////////////////////////////////////////////////////////////////////////////////
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING
,
VCD_FUNCTION_IN
);
LOG_D
(
PHY
,
"ulsch coding nb_rb %d nb_symb_sch %d nb_re_dmrs %d, length_dmrs %d
\n
"
,
nb_rb
,
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
);
...
...
openair1/PHY/defs_gNB.h
View file @
ab3b6c88
...
...
@@ -89,11 +89,11 @@ typedef struct {
/// MIMO mode for this DLSCH
MIMO_mode_t
mimo_mode
;
/// Concatenated sequences
uint8_t
e
[
MAX_NUM_NR_CHANNEL_BITS
]
__attribute__
((
aligned
(
32
)))
;
uint8_t
*
e
;
/// LDPC-code outputs
uint8_t
*
d
[
MAX_NUM_NR_DLSCH_SEGMENTS
];
/// Interleaver outputs
uint8_t
f
[
MAX_NUM_NR_CHANNEL_BITS
]
__attribute__
((
aligned
(
32
)))
;
uint8_t
*
f
;
/// Number of code segments
uint32_t
C
;
/// Number of bits in "small" code segments
...
...
@@ -273,7 +273,7 @@ typedef struct {
/// Temporary h sequence to flag PUSCH_x/PUSCH_y symbols which are not scrambled
uint8_t
h
[
MAX_NUM_CHANNEL_BITS
];
/// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15)
int16_t
w
[
MAX_NUM_ULSCH_SEGMENTS
][
3
*
(
6144
+
64
)
];
int16_t
*
w
[
MAX_NUM_NR_ULSCH_SEGMENTS
];
//////////////////////////////////////////////////////////////
}
NR_UL_gNB_HARQ_t
;
...
...
openair1/PHY/defs_nr_common.h
View file @
ab3b6c88
...
...
@@ -102,13 +102,13 @@
#define NR_MAX_PUSCH_ENCODED_LENGTH NR_MAX_PDSCH_ENCODED_LENGTH
#define NR_MAX_PDSCH_TBS 3824
#define MAX_NUM_NR_DLSCH_SEGMENTS
2
4
#define MAX_NUM_NR_DLSCH_SEGMENTS
3
4
#define MAX_NR_DLSCH_PAYLOAD_BYTES (MAX_NUM_NR_DLSCH_SEGMENTS*1056)
#define MAX_NUM_NR_ULSCH_SEGMENTS MAX_NUM_NR_DLSCH_SEGMENTS
#define MAX_NR_ULSCH_PAYLOAD_BYTES (MAX_NUM_NR_ULSCH_SEGMENTS*1056)
#define MAX_NUM_NR_CHANNEL_BITS (14*273*12*
6
) // 14 symbols, 273 RB
#define MAX_NUM_NR_CHANNEL_BITS (14*273*12*
8
) // 14 symbols, 273 RB
#define MAX_NUM_NR_RE (14*273*12)
typedef
enum
{
...
...
openair1/SIMULATION/NR_PHY/dlschsim.c
View file @
ab3b6c88
...
...
@@ -623,9 +623,9 @@ int main(int argc, char **argv)
for
(
i
=
0
;
i
<
2
;
i
++
)
{
printf
(
"gNB %d
\n
"
,
i
);
free_gNB_dlsch
(
gNB
->
dlsch
[
0
][
i
]);
free_gNB_dlsch
(
gNB
->
dlsch
[
0
][
i
]
,
N_RB_DL
);
printf
(
"UE %d
\n
"
,
i
);
free_nr_ue_dlsch
(
&
(
UE
->
dlsch
[
0
][
0
][
i
]));
free_nr_ue_dlsch
(
&
(
UE
->
dlsch
[
0
][
0
][
i
])
,
N_RB_DL
);
}
for
(
i
=
0
;
i
<
2
;
i
++
)
{
...
...
openair1/SIMULATION/NR_PHY/ulschsim.c
View file @
ab3b6c88
...
...
@@ -566,6 +566,7 @@ int main(int argc, char **argv)
printf
(
"
\n
"
);
}
if
(
output_fd
)
fclose
(
output_fd
);
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
View file @
ab3b6c88
...
...
@@ -480,7 +480,6 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP,
nfapi_nr_dl_tti_request_body_t
*
dl_req
;
nfapi_nr_pdu_t
*
TX_req
;
int
TBS
;
int
TBS_bytes
;
int
lcid
;
...
...
@@ -491,7 +490,7 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP,
mac_rlc_status_resp_t
rlc_status
;
uint16_t
sdu_lengths
[
NB_RB_MAX
];
int
num_sdus
=
0
;
unsigned
char
dlsch_buffer
[
MAX_DLSCH_PAYLOAD_BYTES
];
unsigned
char
dlsch_buffer
[
MAX_
NR_
DLSCH_PAYLOAD_BYTES
];
int
offset
;
int
UE_id
=
0
;
unsigned
char
sdu_lcids
[
NB_RB_MAX
];
...
...
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