CCE-to-REG mapping extended for 2 or more DCI symbols
This commit is contained in:
@@ -182,62 +182,64 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*Mapping the encoded DCI along with the DMRS */
|
/*Mapping the encoded DCI along with the DMRS */
|
||||||
for (int cce_count = 0; cce_count < dci_pdu->AggregationLevel; cce_count ++) {
|
for(int symbol = 0; symbol < pdcch_pdu_rel15->DurationSymbols; symbol++) {
|
||||||
|
for (int cce_count = 0; cce_count < dci_pdu->AggregationLevel; cce_count+=pdcch_pdu_rel15->DurationSymbols) {
|
||||||
|
|
||||||
int8_t cce_idx = reg_list_order[cce_count];
|
int8_t cce_idx = reg_list_order[cce_count];
|
||||||
|
|
||||||
for (int reg_in_cce_idx = 0; reg_in_cce_idx < NR_NB_REG_PER_CCE; reg_in_cce_idx++) {
|
for (int reg_in_cce_idx = 0; reg_in_cce_idx < NR_NB_REG_PER_CCE; reg_in_cce_idx++) {
|
||||||
|
|
||||||
k = cset_start_sc + gNB->cce_list[d][cce_idx].reg_list[reg_in_cce_idx].start_sc_idx;
|
k = cset_start_sc + gNB->cce_list[d][cce_idx].reg_list[reg_in_cce_idx].start_sc_idx;
|
||||||
|
|
||||||
if (k >= frame_parms.ofdm_symbol_size)
|
|
||||||
k -= frame_parms.ofdm_symbol_size;
|
|
||||||
|
|
||||||
l = cset_start_symb + gNB->cce_list[d][cce_idx].reg_list[reg_in_cce_idx].symb_idx;
|
|
||||||
|
|
||||||
// dmrs index depends on reference point for k according to 38.211 7.4.1.3.2
|
|
||||||
if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG)
|
|
||||||
dmrs_idx =(gNB->cce_list[d][cce_idx].reg_list[reg_in_cce_idx].reg_idx / pdcch_pdu_rel15->DurationSymbols) * 3;
|
|
||||||
else
|
|
||||||
dmrs_idx = (gNB->cce_list[d][cce_idx].reg_list[reg_in_cce_idx].reg_idx / pdcch_pdu_rel15->DurationSymbols + rb_offset) * 3;
|
|
||||||
|
|
||||||
k_prime = 0;
|
|
||||||
|
|
||||||
for (int m = 0; m < NR_NB_SC_PER_RB; m++) {
|
|
||||||
if (m == (k_prime << 2) + 1) { // DMRS if not already mapped
|
|
||||||
((int16_t *) txdataF)[(l * frame_parms.ofdm_symbol_size + k) << 1] =
|
|
||||||
(amp * mod_dmrs[l][dmrs_idx << 1]) >> 15;
|
|
||||||
((int16_t *) txdataF)[((l * frame_parms.ofdm_symbol_size + k) << 1) + 1] =
|
|
||||||
(amp * mod_dmrs[l][(dmrs_idx << 1) + 1]) >> 15;
|
|
||||||
|
|
||||||
#ifdef DEBUG_PDCCH_DMRS
|
|
||||||
printf("PDCCH DMRS: l %d position %d => (%d,%d)\n",l,k,((int16_t *)txdataF)[(l*frame_parms.ofdm_symbol_size + k)<<1],
|
|
||||||
((int16_t *)txdataF)[((l*frame_parms.ofdm_symbol_size + k)<<1)+1]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
dmrs_idx++;
|
|
||||||
k_prime++;
|
|
||||||
|
|
||||||
} else { // DCI payload
|
|
||||||
((int16_t *) txdataF)[(l * frame_parms.ofdm_symbol_size + k) << 1] = (amp * mod_dci[dci_idx << 1]) >> 15;
|
|
||||||
((int16_t *) txdataF)[((l * frame_parms.ofdm_symbol_size + k) << 1) + 1] =
|
|
||||||
(amp * mod_dci[(dci_idx << 1) + 1]) >> 15;
|
|
||||||
#ifdef DEBUG_DCI
|
|
||||||
printf("PDCCH: l %d position %d => (%d,%d)\n",l,k,((int16_t *)txdataF)[(l*frame_parms.ofdm_symbol_size + k)<<1],
|
|
||||||
((int16_t *)txdataF)[((l*frame_parms.ofdm_symbol_size + k)<<1)+1]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
dci_idx++;
|
|
||||||
}
|
|
||||||
|
|
||||||
k++;
|
|
||||||
|
|
||||||
if (k >= frame_parms.ofdm_symbol_size)
|
if (k >= frame_parms.ofdm_symbol_size)
|
||||||
k -= frame_parms.ofdm_symbol_size;
|
k -= frame_parms.ofdm_symbol_size;
|
||||||
|
|
||||||
} // m
|
l = cset_start_symb + symbol;
|
||||||
} // reg_in_cce_idx
|
|
||||||
} // cce_count
|
// dmrs index depends on reference point for k according to 38.211 7.4.1.3.2
|
||||||
|
if (pdcch_pdu_rel15->CoreSetType == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG)
|
||||||
|
dmrs_idx = (gNB->cce_list[d][cce_idx].reg_list[reg_in_cce_idx].reg_idx) * 3;
|
||||||
|
else
|
||||||
|
dmrs_idx = (gNB->cce_list[d][cce_idx].reg_list[reg_in_cce_idx].reg_idx + rb_offset) * 3;
|
||||||
|
|
||||||
|
k_prime = 0;
|
||||||
|
|
||||||
|
for (int m = 0; m < NR_NB_SC_PER_RB; m++) {
|
||||||
|
if (m == (k_prime << 2) + 1) { // DMRS if not already mapped
|
||||||
|
((int16_t *) txdataF)[(l * frame_parms.ofdm_symbol_size + k) << 1] =
|
||||||
|
(amp * mod_dmrs[l][dmrs_idx << 1]) >> 15;
|
||||||
|
((int16_t *) txdataF)[((l * frame_parms.ofdm_symbol_size + k) << 1) + 1] =
|
||||||
|
(amp * mod_dmrs[l][(dmrs_idx << 1) + 1]) >> 15;
|
||||||
|
|
||||||
|
#ifdef DEBUG_PDCCH_DMRS
|
||||||
|
printf("PDCCH DMRS: l %d position %d => (%d,%d)\n",l,k,((int16_t *)txdataF)[(l*frame_parms.ofdm_symbol_size + k)<<1],
|
||||||
|
((int16_t *)txdataF)[((l*frame_parms.ofdm_symbol_size + k)<<1)+1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
dmrs_idx++;
|
||||||
|
k_prime++;
|
||||||
|
|
||||||
|
} else { // DCI payload
|
||||||
|
((int16_t *) txdataF)[(l * frame_parms.ofdm_symbol_size + k) << 1] = (amp * mod_dci[dci_idx << 1]) >> 15;
|
||||||
|
((int16_t *) txdataF)[((l * frame_parms.ofdm_symbol_size + k) << 1) + 1] =
|
||||||
|
(amp * mod_dci[(dci_idx << 1) + 1]) >> 15;
|
||||||
|
#ifdef DEBUG_DCI
|
||||||
|
printf("PDCCH: l %d position %d => (%d,%d)\n",l,k,((int16_t *)txdataF)[(l*frame_parms.ofdm_symbol_size + k)<<1],
|
||||||
|
((int16_t *)txdataF)[((l*frame_parms.ofdm_symbol_size + k)<<1)+1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
dci_idx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
k++;
|
||||||
|
|
||||||
|
if (k >= frame_parms.ofdm_symbol_size)
|
||||||
|
k -= frame_parms.ofdm_symbol_size;
|
||||||
|
|
||||||
|
} // m
|
||||||
|
} // reg_in_cce_idx
|
||||||
|
} // cce_count
|
||||||
|
} // symbol
|
||||||
|
|
||||||
LOG_D(PHY,
|
LOG_D(PHY,
|
||||||
"DCI: payloadSize = %d | payload = %llx\n",
|
"DCI: payloadSize = %d | payload = %llx\n",
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint8_t m, nfapi_nr_dl_tti_pdcch_pdu_r
|
|||||||
get_coreset_rballoc(pdcch_pdu_rel15->FreqDomainResource,&n_rb,&rb_offset);
|
get_coreset_rballoc(pdcch_pdu_rel15->FreqDomainResource,&n_rb,&rb_offset);
|
||||||
|
|
||||||
|
|
||||||
int N_reg = n_rb * pdcch_pdu_rel15->DurationSymbols;
|
int N_reg = n_rb;
|
||||||
int C=-1;
|
int C=-1;
|
||||||
|
|
||||||
AssertFatal(N_reg > 0,"N_reg cannot be 0\n");
|
AssertFatal(N_reg > 0,"N_reg cannot be 0\n");
|
||||||
@@ -174,8 +174,8 @@ void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint8_t m, nfapi_nr_dl_tti_pdcch_pdu_r
|
|||||||
for (uint8_t reg_idx=0; reg_idx<bsize; reg_idx++) {
|
for (uint8_t reg_idx=0; reg_idx<bsize; reg_idx++) {
|
||||||
reg = &cce->reg_list[reg_idx];
|
reg = &cce->reg_list[reg_idx];
|
||||||
reg->reg_idx = bsize*idx + reg_idx;
|
reg->reg_idx = bsize*idx + reg_idx;
|
||||||
reg->start_sc_idx = (reg->reg_idx/pdcch_pdu_rel15->DurationSymbols) * NR_NB_SC_PER_RB;
|
reg->start_sc_idx = reg->reg_idx * NR_NB_SC_PER_RB;
|
||||||
reg->symb_idx = reg->reg_idx % pdcch_pdu_rel15->DurationSymbols;
|
reg->symb_idx = 0;
|
||||||
LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx);
|
LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -185,8 +185,8 @@ void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint8_t m, nfapi_nr_dl_tti_pdcch_pdu_r
|
|||||||
for (uint8_t reg_idx=0; reg_idx<NR_NB_REG_PER_CCE; reg_idx++) {
|
for (uint8_t reg_idx=0; reg_idx<NR_NB_REG_PER_CCE; reg_idx++) {
|
||||||
reg = &cce->reg_list[reg_idx];
|
reg = &cce->reg_list[reg_idx];
|
||||||
reg->reg_idx = cce->cce_idx*NR_NB_REG_PER_CCE + reg_idx;
|
reg->reg_idx = cce->cce_idx*NR_NB_REG_PER_CCE + reg_idx;
|
||||||
reg->start_sc_idx = (reg->reg_idx/pdcch_pdu_rel15->DurationSymbols) * NR_NB_SC_PER_RB;
|
reg->start_sc_idx = reg->reg_idx * NR_NB_SC_PER_RB;
|
||||||
reg->symb_idx = reg->reg_idx % pdcch_pdu_rel15->DurationSymbols;
|
reg->symb_idx = 0;
|
||||||
LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx);
|
LOG_D(PHY, "reg %d symbol %d start subcarrier %d\n", reg->reg_idx, reg->symb_idx, reg->start_sc_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user