Commit f82bba55 authored by francescomani's avatar francescomani

fix transform precoding scheduling for ulsch

parent 7db8dce5
...@@ -164,9 +164,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ...@@ -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 { ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment