Simplify code

This commit is contained in:
Sakthivel Velumani
2025-09-30 00:23:00 +08:00
committed by alexjiao
parent ac76c6e27a
commit 8de13fab97
4 changed files with 53 additions and 106 deletions
+4
View File
@@ -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)
+2
View File
@@ -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);
+46 -99
View File
@@ -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,
+1 -7
View File
@@ -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) {