From 8de13fab97e7c2132ddb22451e3d026377f40e7e Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Fri, 15 Aug 2025 23:56:39 -0400 Subject: [PATCH] Simplify code --- openair1/PHY/NR_REFSIG/dmrs_nr.c | 4 + openair1/PHY/NR_REFSIG/dmrs_nr.h | 2 + openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 145 +++++++------------- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 8 +- 4 files changed, 53 insertions(+), 106 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.c b/openair1/PHY/NR_REFSIG/dmrs_nr.c index a5a55d685a..7dba224cdb 100644 --- a/openair1/PHY/NR_REFSIG/dmrs_nr.c +++ b/openair1/PHY/NR_REFSIG/dmrs_nr.c @@ -306,6 +306,10 @@ int8_t get_next_dmrs_symbol_in_slot(uint16_t ul_dmrs_symb_pos, uint8_t counter, return -1; } +int8_t get_num_dmrs_re_per_rb(const uint8_t dmrs_type, const uint8_t num_cdm_grp_no_data) +{ + return (dmrs_type == NFAPI_NR_DMRS_TYPE1 ? 6 * num_cdm_grp_no_data : 4 * num_cdm_grp_no_data); +} /* return the position of valid dmrs symbol in a slot for channel compensation */ int8_t get_valid_dmrs_idx_for_channel_est(uint16_t dmrs_symb_pos, uint8_t counter) diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.h b/openair1/PHY/NR_REFSIG/dmrs_nr.h index 97d61993ce..5f17478874 100644 --- a/openair1/PHY/NR_REFSIG/dmrs_nr.h +++ b/openair1/PHY/NR_REFSIG/dmrs_nr.h @@ -71,6 +71,8 @@ void nr_chest_time_domain_avg(NR_DL_FRAME_PARMS *frame_parms, uint16_t dmrs_bitmap, uint16_t num_rbs); +int8_t get_num_dmrs_re_per_rb(const uint8_t dmrs_type, const uint8_t num_cdm_grp_no_data); + static inline uint8_t is_dmrs_symbol(uint8_t l, uint16_t dmrsSymbMask) { DevAssert(l < 32); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index 08cc881180..d48109440d 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -89,28 +89,17 @@ static void nr_pusch_codeword_scrambling_uci(uint8_t *in, out[i] = in_words[i] ^ seq[i]; } + // According to 38.211 6.3.1.1 for (uint32_t i = 0; i < size; i++) { - if (template[i] == BIT_TYPE_ACK) { - // Step 2: Overwrite/Correct positions for ACK-only bits when O_ACK > 2 + if (template[i] == BIT_TYPE_ACK_ULSCH) { + // Step 2: Overwrite/Correct positions for UCI bits including placeholders X, Y when O_ACK <= 2 uint32_t pos = i; uint32_t idx = pos / 32; uint32_t b_idx = pos % 32; - // Clear the bit that was set by the initial general scrambling - out[idx] &= ~(1U << b_idx); - - uint32_t ack_bit_value = in[pos] & 1; - uint32_t scrambling_bit_for_ack = (seq[idx] >> b_idx) & 1; - out[idx] |= ((ack_bit_value ^ scrambling_bit_for_ack) << b_idx); - } else if (template[i] == BIT_TYPE_ACK_ULSCH) { - // Step 3: Overwrite/Correct positions for UCI bits including placeholders X, Y when O_ACK <= 2 - uint32_t pos = i; - uint32_t idx = pos / 32; - uint32_t b_idx = pos % 32; - - out[idx] &= ~(1U << b_idx); - if (in[pos] == NR_PUSCH_y) { + // Clear bit + out[idx] &= ~(1U << b_idx); if (b_idx > 0) { // Y depends on the final value of the previous bit in the same word. // This previous bit could be an ACK (already corrected) or ULSCH (from initial scramble). @@ -121,10 +110,6 @@ static void nr_pusch_codeword_scrambling_uci(uint8_t *in, } } else if (in[pos] == NR_PUSCH_x) { out[idx] |= (1U << b_idx); - } else { - uint32_t ack_bit_value = in[pos] & 1; - uint32_t scrambling_bit_for_ack = (seq[idx] >> b_idx) & 1; - out[idx] |= ((ack_bit_value ^ scrambling_bit_for_ack) << b_idx); } } } @@ -139,8 +124,10 @@ void nr_pusch_codeword_scrambling(uint8_t *in, uint32_t *out) { if (uci_on_pusch) + // in buffer is in byte-packed format nr_pusch_codeword_scrambling_uci(in, size, Nid, n_RNTI, template, out); else + // in buffer is in bit-packed format nr_codeword_scrambling(in, size, 0, Nid, n_RNTI, out); } @@ -701,62 +688,31 @@ static rate_match_info_uci_t calc_rate_match_info_uci(const nfapi_nr_ue_pusch_pd static int initialize_mapping_resources(const nfapi_nr_ue_pusch_pdu_t *pusch_pdu, uint32_t *m_ulsch_initial, - uint32_t *m_ulsch_current, - uint32_t *m_uci_current, - bool *is_dmrs_symbol_flags, - uint8_t *dmrs_symbol_set_relative, - uint8_t *num_dmrs_symbols_in_set_relative) + uint32_t *m_uci_current) { - if (!pusch_pdu || !m_ulsch_initial || !m_ulsch_current || !m_uci_current || !is_dmrs_symbol_flags || !dmrs_symbol_set_relative - || !num_dmrs_symbols_in_set_relative) + if (!pusch_pdu || !m_ulsch_initial || !m_uci_current) return -1; - uint8_t n_pusch_sym_all = pusch_pdu->nr_of_symbols; - uint16_t ul_dmrs_symb_pos = pusch_pdu->ul_dmrs_symb_pos; - uint8_t dmrs_type = pusch_pdu->dmrs_config_type; - uint8_t cdm_grps_no_data = pusch_pdu->num_dmrs_cdm_grps_no_data; - uint32_t res_per_symbol_non_dmrs = pusch_pdu->rb_size * 12; - - *num_dmrs_symbols_in_set_relative = 0; + const uint8_t n_pusch_sym_all = pusch_pdu->nr_of_symbols; + const uint16_t ul_dmrs_symb_pos = pusch_pdu->ul_dmrs_symb_pos; + const uint8_t dmrs_type = pusch_pdu->dmrs_config_type; + const uint8_t cdm_grps_no_data = pusch_pdu->num_dmrs_cdm_grps_no_data; + const uint32_t res_per_symbol_non_dmrs = pusch_pdu->rb_size * NR_NB_SC_PER_RB; + const uint32_t data_re_on_dmrs_sym_per_prb = NR_NB_SC_PER_RB - get_num_dmrs_re_per_rb(dmrs_type, cdm_grps_no_data); // Initialize resources per symbol for ULSCH and UCI for (uint8_t i = 0; i < n_pusch_sym_all; i++) { uint8_t absolute_symbol_idx = pusch_pdu->start_symbol_index + i; if ((ul_dmrs_symb_pos >> absolute_symbol_idx) & 0x01) { - is_dmrs_symbol_flags[i] = true; - if (*num_dmrs_symbols_in_set_relative < 14) { - dmrs_symbol_set_relative[(*num_dmrs_symbols_in_set_relative)++] = i; - } - // Calculate available data REs on DMRS symbols based on DMRS configuration - uint32_t data_re_on_dmrs_sym_per_prb = 0; - - if (dmrs_type == 0) { // Type 1 - if (cdm_grps_no_data == 1) { - data_re_on_dmrs_sym_per_prb = 6; - } else { - data_re_on_dmrs_sym_per_prb = 0; - } - } else { // Type 2 - if (cdm_grps_no_data == 1) { - data_re_on_dmrs_sym_per_prb = 4; - } else if (cdm_grps_no_data == 2) { - data_re_on_dmrs_sym_per_prb = 2; - } else { - data_re_on_dmrs_sym_per_prb = 0; - } - } m_ulsch_initial[i] = pusch_pdu->rb_size * data_re_on_dmrs_sym_per_prb; - m_ulsch_current[i] = m_ulsch_initial[i]; m_uci_current[i] = 0; // UCI is not mapped on DMRS symbols } else { // Not a DMRS symbol - is_dmrs_symbol_flags[i] = false; m_ulsch_initial[i] = res_per_symbol_non_dmrs; - m_ulsch_current[i] = res_per_symbol_non_dmrs; m_uci_current[i] = res_per_symbol_non_dmrs; } } @@ -764,35 +720,31 @@ static int initialize_mapping_resources(const nfapi_nr_ue_pusch_pdu_t *pusch_pdu return 0; } -static uint8_t find_first_uci_symbol(uint8_t n_pusch_sym_all, - const bool *is_dmrs_symbol_flags, - uint8_t *dmrs_symbol_set_relative, - uint32_t num_dmrs_symbols_in_set_relative) +static void get_first_uci_symbol(const uint8_t start_symbol, + const uint8_t num_symbols, + const uint16_t dmrs_map, + uint8_t *first_non_dmrs_sym, + uint8_t *dmrs_p1) { - uint8_t l1_c = 0; - - // Find first non-DMRS symbol - for (uint8_t i = 0; i < n_pusch_sym_all; i++) { - if (!is_dmrs_symbol_flags[i]) { - l1_c = i; + // First non-DMRS symbol + const uint16_t last_sym = start_symbol + num_symbols; + for (uint_fast8_t s = start_symbol; s < last_sym; s++) { + if (!is_dmrs_symbol(s, dmrs_map)) { + *first_non_dmrs_sym = s; break; } } - // If there are DMRS symbols, try to find a symbol after the first DMRS - if (num_dmrs_symbols_in_set_relative > 0) { - uint8_t first_dmrs_idx = dmrs_symbol_set_relative[0]; - if (l1_c <= first_dmrs_idx) { - for (uint8_t i = first_dmrs_idx + 1; i < n_pusch_sym_all; i++) { - if (!is_dmrs_symbol_flags[i]) { - l1_c = i; - break; - } - } - } + // Symbol after first consequtive DMRS symbol + const uint8_t first_dmrs_sym = get_next_dmrs_symbol_in_slot(dmrs_map, start_symbol, last_sym); + *dmrs_p1 = first_dmrs_sym + 1; + while (is_dmrs_symbol(*dmrs_p1, dmrs_map) && *dmrs_p1 < last_sym) { + (*dmrs_p1)++; } - return l1_c; + // Return relative symbol idx + *first_non_dmrs_sym -= start_symbol; + *dmrs_p1 -= start_symbol; } /* @@ -1013,34 +965,29 @@ static uci_on_pusch_bit_type_t *nr_data_control_mapping(const nfapi_nr_ue_pusch_ if (!pusch_pdu || !codeword || codeword_len == 0 || !template) return NULL; const uint8_t n_symbols = pusch_pdu->nr_of_symbols; - if (n_symbols == 0 || n_symbols > 14) + if (n_symbols == 0 || n_symbols > NR_NUMBER_OF_SYMBOLS_PER_SLOT) return NULL; - uint32_t m_ulsch_initial[14] = {0}; - uint32_t m_ulsch_current[14] = {0}; - uint32_t m_uci_current[14] = {0}; // This holds RE counts, not bit counts - bool is_dmrs_symbol_flags[14] = {0}; - uint8_t dmrs_symbol_set_relative[14] = {0}; - uint8_t num_dmrs_symbols_in_set_relative = 0; + uint32_t m_ulsch_initial[NR_NUMBER_OF_SYMBOLS_PER_SLOT] = {0}; + uint32_t m_uci_current[NR_NUMBER_OF_SYMBOLS_PER_SLOT] = {0}; // This holds RE counts, not bit counts - if (initialize_mapping_resources(pusch_pdu, - m_ulsch_initial, - m_ulsch_current, - m_uci_current, - is_dmrs_symbol_flags, - dmrs_symbol_set_relative, - &num_dmrs_symbols_in_set_relative) - != 0) { + if (initialize_mapping_resources(pusch_pdu, m_ulsch_initial, m_uci_current) != 0) { LOG_E(PHY, "Failed to initialize mapping resources\n"); return NULL; } - uint8_t l1_c = find_first_uci_symbol(n_symbols, is_dmrs_symbol_flags, dmrs_symbol_set_relative, num_dmrs_symbols_in_set_relative); + uint8_t first_non_dmrs_sym = 0; + uint8_t l1_c = 0; + get_first_uci_symbol(pusch_pdu->start_symbol_index, + pusch_pdu->nr_of_symbols, + pusch_pdu->ul_dmrs_symb_pos, + &first_non_dmrs_sym, + &l1_c); memset(template, 0, codeword_len * sizeof(uci_on_pusch_bit_type_t)); - uint32_t positions_by_sym[14][MAX_UCI_CODED_BITS] = {0}; - uint32_t count_by_sym[14] = {0}; + uint32_t positions_by_sym[NR_NUMBER_OF_SYMBOLS_PER_SLOT][MAX_UCI_CODED_BITS] = {0}; + uint32_t count_by_sym[NR_NUMBER_OF_SYMBOLS_PER_SLOT] = {0}; if (G_ack_rvd > 0) { build_template_reserve_ack(template, diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index ce398d9a7a..75f73b0e8c 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1214,13 +1214,7 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_ } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDSCH, VCD_FUNCTION_OUT); - uint8_t nb_re_dmrs; - if (dlsch_config->dmrsConfigType == NFAPI_NR_DMRS_TYPE1) { - nb_re_dmrs = 6 * dlsch_config->n_dmrs_cdm_groups; - } - else { - nb_re_dmrs = 4 * dlsch_config->n_dmrs_cdm_groups; - } + const uint8_t nb_re_dmrs = get_num_dmrs_re_per_rb(dlsch_config->dmrsConfigType, dlsch_config->n_dmrs_cdm_groups); uint16_t dmrs_len = get_num_dmrs(dlsch_config->dlDmrsSymbPos); uint32_t unav_res = 0; if(dlsch_config->pduBitmap & 0x1) {