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
zzha zzha
OpenXG-RAN
Commits
4e485019
Commit
4e485019
authored
Oct 19, 2018
by
Guy De Souza
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
temp commit/ not compiling
parent
291a9483
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
389 additions
and
63 deletions
+389
-63
cmake_targets/CMakeLists.txt
cmake_targets/CMakeLists.txt
+2
-2
nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
+35
-5
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+91
-11
openair1/PHY/NR_TRANSPORT/nr_dlsch.h
openair1/PHY/NR_TRANSPORT/nr_dlsch.h
+10
-2
openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c
openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c
+19
-16
openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c
openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c
+99
-0
openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h
openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h
+44
-0
openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c
openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c
+64
-5
openair1/PHY/defs_gNB.h
openair1/PHY/defs_gNB.h
+4
-15
openair1/PHY/defs_nr_common.h
openair1/PHY/defs_nr_common.h
+10
-0
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+11
-7
No files found.
cmake_targets/CMakeLists.txt
View file @
4e485019
...
...
@@ -1293,8 +1293,8 @@ set(PHY_SRC_UE
${
OPENAIR1_DIR
}
/PHY/NR_TRANSPORT/nr_dci.c
${
OPENAIR1_DIR
}
/PHY/NR_TRANSPORT/nr_dci_tools.c
${
OPENAIR1_DIR
}
/PHY/NR_TRANSPORT/nr_dlsch.c
#
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_tools.c
#
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c
${
OPENAIR1_DIR
}
/PHY/NR_TRANSPORT/nr_dlsch_tools.c
${
OPENAIR1_DIR
}
/PHY/NR_TRANSPORT/nr_tbs_tools.c
${
OPENAIR1_DIR
}
/PHY/NR_REFSIG/nr_gold.c
${
OPENAIR1_DIR
}
/PHY/TOOLS/file_output.c
${
OPENAIR1_DIR
}
/PHY/TOOLS/cadd_vv.c
...
...
nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
View file @
4e485019
...
...
@@ -158,11 +158,17 @@ typedef struct {
typedef
struct
{
nfapi_uint16_tlv_t
data_scrambling_id
;
nfapi_uint16_tlv_t
dmrs_typeA_position
;
nfapi_uint16_tlv_t
dmrs_additional_position
;
nfapi_uint16_tlv_t
dmrs_type
;
nfapi_uint16_tlv_t
dmrs_max_length
;
nfapi_uint16_tlv_t
mapping_type
;
nfapi_uint16_tlv_t
resource_allocation
;
nfapi_uint16_tlv_t
time_allocation_list
;
nfapi_uint16_tlv_t
mcs_table
;
nfapi_uint16_tlv_t
aggregation_factor
;
nfapi_uint16_tlv_t
prb_bundling_type
;
nfapi_uint16_tlv_t
rbg_size
;
nfapi_uint16_tlv_t
resource_allocation_config
;
nfapi_uint16_tlv_t
vrb_to_prb_interleaver
;
nfapi_uint16_tlv_t
code_block_groug_transmission
;
nfapi_uint16_tlv_t
x_overhead
;
...
...
@@ -238,7 +244,7 @@ typedef struct {
nfapi_nr_subframe_config_t
subframe_config
;
nfapi_nr_rf_config_t
rf_config
;
nfapi_nr_sch_config_t
sch_config
;
nfapi_nr_pdsch_config_t
dl
sch_config
;
nfapi_nr_pdsch_config_t
pd
sch_config
;
nfapi_nr_rach_config_t
rach_config
;
nfapi_nr_pusch_config_t
pusch_config
;
nfapi_nr_pucch_config_t
pucch_config
;
...
...
@@ -343,6 +349,16 @@ typedef enum {
NFAPI_NR_PRB_BUNDLING_TYPE_DYNAMIC
}
nfapi_nr_prb_bundling_type_e
;
typedef
enum
{
NFAPI_NR_MCS_TABLE_QAM64_LOW_SE
=
0
,
NFAPI_NR_MCS_TABLE_QAM256
}
nfapi_nr_pdsch_mcs_table_e
;
typedef
enum
{
NFAPI_NR_DMRS_TYPE1
=
0
,
NFAPI_NR_DMRS_TYPE2
}
nfapi_nr_dmrs_type_e
;
// P7 Sub Structures
typedef
struct
{
...
...
@@ -485,13 +501,28 @@ typedef struct {
uint16_t
length
;
uint8_t
pdu_index
;
uint16_t
rnti
;
uint8_t
resource_allocation_type
;
uint8_t
time_allocation_type
;
uint8_t
freq_allocation_type
;
uint8_t
start_prb
;
uint8_t
n_prb
;
uint8_t
S
;
uint8_t
L
;
uint8_t
Imcs
;
uint8_t
n_codewords
;
uint8_t
n_layers
;
/*uint8_t R;
uint8_t Qm;
uint16_t TBS;
uint8_t nb_layers;*/
uint8_t
time_alloc_list_flag
;
uint8_t
time_alloc_list
;
uint8_t
rbg_list
;
uint8_t
virtual_resource_block_assignment_flag
;
uint32_t
resource_block_coding
;
uint8_t
modulation
;
uint8_t
redundancy_version
;
uint8_t
transport_blocks
;
uint8_t
transport_block_to_codeword_swap_flag
;
//
uint8_t transport_block_to_codeword_swap_flag;
uint8_t
transmission_scheme
;
uint8_t
number_of_layers
;
uint8_t
number_of_subbands
;
...
...
@@ -500,7 +531,6 @@ typedef struct {
uint8_t
pa
;
uint8_t
delta_power_offset_index
;
uint8_t
ngap
;
uint8_t
nprb
;
uint8_t
transmission_mode
;
uint8_t
num_bf_prb_per_subband
;
uint8_t
num_bf_vector
;
...
...
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
View file @
4e485019
...
...
@@ -33,6 +33,8 @@
#include "nr_dlsch.h"
#include "nr_dci.h"
#define DEBUG_DLSCH
void
nr_pdsch_codeword_scrambling
(
uint32_t
*
in
,
uint8_t
size
,
uint8_t
q
,
...
...
@@ -56,6 +58,31 @@ void nr_pdsch_codeword_scrambling(uint32_t *in,
}
void
nr_modulation
(
uint32_t
*
in
,
uint16_t
length
,
nr_mod_t
modulation_type
,
int16_t
*
out
)
{
uint16_t
offset
;
uint16_t
order
;
order
=
mod_order
[
modulation_type
];
offset
=
mod_offset
[
modulation_type
];
for
(
int
i
=
0
;
i
<
length
/
order
;
i
++
)
{
uint8_t
idx
=
0
,
b_idx
;
for
(
int
j
=
0
;
j
<
order
;
j
++
)
{
b_idx
=
(
i
*
order
+
j
)
&
0x1f
;
if
(
i
&&
(
!
b_idx
))
in
++
;
idx
^=
(((
*
in
)
>>
b_idx
)
&
1
)
<<
(
order
-
j
-
1
);
}
out
[
i
<<
1
]
=
nr_mod_table
[(
offset
+
idx
)
<<
1
];
out
[(
i
<<
1
)
+
1
]
=
nr_mod_table
[((
offset
+
idx
)
<<
1
)
+
1
];
}
}
void
nr_pdsch_codeword_modulation
(
uint32_t
*
in
,
uint8_t
Qm
,
uint32_t
length
,
...
...
@@ -72,7 +99,7 @@ void nr_pdsch_codeword_modulation(uint32_t *in,
b_idx
=
(
i
*
Qm
+
j
)
&
0x1f
;
if
(
i
&&
(
!
b_idx
))
in
++
;
idx
^=
(((
*
in
)
>>
b_idx
)
&
1
)
<<
(
Qm
-
j
);
idx
^=
(((
*
in
)
>>
b_idx
)
&
1
)
<<
(
Qm
-
j
-
1
);
}
out
[
i
<<
1
]
=
nr_mod_table
[(
offset
+
idx
)
<<
1
];
...
...
@@ -153,22 +180,29 @@ void nr_pdsch_layer_mapping(uint16_t **mod_symbs,
uint8_t
nr_generate_pdsch
(
NR_gNB_DLSCH_t
dlsch
,
NR_gNB_DCI_ALLOC_t
dci_alloc
,
uint32_t
*
pdsch_dmrs
,
int32_t
**
txdataF
,
int16_t
amp
,
NR_DL_FRAME_PARMS
frame_parms
,
nfapi_nr_config_request_t
config
)
{
NR_DL_gNB_HARQ_t
*
harq
=
dlsch
.
harq_processes
[
0
];
NR_DL_gNB_HARQ_t
*
harq
=
dlsch
.
harq_processes
[
dci_alloc
.
harq_pid
];
nfapi_nr_dl_config_dlsch_pdu_rel15_t
*
rel15
=
&
harq
->
dlsch_pdu
.
dlsch_pdu_rel15
;
nfapi_nr_dl_config_pdcch_parameters_rel15_t
pdcch_params
=
dci_alloc
.
pdcch_params
;
uint32_t
scrambled_output
[
NR_MAX_NB_CODEWORDS
][
NR_MAX_PDSCH_ENCODED_LENGTH
]
=
{
0
};
uint16_t
mod_symbs
[
NR_MAX_NB_CODEWORDS
][
NR_MAX_PDSCH_ENCODED_LENGTH
>>
1
]
=
{
0
};
uint16_t
tx_layers
[
NR_MAX_NB_LAYERS
][
NR_MAX_PDSCH_ENCODED_LENGTH
>>
1
];
uint16_t
n_symbs
[
NR_MAX_NB_CODEWORDS
]
=
{
0
};
int8_t
Wf
[
2
],
Wt
[
2
],
l0
[
2
],
delta
;
/// CRC, coding, interleaving and rate matching
/// scrambling
uint16_t
n_RNTI
=
(
pdcch_params
.
search_space_type
==
NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC
)
?
((
pdcch_params
.
scrambling_id
)
?
pdcch_params
.
rnti
:
0
)
:
0
;
uint16_t
Nid
=
(
pdcch_params
.
search_space_type
==
NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC
)
?
pdcch_params
.
scrambling_id
:
config
.
sch_config
.
physical_cell_id
.
value
;
for
(
int
q
=
0
;
q
<
harq
->
n_codewords
;
q
++
)
uint16_t
n_RNTI
=
(
pdcch_params
.
search_space_type
==
NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC
)
?
\
((
pdcch_params
.
scrambling_id
)
?
pdcch_params
.
rnti
:
0
)
:
0
;
uint16_t
Nid
=
(
pdcch_params
.
search_space_type
==
NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC
)
?
\
pdcch_params
.
scrambling_id
:
config
.
sch_config
.
physical_cell_id
.
value
;
for
(
int
q
=
0
;
q
<
rel15
->
nb_codewords
;
q
++
)
nr_pdsch_codeword_scrambling
(
harq
->
f
,
harq
->
TBS
,
q
,
...
...
@@ -177,7 +211,7 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch,
scrambled_output
[
q
]);
/// Modulation
for
(
int
q
=
0
;
q
<
harq
->
n
_codewords
;
q
++
)
for
(
int
q
=
0
;
q
<
rel15
->
nb
_codewords
;
q
++
)
nr_pdsch_codeword_modulation
(
scrambled_output
[
q
],
harq
->
Qm
,
harq
->
TBS
,
...
...
@@ -185,15 +219,61 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t dlsch,
/// Layer mapping
nr_pdsch_layer_mapping
(
mod_symbs
,
harq
->
n
_codewords
,
harq
->
Nl
,
rel15
->
nb
_codewords
,
rel15
->
nb_layers
,
n_symbs
,
tx_layers
);
/// Antenna port mapping -- Not yet necessary
/// Antenna port mapping
//to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007
/// DMRS QPSK modulation
uint16_t
n_dmrs
=
rel15
->
n_prb
<<
1
;
uint16_t
mod_dmrs
[
n_dmrs
<<
1
]
=
{
0
};
uint8_t
dmrs_type
=
config
.
pdsch_config
.
dmrs_type
.
value
;
nr_modulation
(
pdsch_dmrs
,
n_dmrs
,
QPSK
,
mod_dmrs
);
/// Resource mapping
AssertFatal
(
harq
->
Nl
<=
config
.
rf_config
.
tx_antenna_ports
.
value
,
"Not enough Tx antennas (%d) for %d layers
\n
"
,
\
config
.
rf_config
.
tx_antenna_ports
.
value
,
harq
->
Nl
);
// Non interleaved VRB to PRB mapping
uint8_t
start_sc
=
frame_parms
.
first_carrier_offset
+
rel15
->
start_prb
*
NR_NB_SC_PER_RB
+
\
((
pdcch_params
.
search_space_type
==
NFAPI_NR_SEARCH_SPACE_TYPE_COMMON
)
&&
(
pdcch_params
.
dci_format
==
NFAPI_NR_DL_DCI_FORMAT_1_0
))
?
\
(((
int
)
floor
(
frame_parms
.
ssb_start_subcarrier
/
NR_NB_SC_PER_RB
)
+
pdcch_params
.
rb_offset
)
*
NR_NB_SC_PER_RB
)
:
0
;
for
(
int
ap
=
0
;
ap
<
rel15
->
nb_layers
;
ap
++
)
{
// DMRS params for this ap
Wt
=
get_Wt
(
ap
,
dmrs_type
);
Wf
=
get_Wf
(
ap
,
dmrs_type
);
l0
=
get_l0
(
0
,
config
.
pdsch_config
.
dmrs_typeA_position
.
value
);
delta
=
get_delta
(
ap
,
dmrs_type
);
uint8_t
k_prime
=
0
,
n
=
0
,
dmrs_idx
=
0
;
uint16_t
m
=
0
;
for
(
int
l
=
rel15
->
S
;
l
<
rel15
->
L
;
l
++
)
for
(
int
k
=
start_sc
;
k
<
rel15
->
n_prb
*
NR_NB_SC_PER_RB
;
k
++
)
{
if
(
k
>=
frame_parms
.
ofdm_symbol_size
)
k
-=
frame_parms
.
ofdm_symbol_size
;
if
((
l
==
l0
)
&&
(
k
==
((
dmrs_type
)
?
(
6
*
n
+
k_prime
+
delta
)
:
((
n
<<
2
)
+
(
k_prime
<<
1
)
+
delta
))))
{
((
int16_t
*
)
txdataF
[
ap
])[(
l
*
frame_parms
.
ofdm_symbol_size
+
k
)
<<
1
]
=
(
Wt
*
Wf
*
amp
*
mod_dmrs
[
dmrs_idx
<<
1
])
>>
15
;
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
.
ofdm_symbol_size
+
k
)
<<
1
)
+
1
]
=
(
Wt
*
Wf
*
amp
*
mod_dmrs
[(
dmrs_idx
<<
1
)
+
1
])
>>
15
;
mod_dmrs
++
;
n
++
;
k_prime
=
(
++
k_prime
)
&
1
;
}
((
int16_t
*
)
txdataF
[
ap
])[(
l
*
frame_parms
.
ofdm_symbol_size
+
k
)
<<
1
]
=
(
amp
*
tx_layers
[
ap
][
m
<<
1
])
>>
15
;
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
.
ofdm_symbol_size
+
k
)
<<
1
)
+
1
]
=
(
amp
*
tx_layers
[
ap
][(
m
<<
1
)
+
1
])
>>
15
;
m
++
;
}
}
#ifdef DEBUG_DLSCH
write_output
(
"txdataF_dlsch.m"
,
"txdataF_dlsch"
,
txdataF
[
0
],
frame_parms
.
samples_per_frame_wCP
>>
1
,
1
,
1
);
#endif
return
0
;
}
openair1/PHY/NR_TRANSPORT/nr_dlsch.h
View file @
4e485019
...
...
@@ -35,11 +35,15 @@
extern
short
nr_mod_table
[
NR_MOD_TABLE_SIZE_SHORT
];
void
nr_get_time_domain_allocation_type
(
nfapi_nr_config_request_t
config
,
NR_gNB_DCI_ALLOC_t
dci_alloc
,
NR_gNB_DLSCH_t
*
dlsch
);
nfapi_nr_dl_config_dci_dl_pdu
dci_pdu
,
nfapi_nr_dl_config_dlsch_pdu
*
dlsch_pdu
);
void
nr_check_time_alloc
(
uint8_t
S
,
uint8_t
L
,
nfapi_nr_config_request_t
config
);
uint16_t
get_RIV
(
uint16_t
rb_start
,
uint16_t
L
,
uint16_t
N_RB
);
uint16_t
get_SLIV
(
uint8_t
S
,
uint8_t
L
);
uint8_t
nr_get_S
(
uint8_t
row_idx
,
uint8_t
CP
,
uint8_t
time_alloc_type
,
uint8_t
dmrs_typeA_position
);
void
nr_get_rbg_parms
(
NR_BWP_PARMS
*
bwp
,
uint8_t
config_type
);
...
...
@@ -52,6 +56,10 @@ uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx);
uint32_t
nr_get_code_rate
(
uint8_t
Imcs
,
uint8_t
table_idx
);
void
nr_get_tbs
(
nfapi_nr_dl_config_dlsch_pdu
*
dlsch_pdu
,
nfapi_nr_dl_config_dci_dl_pdu
dci_pdu
,
nfapi_nr_config_request_t
config
);
void
nr_pdsch_codeword_scrambling
(
uint32_t
*
in
,
uint8_t
size
,
uint8_t
q
,
...
...
openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c
View file @
4e485019
...
...
@@ -45,23 +45,26 @@ uint8_t nr_pdsch_default_time_alloc_C_L[15] = {2,2,2,2,2,4,4,4,4,4,7,12,11,6,6};
/// Time domain allocation routines
void
nr_get_time_domain_allocation_type
(
nfapi_nr_config_request_t
config
,
NR_gNB_DCI_ALLOC_t
dci_alloc
,
NR_gNB_DLSCH_t
*
dlsch
)
{
nfapi_nr_dl_config_dci_dl_pdu
dci_pdu
,
nfapi_nr_dl_config_dlsch_pdu
*
dlsch_pdu
)
{
nfapi_nr_ssb_and_cset_mux_pattern_type_e
mux_pattern
=
dci_alloc
.
pdcch_params
.
mux_pattern
;
nfapi_nr_dl_config_pdcch_parameters_rel15_t
params_rel15
=
dci_pdu
.
pdcch_params_rel15
;
uint8_t
*
alloc_type
=
&
dlsch_pdu
->
dlsch_pdu_rel15
.
time_allocation_type
;
uint8_t
mux_pattern
=
params_rel15
.
mux_pattern
;
uint8_t
alloc_list_flag
=
dlsch_pdu
->
dlsch_pdu_rel15
.
time_alloc_list_flag
;
switch
(
dci_alloc
.
pdcch_params
.
rnti_type
)
{
switch
(
params_rel15
.
rnti_type
)
{
case
NFAPI_NR_RNTI_SI
:
AssertFatal
(
dci_alloc
.
pdcch_params
.
common_search_space_type
==
NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0
,
AssertFatal
(
params_rel15
.
common_search_space_type
==
NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0
,
"Invalid common search space type %d for SI RNTI, expected %d
\n
"
,
dci_alloc
.
pdcch_params
.
common_search_space_type
,
NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0
);
params_rel15
.
common_search_space_type
,
NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_0
);
if
(
mux_pattern
==
NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1
)
AssertFatal
(
config
.
subframe_config
.
dl_cyclic_prefix_type
.
value
==
NFAPI_CP_NORMAL
,
"Invalid configuration CP extended for SI RNTI type 0 search space
\n
"
);
dlsch
->
time_
alloc_type
=
(
mux_pattern
==
NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1
)
?
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A
:
*
alloc_type
=
(
mux_pattern
==
NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE1
)
?
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A
:
(
mux_pattern
==
NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE2
)
?
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_B
:
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C
;
break
;
...
...
@@ -71,7 +74,7 @@ void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config,
/*AssertFatal(dci_alloc.pdcch_params.common_search_space_type == NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_1,
"Invalid common search space type %d for RNTI %d, expected %d\n",dci_alloc.pdcch_params.common_search_space_type,
NFAPI_NR_COMMON_SEARCH_SPACE_TYPE_1, dci_alloc.rnti_type);*/
dlsch
->
time_alloc_type
=
(
dlsch
->
time_
alloc_list_flag
)
?
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST
:
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A
;
*
alloc_type
=
(
alloc_list_flag
)
?
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST
:
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A
;
break
;
case
NFAPI_NR_RNTI_P
:
...
...
@@ -79,17 +82,17 @@ void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config,
case
NFAPI_NR_RNTI_C
:
case
NFAPI_NR_RNTI_CS
:
if
(
dci_alloc
.
pdcch_params
.
search_space_type
==
NFAPI_NR_SEARCH_SPACE_TYPE_COMMON
)
dlsch
->
time_alloc_type
=
(
dlsch
->
time_
alloc_list_flag
)
?
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST
:
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A
;
if
(
params_rel15
.
search_space_type
==
NFAPI_NR_SEARCH_SPACE_TYPE_COMMON
)
*
alloc_type
=
(
alloc_list_flag
)
?
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST
:
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A
;
else
dlsch
->
time_
alloc_type
=
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST
;
*
alloc_type
=
NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST
;
break
;
}
}
static
inline
uint16_t
get_SLIV
(
uint8_t
S
,
uint8_t
L
)
{
uint16_t
get_SLIV
(
uint8_t
S
,
uint8_t
L
)
{
return
(
(
uint16_t
)(((
L
-
1
)
<=
7
)
?
(
14
*
(
L
-
1
)
+
S
)
:
(
14
*
(
15
-
L
)
+
(
13
-
S
)))
);
}
...
...
@@ -129,11 +132,11 @@ void nr_check_time_alloc(uint8_t S, uint8_t L, nfapi_nr_config_request_t config)
switch
(
config
.
subframe_config
.
dl_cyclic_prefix_type
.
value
)
{
case
NFAPI_CP_NORMAL
:
if
(
config
.
pdsch_config
.
time_domain_alloc_
mapping_type
.
value
==
NFAPI_NR_PDSCH_MAPPING_TYPE_A
)
{
if
(
config
.
pdsch_config
.
mapping_type
.
value
==
NFAPI_NR_PDSCH_MAPPING_TYPE_A
)
{
AssertFatal
(
S
<
4
,
"Invalid value of S(%d) for mapping type A and normal CP
\n
"
,
S
);
if
(
S
==
3
)
AssertFatal
(
config
.
pdsch_config
.
dmrs_typeA_position
.
value
==
3
,
"Invalid S %d for dmrs_typeA_position %d
\n
"
,
AssertFatal
(
config
.
pdsch_config
.
mapping_type
.
value
==
3
,
"Invalid S %d for dmrs_typeA_position %d
\n
"
,
S
,
config
.
pdsch_config
.
dmrs_typeA_position
.
value
);
AssertFatal
((
L
>
2
)
&&
(
L
<
15
),
"Invalid L %d for mapping type A and normal CP
\n
"
,
L
);
...
...
@@ -150,7 +153,7 @@ void nr_check_time_alloc(uint8_t S, uint8_t L, nfapi_nr_config_request_t config)
break
;
case
NFAPI_CP_EXTENDED
:
if
(
config
.
pdsch_config
.
time_domain_alloc_
mapping_type
.
value
==
NFAPI_NR_PDSCH_MAPPING_TYPE_A
)
{
if
(
config
.
pdsch_config
.
mapping_type
.
value
==
NFAPI_NR_PDSCH_MAPPING_TYPE_A
)
{
AssertFatal
(
S
<
4
,
"Invalid value of S(%d) for mapping type A and extended CP
\n
"
,
S
);
if
(
S
==
3
)
...
...
@@ -205,7 +208,7 @@ void nr_get_rbg_list(uint32_t bitmap, uint8_t n_rbg, uint8_t* rbg_list) {
// DL alloc type 1
static
inline
uint16_t
get_RIV
(
uint16_t
rb_start
,
uint16_t
L
,
uint16_t
N_RB
)
{
uint16_t
get_RIV
(
uint16_t
rb_start
,
uint16_t
L
,
uint16_t
N_RB
)
{
if
((
L
-
1
)
<=
(
N_RB
>>
1
))
return
(
N_RB
*
(
L
-
1
)
+
rb_start
);
else
...
...
openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c
0 → 100644
View file @
4e485019
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file PHY/NR_TRANSPORT/nr_sch_dmrs.c
* \brief
* \author
* \date
* \version
* \company Eurecom
* \email:
* \note
* \warning
*/
#include "nr_sch_dmrs.h"
/*Table 7.4.1.1.2-1 and 7.4.1.1.2-2 38211 Columns: ap - CDM group - Delta - Wf(0) - Wf(1) - Wt(0) - Wt(1)*/
int8_t
pdsch_dmrs_1
[
8
][
7
]
=
{{
0
,
0
,
0
,
1
,
1
,
1
,
1
},
{
1
,
0
,
0
,
1
,
-
1
,
1
,
1
},
{
2
,
1
,
1
,
1
,
1
,,
1
,
1
},
{
3
,
1
,
1
,
1
,
-
1
,
1
,
1
},
{
4
,
0
,
0
,
1
,
1
,
1
,
-
1
},
{
5
,
0
,
0
,
1
,
-
1
,
1
,
-
1
},
{
6
,
1
,
1
,
1
,
1
,
1
,
-
1
},
{
7
,
1
,
1
,
1
,
-
1
,
1
,
-
1
}};
int8_t
pdsch_dmrs_2
[
12
][
7
]
=
{{
0
,
0
,
0
,
1
,
1
,
1
,
1
},
{
1
,
0
,
0
,
1
,
-
1
,
1
,
1
},
{
2
,
1
,
2
,
1
,
1
,
1
,
1
},
{
3
,
1
,
2
,
1
,
-
1
,
1
,
1
},
{
4
,
2
,
4
,
1
,
1
,
1
,
1
},
{
5
,
2
,
4
,
1
,
-
1
,
1
,
1
},
{
6
,
0
,
0
,
1
,
1
,
1
,
-
1
},
{
7
,
0
,
0
,
1
,
-
1
,
1
,
-
1
},
{
8
,
1
,
2
,
1
,
1
,
1
,
-
1
},
{
9
,
1
,
2
,
1
,
-
1
,
1
,
-
1
},
{
10
,
2
,
4
,
1
,
1
,
1
,
-
1
},
{
11
,
2
,
4
,
1
,
-
1
,
1
,
-
1
}};
static
inline
void
*
get_l_prime
(
uint8_t
n_symbs
)
{
uint8_t
*
l_prime
;
for
(
int
i
=
0
;
i
<
nsymbs
;
i
++
)
*
(
l_prime
+
i
)
=
i
;
return
l_prime
;
}
static
inline
void
*
get_antenna_ports
(
uint8_t
n_symbs
,
uint8_t
config
)
{
uint8_t
*
ap
;
if
(
config
==
NFAPI_NR_DMRS_TYPE1
)
for
(
int
i
=
0
;
i
<
(
4
+
4
*
(
n_symbs
-
1
);
i
++
)
*
(
ap
+
i
)
=
i
;
else
for
(
int
i
=
0
;
i
<
(
7
+
4
*
(
n_symbs
-
1
);
i
++
)
*
(
ap
+
i
)
=
i
;
return
ap
;
}
int8_t
*
get_Wt
(
uint8_t
ap
,
uint8_t
config
)
{
int8_t
*
Wt
;
for
(
int
i
=
0
;
i
<
2
;
i
++
)
*
(
Wt
+
i
)
=
(
config
==
NFAPI_NR_DMRS_TYPE1
)
?
(
pdsch_dmrs_1
[
ap
][
3
+
i
])
:
(
pdsch_dmrs_2
[
ap
][
3
+
i
]);
return
Wt
;
}
int8_t
*
get_Wf
(
uint8_t
ap
,
uint8_t
config
)
{
int8_t
*
Wf
;
for
(
int
i
=
0
;
i
<
2
;
i
++
)
*
(
Wf
+
i
)
=
(
config
==
NFAPI_NR_DMRS_TYPE1
)
?
(
pdsch_dmrs_1
[
ap
][
5
+
i
])
:
(
pdsch_dmrs_2
[
ap
][
5
+
i
]);
return
Wf
;
}
uint8_t
get_delta
(
uint8_t
ap
,
uint8_t
config
)
{
return
((
config
==
NFAPI_NR_DMRS_TYPE1
)
?
(
pdsch_dmrs_1
[
ap
][
2
])
:
(
pdsch_dmrs_2
[
ap
][
2
]));
}
uint8_t
*
get_l0
(
uint8_t
config
,
uint8_t
dmrs_typeA_position
)
{
return
((
config
==
NFAPI_NR_DMRS_TYPE1
)
?
dmrs_typeA_position
:
0
);
}
openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h
0 → 100644
View file @
4e485019
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file PHY/NR_TRANSPORT/nr_sch_dmrs.c
* \brief
* \author
* \date
* \version
* \company Eurecom
* \email:
* \note
* \warning
*/
#include "PHY/defs_gNB.h"
#define NR_PDSCH_DMRS_ANTENNA_PORT0 1000
#define NR_PDSCH_DMRS_NB_ANTENNA_PORTS 12
int8_t
*
get_Wt
(
uint8_t
ap
,
uint8_t
config
);
int8_t
*
get_Wf
(
uint8_t
ap
,
uint8_t
config
);
uint8_t
get_delta
(
uint8_t
ap
,
uint8_t
config
);
uint8_t
*
get_l0
(
uint8_t
config
,
uint8_t
dmrs_typeA_position
);
openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c
View file @
4e485019
...
...
@@ -87,13 +87,72 @@ static inline uint8_t is_codeword_disabled(uint8_t format, uint8_t Imcs, uint8_t
return
((
format
==
NFAPI_NR_DL_DCI_FORMAT_1_1
)
&&
(
Imcs
==
26
)
&&
(
rv
==
1
));
}
/*uint16_t nr_get_tbs(NR_gNB_DCI_ALLOC_t dci_alloc, nfapi_nr_config_request_t config) {
void
nr_get_tbs
(
NR_gNB_DLSCH_t
*
dlsch
,
nfapi_nr_dl_config_dci_dl_pdu
dci_pdu
,
nfapi_nr_config_request_t
config
)
{
uint8_t
N_PRB_DMRS
=
2
;
// tmp hardcoding
uint8_t rnti_type = dci_alloc.pdcch_params.rnti_type;
nfapi_nr_dl_config_dlsch_pdu_rel15_t
*
dlsch_rel15
=
&
dlsch
->
dlsch_pdu
.
dlsch_pdu_rel15
;
nfapi_nr_dl_config_pdcch_parameters_rel15_t
params_rel15
=
dci_pdu
.
pdcch_params_rel15
;
NR_DL_gNB_HARQ_t
*
harq
=
dlsch
->
harq_processes
[
dlsch_rel15
->
harq_pid
];
uint8_t
rnti_type
=
params_rel15
.
rnti_type
;
uint8_t
dci_format
=
params_rel15
.
dci_format
;
uint8_t
ss_type
=
params_rel15
.
search_space_type
;
uint8_t
N_PRB_oh
=
((
rnti_type
==
NFAPI_NR_RNTI_SI
)
||
(
rnti_type
==
NFAPI_NR_RNTI_RA
)
||
(
rnti_type
==
NFAPI_NR_RNTI_P
))
?
0
:
\
(config.pdsch_config.);
(
config
.
pdsch_config
.
x_overhead
.
value
);
uint8_t
mcs_table
=
config
.
pdsch_config
.
mcs_table
.
value
;
uint8_t
N_sh_symb
=
dlsch_rel15
->
L
;
uint8_t
Imcs
=
dlsch_rel15
->
Imcs
;
uint16_t
N_prime_RE
=
NR_NB_SC_PER_RB
*
N_sh_symb
-
N_PRB_DMRS
-
N_PRB_oh
;
LOG_I
(
MAC
,
"N_prime_RE %d for %d symbols %d DMRS per PRB and %d overhead
\n
"
,
N_prime_RE
,
N_sh_symb
,
N_PRB_DMRS
,
N_PRB_oh
);
}*/
uint16_t
N_RE
,
N_info
,
N_info_prime
;
uint8_t
table_idx
,
R
,
Qm
,
n
;
float
tmp
,
C
;
// temporary N_info_prime in float to avoid back and forth casting to int
N_RE
=
min
(
156
,
N_RE
)
*
dlsch_rel15
->
n_prb
;
if
((
mcs_table
==
NFAPI_NR_MCS_TABLE_QAM256
)
&&
(
dci_format
==
NFAPI_NR_DL_DCI_FORMAT_1_1
)
&&
((
rnti_type
==
NFAPI_NR_RNTI_C
)
||
(
rnti_type
==
NFAPI_NR_RNTI_CS
)))
table_idx
=
2
;
else
if
((
mcs_table
==
NFAPI_NR_MCS_TABLE_QAM64_LOW_SE
)
&&
(
rnti_type
!=
NFAPI_NR_RNTI_new
)
&&
(
rnti_type
==
NFAPI_NR_RNTI_C
)
&&
(
ss_type
==
NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC
))
table_idx
=
3
;
else
if
(
rnti_type
==
NFAPI_NR_RNTI_new
)
table_idx
=
3
;
else
if
((
mcs_table
==
NFAPI_NR_MCS_TABLE_QAM256
)
&&
(
rnti_type
==
NFAPI_NR_RNTI_CS
)
&&
(
dci_format
==
NFAPI_NR_DL_DCI_FORMAT_1_1
))
table_idx
=
2
;
// Condition mcs_table not configured in sps_config necessary here but not yet implemented
/*else if((mcs_table == NFAPI_NR_MCS_TABLE_QAM64_LOW_SE) && (rnti_type==NFAPI_NR_RNTI_CS))
* table_idx = 3;
* Note: the commented block refers to the case where the mcs_table is from sps_config*/
else
table_idx
=
1
;
R
=
nr_get_code_rate
(
Imcs
,
table_idx
);
Qm
=
nr_get_Qm
(
Imcs
,
table_idx
);
N_info
=
N_RE
*
R
*
Qm
*
harq
->
Nl
;
if
(
N_info
<=
3824
)
{
n
=
max
(
3
,
(
uint8_t
)(
floor
(
log2
(
N_info
)
-
6
)));
N_info_prime
=
max
(
24
,
(
N_info
>>
n
)
<<
n
);
for
(
int
i
=
0
;
i
<
93
;
i
++
)
if
(
nr_tbs_table
[
i
]
>=
N_info_prime
)
{
harq
->
TBS
=
nr_tbs_table
[
i
];
break
;
}
}
else
{
n
=
(
uint8_t
)
floor
(
log2
(
N_info
)
-
24
)
-
5
;
tmp
=
max
(
3840
,
((
uint16_t
)
round
(((
float
)
N_info
-
24
)
/
(
1
<<
n
)))
<<
n
);
if
(
R
<
0
.
25
)
{
C
=
ceil
((
tmp
+
24
)
/
3816
);
harq
->
TBS
=
((
uint16_t
)(
C
*
ceil
((
tmp
+
24
)
/
(
8
*
C
))))
<<
3
;
}
else
{
if
(
tmp
>
8424
)
{
C
=
ceil
((
tmp
+
24
)
/
8424
);
harq
->
TBS
=
((
uint16_t
)(
C
*
ceil
((
tmp
+
24
)
/
(
8
*
C
))))
<<
3
;
}
else
harq
->
TBS
=
((
uint16_t
)
ceil
((
tmp
+
24
)
/
8
)
-
24
)
<<
3
;
}
}
}
openair1/PHY/defs_gNB.h
View file @
4e485019
...
...
@@ -51,6 +51,8 @@ typedef struct {
uint16_t
size
;
/// Aggregation level
uint8_t
L
;
/// HARQ PID
uint8_t
harq_pid
;
/// PDCCH parameters
nfapi_nr_dl_config_pdcch_parameters_rel15_t
pdcch_params
;
/// CCE list
...
...
@@ -66,8 +68,8 @@ typedef struct {
typedef
struct
{
///
Status Flag indicating for this DLSCH (idle,active,disabled)
//SCH_status_t status
;
///
Nfapi DLSCH PDU
nfapi_nr_dl_config_dlsch_pdu
dlsch_pdu
;
/// Transport block size
uint32_t
TBS
;
/// pointer to pdu from MAC interface (this is "a" in 36.212)
...
...
@@ -133,7 +135,6 @@ typedef struct {
/// codeword this transport block is mapped to
uint8_t
codeword
;
/// Number of codewords
uint8_t
n_codewords
;
}
NR_DL_gNB_HARQ_t
;
...
...
@@ -141,18 +142,6 @@ typedef struct {
/// Pointers to 16 HARQ processes for the DLSCH
NR_DL_gNB_HARQ_t
*
harq_processes
[
16
];
nfapi_nr_pdsch_time_domain_alloc_type_e
time_alloc_type
;
uint8_t
time_alloc_list_flag
;
uint8_t
rbg_list
[
NR_MAX_NB_RBG
];
/// Time domain allocation
uint8_t
S
;
uint8_t
L
;
/// Freq domain allocation
uint16_t
rb_start
;
uint16_t
n_rb
;
/// BWP index
uint8_t
bwp_idx
;
/// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding)
int32_t
*
txdataF
[
8
];
/// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers?
...
...
openair1/PHY/defs_nr_common.h
View file @
4e485019
...
...
@@ -86,6 +86,8 @@
#define NR_MAX_NB_RBG 18
#define NR_MAX_NB_LAYERS 8
#define NR_MAX_NB_CODEWORDS 2
#define NR_MAX_PDSCH_ENCODED_LENGTH 1000 //random
typedef
enum
{
NR_MU_0
=
0
,
...
...
@@ -116,6 +118,14 @@ typedef enum {
nr_FR2
}
nr_frequency_range_e
;
typedef
enum
{
BPSK
=
0
,
QPSK
,
QAM16
,
QAM64
,
QAM256
}
nr_mod_t
;
typedef
struct
{
/// Size of first RBG
uint8_t
start_size
;
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
View file @
4e485019
...
...
@@ -30,11 +30,13 @@
#include "nr_mac_gNB.h"
#include "SCHED_NR/sched_nr.h"
#include "PHY/NR_TRANSPORT/nr_dlsch.h"
#include "PHY/NR_TRANSPORT/nr_dci.h"
extern
RAN_CONTEXT_t
RC
;
/*Scheduling of DLSCH with associated DCI in common search space
* current version has only a DCI for type 1 PDCCH for
RA-
RNTI*/
* current version has only a DCI for type 1 PDCCH for
C_
RNTI*/
void
nr_schedule_css_dlsch_phytest
(
module_id_t
module_idP
,
frame_t
frameP
,
sub_frame_t
subframeP
)
...
...
@@ -63,6 +65,12 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP,
nfapi_nr_dl_config_dci_dl_pdu_rel15_t
*
pdu_rel15
=
&
dl_config_pdu
->
dci_dl_pdu
.
dci_dl_pdu_rel15
;
nfapi_nr_dl_config_pdcch_parameters_rel15_t
*
params_rel15
=
&
dl_config_pdu
->
dci_dl_pdu
.
pdcch_params_rel15
;
nfapi_nr_dl_config_dlsch_pdu_rel15_t
*
dlsch_pdu_rel15
=
&
dl_config_pdu
->
dlsch_pdu
.
dlsch_pdu_rel15
;
dlsch_pdu_rel15
->
start_prb
=
0
;
dlsch_pdu_rel15
->
n_prb
=
40
;
dlsch_pdu_rel15
->
S
=
8
;
dlsch_pdu_rel15
->
L
=
6
;
nr_configure_css_dci_from_mib
(
&
gNB
->
pdcch_type0_params
,
kHz30
,
kHz30
,
nr_FR1
,
0
,
0
,
...
...
@@ -70,8 +78,8 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP,
cfg
->
rf_config
.
dl_channel_bandwidth
.
value
);
memcpy
((
void
*
)
params_rel15
,
(
void
*
)
&
gNB
->
pdcch_type0_params
,
sizeof
(
nfapi_nr_dl_config_pdcch_parameters_rel15_t
));
pdu_rel15
->
frequency_domain_assignment
=
get_RIV
(
0
,
40
,
106
);
pdu_rel15
->
time_domain_assignment
=
get_SLIV
(
8
,
14
);
pdu_rel15
->
frequency_domain_assignment
=
get_RIV
(
dlsch_pdu_rel15
->
start_prb
,
dlsch_pdu_rel15
->
n_prb
,
cfg
->
rf_config
.
dl_channel_bandwidth
.
value
);
pdu_rel15
->
time_domain_assignment
=
get_SLIV
(
dlsch_pdu_rel15
->
S
,
dlsch_pdu_rel15
->
L
);
pdu_rel15
->
vrb_to_prb_mapping
=
1
;
pdu_rel15
->
mcs
=
12
;
pdu_rel15
->
tb_scaling
=
1
;
...
...
@@ -92,10 +100,6 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP,
pdu_rel15
->
tb_scaling
=
1
;
pdu_rel15
->
tb_scaling
=
1
;
pdu_rel15
->
tb_scaling
=
1
;
pdu_rel15
->
tb_scaling
=
1
;
LOG_I
(
MAC
,
"[gNB scheduler phytest] DCI type 1 payload: freq_alloc %d, time_alloc %d, vrb to prb %d, mcs %d tb_scaling %d
\n
"
,
pdu_rel15
->
frequency_domain_assignment
,
...
...
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