diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 9bc2436267..06e121608b 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1292,6 +1292,8 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pbch.c ${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_REFSIG/nr_gold.c ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h index 5b687e46e6..7351bfb89a 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -171,9 +171,9 @@ typedef struct { } nfapi_nr_rach_config_t; typedef struct { - nfapi_uint16_tlv_t dmrs_TypeA_Position; ///// Position of (first) DL DM-RS - nfapi_uint16_tlv_t TimeDomainResourceAllocation_k0; ///// L1 parameter 'K0' - nfapi_uint16_tlv_t TimeDomainResourceAllocation_mappingType; ///// L1 parameter 'Mapping-type' + nfapi_uint16_tlv_t dmrs_typeA_position; ///// Position of (first) DL DM-RS + nfapi_uint16_tlv_t time_domain_alloc_k0; ///// L1 parameter 'K0' + nfapi_uint16_tlv_t time_domain_alloc_mapping_type; ///// L1 parameter 'Mapping-type' } nfapi_nr_pdsch_config_t; typedef struct { @@ -309,9 +309,15 @@ typedef enum { typedef enum { NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A=0, NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_B, - NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C + NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C, + NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST } nfapi_nr_pdsch_time_domain_alloc_type_e; +typedef enum { + NFAPI_NR_PDSCH_MAPPING_TYPE_A=0, + NFAPI_NR_PDSCH_MAPPING_TYPE_B +} nfapi_nr_pdsch_mapping_type_e; + // P7 Sub Structures typedef struct { diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 1125a33c1a..def83c047b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -33,3 +33,10 @@ #include "PHY/defs_gNB.h" +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); + +void nr_check_time_alloc(uint8_t S, uint8_t L, nfapi_nr_config_request_t config); + +uint8_t nr_get_S(uint8_t row_idx, uint8_t CP, uint8_t time_alloc_type, uint8_t dmrs_mapping_type); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c index 0e143db019..90d023b541 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c @@ -32,21 +32,35 @@ #include "nr_dlsch.h" +uint8_t nr_pdsch_default_time_alloc_A_S_nCP[23] = {2,3,2,3,2,3,2,3,2,3,9,10,4,6,5,5,9,12,1,1,2,4,8}; +uint8_t nr_pdsch_default_time_alloc_A_L_nCP[23] = {12,11,10,9,9,8,7,6,5,4,4,4,4,4,7,2,2,2,13,6,4,7,4}; +uint8_t nr_pdsch_default_time_alloc_A_S_eCP[23] = {2,3,2,3,2,3,2,3,2,3,6,8,4,6,5,5,9,10,1,1,2,4,8}; +uint8_t nr_pdsch_default_time_alloc_A_L_eCP[23] = {6,5,10,9,9,8,7,6,5,4,4,2,4,4,6,2,2,2,11,6,4,6,4}; +uint8_t nr_pdsch_default_time_alloc_B_S[16] = {2,4,6,8,10,2,4,2,4,6,8,10,2,2,3,2}; +uint8_t nr_pdsch_default_time_alloc_B_L[16] = {2,2,2,2,2,2,2,4,4,4,4,4,7,12,11,4}; +uint8_t nr_pdsch_default_time_alloc_C_S[15] = {2,4,6,8,10,2,4,6,8,10,2,2,3,0,2}; +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}; + 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_ssb_and_cset_mux_pattern_type_e mux_pattern = dci_alloc.mux_pattern; + nfapi_nr_ssb_and_cset_mux_pattern_type_e mux_pattern = dci_alloc.pdcch_params.mux_pattern; - switch(dci_alloc.rnti_type) { + switch(dci_alloc.pdcch_params.rnti_type) { case NFAPI_NR_RNTI_SI: AssertFatal(dci_alloc.pdcch_params.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); + + 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 : (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE2)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_B : - (mux_pattern == NFAPI_NR_SSB_AND_CSET_MUX_PATTERN_TYPE3)?NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C; + NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C; break; case NFAPI_NR_RNTI_RA: @@ -54,8 +68,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);*/ - if (!dlsch->time_alloc_list_flag) - dlsch->time_alloc_type = NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A; + 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; break; case NFAPI_NR_RNTI_P: @@ -63,12 +76,96 @@ void nr_get_time_domain_allocation_type(nfapi_nr_config_request_t config, case NFAPI_NR_RNTI_C: case NFAPI_NR_RNTI_CS: - if () + 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; + else + dlsch->time_alloc_type = NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_ALLOC_LIST; + break; - case + } +} +static inline 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))) ); +} +static inline uint8_t get_K0(uint8_t row_idx, uint8_t time_alloc_type) { + return ( (time_alloc_type == NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A)|| + (time_alloc_type == NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C)? 0 : + ((row_idx==6)||(row_idx==7)||(row_idx==15))? 1 : 0); +} + +/*ideally combine the calculation of L in the same function once the right struct is defined*/ +uint8_t nr_get_S(uint8_t row_idx, uint8_t CP, uint8_t time_alloc_type, uint8_t dmrs_typeA_position) { + + uint8_t idx, S; + + switch(time_alloc_type) { + case NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_A: + idx = (row_idx>7)? (row_idx+6) : (((row_idx-1)<<1)-1+((dmrs_typeA_position==2)?0:1)); + return ((CP==NFAPI_CP_NORMAL)?nr_pdsch_default_time_alloc_A_S_nCP[idx] : nr_pdsch_default_time_alloc_A_S_eCP[idx]); + break; + + case NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_B: + idx = (row_idx<14)? (row_idx-1) : (row_idx == 14)? row_idx-1+((dmrs_typeA_position==2)?0:1) : 15; + return (nr_pdsch_default_time_alloc_B_S[idx]); + break; + + case NFAPI_NR_PDSCH_TIME_DOMAIN_ALLOC_TYPE_DEFAULT_C: + AssertFatal((row_idx!=6)&&(row_idx!=7)&&(row_idx<17), "Invalid row index %d in %s %s\n", row_idx, __FUNCTION__, __FILE__); + idx = (row_idx<6)? (row_idx-1) : (row_idx<14)? (row_idx-3) : (row_idx == 14)? row_idx-3+((dmrs_typeA_position==2)?0:1) : (row_idx-2); + break; + + default: + AssertFatal(0, "Invalid Time domain allocation type %d in %s %s\n", time_alloc_type, __FUNCTION__, __FILE__); + } +} + +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) { + 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", + S, config.pdsch_config.dmrs_typeA_position); + + AssertFatal((L>2)&&(L<15), "Invalid L %d for mapping type A and normal CP\n", L); + + AssertFatal(((S+L)>2)&&((S+L)<15), "Invalid S+L %d for mapping type A and normal CP\n", S+L); + } + else { + AssertFatal(S<13, "Invalid value of S(%d) for mapping type B and normal CP\n", S); + + AssertFatal((L>1)&&(L<8), "Invalid L %d for mapping type B and normal CP\n", L); + + AssertFatal(((S+L)>1)&&((S+L)<15), "Invalid S+L %d for mapping type B and normal CP\n", S+L); + } + break; + + case NFAPI_CP_EXTENDED: + if (config.pdsch_config.time_domain_alloc_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) + AssertFatal(config.pdsch_config.dmrs_typeA_position.value == 3, "Invalid S %d for dmrs_typeA_position %d\n", + S, config.pdsch_config.dmrs_typeA_position); + + AssertFatal((L>2)&&(L<13), "Invalid L %d for mapping type A and extended CP\n", L); + + AssertFatal(((S+L)>2)&&((S+L)<13), "Invalid S+L %d for mapping type A and extended CP\n", S+L); + } + else { + AssertFatal(S<11, "Invalid value of S(%d) for mapping type B and extended CP\n", S); + + AssertFatal((L>1)&&(L<7), "Invalid L %d for mapping type B and extended CP\n", L); + + AssertFatal(((S+L)>1)&&((S+L)<13), "Invalid S+L %d for mapping type B and extended CP\n", S+L); + } + break; } }