fix transform precoding scheduling for ulsch
This commit is contained in:
@@ -164,9 +164,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
const uint8_t u = pusch_pdu->dfts_ofdm.low_papr_group_number;
|
const uint8_t u = pusch_pdu->dfts_ofdm.low_papr_group_number;
|
||||||
const uint8_t v = pusch_pdu->dfts_ofdm.low_papr_sequence_number;
|
const uint8_t v = pusch_pdu->dfts_ofdm.low_papr_sequence_number;
|
||||||
int16_t *dmrs_seq = gNB_dmrs_lowpaprtype1_sequence[u][v][index];
|
int16_t *dmrs_seq = gNB_dmrs_lowpaprtype1_sequence[u][v][index];
|
||||||
|
LOG_D(PHY,"Transform Precoding params. u: %d, v: %d, index for dmrsseq: %d\n", u, v, index);
|
||||||
AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n");
|
AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n");
|
||||||
AssertFatal(dmrs_seq != NULL, "DMRS low PAPR seq not found, check if DMRS sequences are generated");
|
AssertFatal(dmrs_seq != NULL, "DMRS low PAPR seq not found, check if DMRS sequences are generated");
|
||||||
LOG_D(PHY,"Transform Precoding params. u: %d, v: %d, index for dmrsseq: %d\n", u, v, index);
|
|
||||||
nr_pusch_lowpaprtype1_dmrs_rx(gNB, Ns, dmrs_seq, (int32_t *)pilot, 1000, 0, nb_rb_pusch, 0, pusch_pdu->dmrs_config_type);
|
nr_pusch_lowpaprtype1_dmrs_rx(gNB, Ns, dmrs_seq, (int32_t *)pilot, 1000, 0, nb_rb_pusch, 0, pusch_pdu->dmrs_config_type);
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf ("NR_UL_CHANNEL_EST: index %d, u %d,v %d\n", index, u, v);
|
printf ("NR_UL_CHANNEL_EST: index %d, u %d,v %d\n", index, u, v);
|
||||||
|
|||||||
@@ -602,7 +602,7 @@ typedef struct NR_UE_UL_BWP {
|
|||||||
NR_CSI_MeasConfig_t *csi_MeasConfig;
|
NR_CSI_MeasConfig_t *csi_MeasConfig;
|
||||||
NR_SRS_Config_t *srs_Config;
|
NR_SRS_Config_t *srs_Config;
|
||||||
long *msg3_DeltaPreamble;
|
long *msg3_DeltaPreamble;
|
||||||
long *transform_precoding;
|
int transform_precoding;
|
||||||
uint8_t mcs_table;
|
uint8_t mcs_table;
|
||||||
nr_dci_format_t dci_format;
|
nr_dci_format_t dci_format;
|
||||||
int max_fb_time;
|
int max_fb_time;
|
||||||
|
|||||||
@@ -462,6 +462,7 @@ bool allocate_dl_retransmission(module_id_t module_id,
|
|||||||
uint16_t new_rbSize;
|
uint16_t new_rbSize;
|
||||||
bool success = nr_find_nb_rb(retInfo->Qm,
|
bool success = nr_find_nb_rb(retInfo->Qm,
|
||||||
retInfo->R,
|
retInfo->R,
|
||||||
|
1, // no transform precoding for DL
|
||||||
layers,
|
layers,
|
||||||
temp_tda.nrOfSymbols,
|
temp_tda.nrOfSymbols,
|
||||||
temp_dmrs.N_PRB_DMRS * temp_dmrs.N_DMRS_SLOT,
|
temp_dmrs.N_PRB_DMRS * temp_dmrs.N_DMRS_SLOT,
|
||||||
@@ -764,6 +765,7 @@ void pf_dl(module_id_t module_id,
|
|||||||
//const int oh = 3 * sched_ctrl->dl_pdus_total + 2 * (frame == (sched_ctrl->ta_frame + 10) % 1024);
|
//const int oh = 3 * sched_ctrl->dl_pdus_total + 2 * (frame == (sched_ctrl->ta_frame + 10) % 1024);
|
||||||
nr_find_nb_rb(sched_pdsch->Qm,
|
nr_find_nb_rb(sched_pdsch->Qm,
|
||||||
sched_pdsch->R,
|
sched_pdsch->R,
|
||||||
|
1, // no transform precoding for DL
|
||||||
sched_pdsch->nrOfLayers,
|
sched_pdsch->nrOfLayers,
|
||||||
tda_info->nrOfSymbols,
|
tda_info->nrOfSymbols,
|
||||||
sched_pdsch->dmrs_parms.N_PRB_DMRS * sched_pdsch->dmrs_parms.N_DMRS_SLOT,
|
sched_pdsch->dmrs_parms.N_PRB_DMRS * sched_pdsch->dmrs_parms.N_DMRS_SLOT,
|
||||||
|
|||||||
@@ -513,8 +513,21 @@ void fill_pdcch_vrb_map(gNB_MAC_INST *mac,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool multiple_2_3_5(int rb)
|
||||||
|
{
|
||||||
|
while (rb % 2 == 0)
|
||||||
|
rb /= 2;
|
||||||
|
while (rb % 3 == 0)
|
||||||
|
rb /= 3;
|
||||||
|
while (rb % 5 == 0)
|
||||||
|
rb /= 5;
|
||||||
|
|
||||||
|
return (rb == 1);
|
||||||
|
}
|
||||||
|
|
||||||
bool nr_find_nb_rb(uint16_t Qm,
|
bool nr_find_nb_rb(uint16_t Qm,
|
||||||
uint16_t R,
|
uint16_t R,
|
||||||
|
int transform_precoding,
|
||||||
uint8_t nrOfLayers,
|
uint8_t nrOfLayers,
|
||||||
uint16_t nb_symb_sch,
|
uint16_t nb_symb_sch,
|
||||||
uint16_t nb_dmrs_prb,
|
uint16_t nb_dmrs_prb,
|
||||||
@@ -524,6 +537,11 @@ bool nr_find_nb_rb(uint16_t Qm,
|
|||||||
uint32_t *tbs,
|
uint32_t *tbs,
|
||||||
uint16_t *nb_rb)
|
uint16_t *nb_rb)
|
||||||
{
|
{
|
||||||
|
// for transform precoding only RB = 2^a_2 * 3^a_3 * 5^a_5 is allowed with a non-negative
|
||||||
|
while(transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled &&
|
||||||
|
!multiple_2_3_5(nb_rb_max))
|
||||||
|
nb_rb_max--;
|
||||||
|
|
||||||
/* is the maximum (not even) enough? */
|
/* is the maximum (not even) enough? */
|
||||||
*nb_rb = nb_rb_max;
|
*nb_rb = nb_rb_max;
|
||||||
*tbs = nr_compute_tbs(Qm, R, *nb_rb, nb_symb_sch, nb_dmrs_prb, 0, 0, nrOfLayers) >> 3;
|
*tbs = nr_compute_tbs(Qm, R, *nb_rb, nb_symb_sch, nb_dmrs_prb, 0, 0, nrOfLayers) >> 3;
|
||||||
@@ -545,6 +563,10 @@ bool nr_find_nb_rb(uint16_t Qm,
|
|||||||
int hi = nb_rb_max;
|
int hi = nb_rb_max;
|
||||||
int lo = nb_rb_min;
|
int lo = nb_rb_min;
|
||||||
for (int p = (hi + lo) / 2; lo + 1 < hi; p = (hi + lo) / 2) {
|
for (int p = (hi + lo) / 2; lo + 1 < hi; p = (hi + lo) / 2) {
|
||||||
|
// for transform precoding only RB = 2^a_2 * 3^a_3 * 5^a_5 is allowed with a non-negative
|
||||||
|
while(transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled &&
|
||||||
|
!multiple_2_3_5(p))
|
||||||
|
p++;
|
||||||
const uint32_t TBS = nr_compute_tbs(Qm, R, p, nb_symb_sch, nb_dmrs_prb, 0, 0, nrOfLayers) >> 3;
|
const uint32_t TBS = nr_compute_tbs(Qm, R, p, nb_symb_sch, nb_dmrs_prb, 0, 0, nrOfLayers) >> 3;
|
||||||
if (bytes == TBS) {
|
if (bytes == TBS) {
|
||||||
hi = p;
|
hi = p;
|
||||||
@@ -568,7 +590,7 @@ NR_pusch_dmrs_t get_ul_dmrs_params(const NR_ServingCellConfigCommon_t *scc,
|
|||||||
|
|
||||||
NR_pusch_dmrs_t dmrs = {0};
|
NR_pusch_dmrs_t dmrs = {0};
|
||||||
// TODO setting of cdm groups with no data to be redone for MIMO
|
// TODO setting of cdm groups with no data to be redone for MIMO
|
||||||
if (ul_bwp->transform_precoding || Layers<3)
|
if (ul_bwp->transform_precoding && Layers < 3)
|
||||||
dmrs.num_dmrs_cdm_grps_no_data = ul_bwp->dci_format == NR_UL_DCI_FORMAT_0_1 || tda_info->nrOfSymbols == 2 ? 1 : 2;
|
dmrs.num_dmrs_cdm_grps_no_data = ul_bwp->dci_format == NR_UL_DCI_FORMAT_0_1 || tda_info->nrOfSymbols == 2 ? 1 : 2;
|
||||||
else
|
else
|
||||||
dmrs.num_dmrs_cdm_grps_no_data = 2;
|
dmrs.num_dmrs_cdm_grps_no_data = 2;
|
||||||
@@ -2259,22 +2281,24 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac,
|
|||||||
DL_BWP->mcsTableIdx = get_pdsch_mcs_table(dl_mcs_Table, DL_BWP->dci_format, NR_RNTI_C, target_ss);
|
DL_BWP->mcsTableIdx = get_pdsch_mcs_table(dl_mcs_Table, DL_BWP->dci_format, NR_RNTI_C, target_ss);
|
||||||
|
|
||||||
// 0 precoding enabled 1 precoding disabled
|
// 0 precoding enabled 1 precoding disabled
|
||||||
|
long *transform_precoding;
|
||||||
if (UL_BWP->dci_format == NR_UL_DCI_FORMAT_0_0 ||
|
if (UL_BWP->dci_format == NR_UL_DCI_FORMAT_0_0 ||
|
||||||
UL_BWP->pusch_Config == NULL || UL_BWP->pusch_Config->transformPrecoder == NULL)
|
UL_BWP->pusch_Config == NULL || UL_BWP->pusch_Config->transformPrecoder == NULL)
|
||||||
UL_BWP->transform_precoding = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder;
|
transform_precoding = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder;
|
||||||
else
|
else
|
||||||
UL_BWP->transform_precoding = UL_BWP->pusch_Config->transformPrecoder;
|
transform_precoding = UL_BWP->pusch_Config->transformPrecoder;
|
||||||
|
|
||||||
|
UL_BWP->transform_precoding = (transform_precoding == NULL || *transform_precoding == 1);
|
||||||
|
|
||||||
// Set uplink MCS table
|
// Set uplink MCS table
|
||||||
long *mcs_Table = NULL;
|
long *mcs_Table = NULL;
|
||||||
bool not_tp = (UL_BWP->transform_precoding == NULL || *UL_BWP->transform_precoding == 1);
|
|
||||||
if (UL_BWP->pusch_Config)
|
if (UL_BWP->pusch_Config)
|
||||||
mcs_Table = not_tp ?
|
mcs_Table = UL_BWP->transform_precoding ?
|
||||||
UL_BWP->pusch_Config->mcs_Table :
|
UL_BWP->pusch_Config->mcs_Table :
|
||||||
UL_BWP->pusch_Config->mcs_TableTransformPrecoder;
|
UL_BWP->pusch_Config->mcs_TableTransformPrecoder;
|
||||||
|
|
||||||
UL_BWP->mcs_table = get_pusch_mcs_table(mcs_Table,
|
UL_BWP->mcs_table = get_pusch_mcs_table(mcs_Table,
|
||||||
!not_tp,
|
!UL_BWP->transform_precoding,
|
||||||
UL_BWP->dci_format,
|
UL_BWP->dci_format,
|
||||||
NR_RNTI_C,
|
NR_RNTI_C,
|
||||||
target_ss,
|
target_ss,
|
||||||
|
|||||||
@@ -1041,7 +1041,7 @@ uint8_t get_max_tpmi(const NR_PUSCH_Config_t *pusch_Config,
|
|||||||
void get_precoder_matrix_coef(char *w,
|
void get_precoder_matrix_coef(char *w,
|
||||||
const uint8_t ul_ri,
|
const uint8_t ul_ri,
|
||||||
const uint16_t num_ue_srs_ports,
|
const uint16_t num_ue_srs_ports,
|
||||||
const long *transform_precoding,
|
const long transform_precoding,
|
||||||
const uint8_t tpmi,
|
const uint8_t tpmi,
|
||||||
const uint8_t uI,
|
const uint8_t uI,
|
||||||
int layer_idx)
|
int layer_idx)
|
||||||
@@ -1050,7 +1050,7 @@ void get_precoder_matrix_coef(char *w,
|
|||||||
if (num_ue_srs_ports == 2) {
|
if (num_ue_srs_ports == 2) {
|
||||||
*w = table_38211_6_3_1_5_1[tpmi][uI][layer_idx];
|
*w = table_38211_6_3_1_5_1[tpmi][uI][layer_idx];
|
||||||
} else {
|
} else {
|
||||||
if (transform_precoding && *transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled) {
|
if (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled) {
|
||||||
*w = table_38211_6_3_1_5_2[tpmi][uI][layer_idx];
|
*w = table_38211_6_3_1_5_2[tpmi][uI][layer_idx];
|
||||||
} else {
|
} else {
|
||||||
*w = table_38211_6_3_1_5_3[tpmi][uI][layer_idx];
|
*w = table_38211_6_3_1_5_3[tpmi][uI][layer_idx];
|
||||||
@@ -1068,7 +1068,7 @@ void get_precoder_matrix_coef(char *w,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int nr_srs_tpmi_estimation(const NR_PUSCH_Config_t *pusch_Config,
|
int nr_srs_tpmi_estimation(const NR_PUSCH_Config_t *pusch_Config,
|
||||||
const long *transform_precoding,
|
const long transform_precoding,
|
||||||
const uint8_t *channel_matrix,
|
const uint8_t *channel_matrix,
|
||||||
const uint8_t normalized_iq_representation,
|
const uint8_t normalized_iq_representation,
|
||||||
const uint16_t num_gnb_antenna_elements,
|
const uint16_t num_gnb_antenna_elements,
|
||||||
@@ -1470,6 +1470,7 @@ static bool allocate_ul_retransmission(gNB_MAC_INST *nrmac,
|
|||||||
uint16_t new_rbSize;
|
uint16_t new_rbSize;
|
||||||
bool success = nr_find_nb_rb(retInfo->Qm,
|
bool success = nr_find_nb_rb(retInfo->Qm,
|
||||||
retInfo->R,
|
retInfo->R,
|
||||||
|
UE->current_UL_BWP.transform_precoding,
|
||||||
nrOfLayers,
|
nrOfLayers,
|
||||||
tda_info.nrOfSymbols,
|
tda_info.nrOfSymbols,
|
||||||
dmrs_info.N_PRB_DMRS * dmrs_info.num_dmrs_symb,
|
dmrs_info.N_PRB_DMRS * dmrs_info.num_dmrs_symb,
|
||||||
@@ -1815,6 +1816,7 @@ void pf_ul(module_id_t module_id,
|
|||||||
uint32_t TBS = 0;
|
uint32_t TBS = 0;
|
||||||
nr_find_nb_rb(sched_pusch->Qm,
|
nr_find_nb_rb(sched_pusch->Qm,
|
||||||
sched_pusch->R,
|
sched_pusch->R,
|
||||||
|
current_BWP->transform_precoding,
|
||||||
sched_pusch->nrOfLayers,
|
sched_pusch->nrOfLayers,
|
||||||
sched_pusch->tda_info.nrOfSymbols,
|
sched_pusch->tda_info.nrOfSymbols,
|
||||||
sched_pusch->dmrs_info.N_PRB_DMRS * sched_pusch->dmrs_info.num_dmrs_symb,
|
sched_pusch->dmrs_info.N_PRB_DMRS * sched_pusch->dmrs_info.num_dmrs_symb,
|
||||||
@@ -2149,7 +2151,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
|
|||||||
pusch_pdu->qam_mod_order = sched_pusch->Qm;
|
pusch_pdu->qam_mod_order = sched_pusch->Qm;
|
||||||
pusch_pdu->mcs_index = sched_pusch->mcs;
|
pusch_pdu->mcs_index = sched_pusch->mcs;
|
||||||
pusch_pdu->mcs_table = current_BWP->mcs_table;
|
pusch_pdu->mcs_table = current_BWP->mcs_table;
|
||||||
pusch_pdu->transform_precoding = current_BWP->transform_precoding ? *current_BWP->transform_precoding : 1;
|
pusch_pdu->transform_precoding = current_BWP->transform_precoding;
|
||||||
if (current_BWP->pusch_Config && current_BWP->pusch_Config->dataScramblingIdentityPUSCH)
|
if (current_BWP->pusch_Config && current_BWP->pusch_Config->dataScramblingIdentityPUSCH)
|
||||||
pusch_pdu->data_scrambling_id = *current_BWP->pusch_Config->dataScramblingIdentityPUSCH;
|
pusch_pdu->data_scrambling_id = *current_BWP->pusch_Config->dataScramblingIdentityPUSCH;
|
||||||
else
|
else
|
||||||
@@ -2182,7 +2184,6 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
|
|||||||
pusch_pdu->pusch_identity = *scc->physCellId;
|
pusch_pdu->pusch_identity = *scc->physCellId;
|
||||||
}
|
}
|
||||||
pusch_pdu->scid = 0; // DMRS sequence initialization [TS38.211, sec 6.4.1.1.1]
|
pusch_pdu->scid = 0; // DMRS sequence initialization [TS38.211, sec 6.4.1.1.1]
|
||||||
pusch_pdu->num_dmrs_cdm_grps_no_data = sched_pusch->dmrs_info.num_dmrs_cdm_grps_no_data;
|
|
||||||
pusch_pdu->dmrs_ports = ((1<<sched_pusch->nrOfLayers) - 1);
|
pusch_pdu->dmrs_ports = ((1<<sched_pusch->nrOfLayers) - 1);
|
||||||
|
|
||||||
/* FAPI: Pusch Allocation in frequency domain */
|
/* FAPI: Pusch Allocation in frequency domain */
|
||||||
@@ -2241,7 +2242,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
|
|||||||
else
|
else
|
||||||
AssertFatal(1==0,"Hopping mode is not supported in transform precoding\n");
|
AssertFatal(1==0,"Hopping mode is not supported in transform precoding\n");
|
||||||
|
|
||||||
LOG_I(NR_MAC,"TRANSFORM PRECODING IS ENABLED. CDM groups: %d, U: %d MCS table: %d\n", pusch_pdu->num_dmrs_cdm_grps_no_data, pusch_pdu->dfts_ofdm.low_papr_group_number, current_BWP->mcs_table);
|
LOG_D(NR_MAC,"TRANSFORM PRECODING IS ENABLED. CDM groups: %d, U: %d MCS table: %d\n", pusch_pdu->num_dmrs_cdm_grps_no_data, pusch_pdu->dfts_ofdm.low_papr_group_number, current_BWP->mcs_table);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
|||||||
@@ -460,6 +460,7 @@ int get_cce_index(const gNB_MAC_INST *nrmac,
|
|||||||
|
|
||||||
bool nr_find_nb_rb(uint16_t Qm,
|
bool nr_find_nb_rb(uint16_t Qm,
|
||||||
uint16_t R,
|
uint16_t R,
|
||||||
|
int transform_precoding,
|
||||||
uint8_t nrOfLayers,
|
uint8_t nrOfLayers,
|
||||||
uint16_t nb_symb_sch,
|
uint16_t nb_symb_sch,
|
||||||
uint16_t nb_dmrs_prb,
|
uint16_t nb_dmrs_prb,
|
||||||
|
|||||||
Reference in New Issue
Block a user