Commit 6d058d30 authored by Francesco Mani's avatar Francesco Mani

SCF FAPI structures for PUSCH at gNB

parent 57c993ce
...@@ -762,7 +762,7 @@ void *UE_thread(void *arg) { ...@@ -762,7 +762,7 @@ void *UE_thread(void *arg) {
int firstSymSamp = get_firstSymSamp(slot_nr, &UE->frame_parms); int firstSymSamp = get_firstSymSamp(slot_nr, &UE->frame_parms);
for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++) for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
rxp[i] = (void *)&UE->common_vars.rxdata[i][firstSymSamp+ rxp[i] = (void *)&UE->common_vars.rxdata[i][firstSymSamp+
get_samples_slot_timestamp(slot_nr,&UE->frame_parms,0)]; UE->frame_parms.get_samples_slot_timestamp(slot_nr,&UE->frame_parms,0)];
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++) for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
txp[i] = (void *)&UE->common_vars.txdata[i][UE->frame_parms.get_samples_slot_timestamp( txp[i] = (void *)&UE->common_vars.txdata[i][UE->frame_parms.get_samples_slot_timestamp(
......
...@@ -1122,10 +1122,10 @@ typedef struct ...@@ -1122,10 +1122,10 @@ typedef struct
uint16_t data_scrambling_id; uint16_t data_scrambling_id;
uint8_t nrOfLayers; uint8_t nrOfLayers;
//DMRS //DMRS
uint8_t ul_dmrs_symb_pos; uint16_t ul_dmrs_symb_pos;
uint8_t dmrs_config_type; uint8_t dmrs_config_type;
uint16_t ul_dmrs_scrambling_id; uint16_t ul_dmrs_scrambling_id;
uint8_t scid;// uint8_t scid;
uint8_t num_dmrs_cdm_grps_no_data; uint8_t num_dmrs_cdm_grps_no_data;
uint16_t dmrs_ports;//DMRS ports. [TS38.212 7.3.1.1.2] provides description between DCI 0-1 content and DMRS ports. Bitmap occupying the 11 LSBs with: bit 0: antenna port 1000 bit 11: antenna port 1011 and for each bit 0: DMRS port not used 1: DMRS port used uint16_t dmrs_ports;//DMRS ports. [TS38.212 7.3.1.1.2] provides description between DCI 0-1 content and DMRS ports. Bitmap occupying the 11 LSBs with: bit 0: antenna port 1000 bit 11: antenna port 1011 and for each bit 0: DMRS port not used 1: DMRS port used
//Pusch Allocation in frequency domain [TS38.214, sec 6.1.2.2] //Pusch Allocation in frequency domain [TS38.214, sec 6.1.2.2]
......
...@@ -30,13 +30,13 @@ ...@@ -30,13 +30,13 @@
//#define DEBUG_SEGMENTATION //#define DEBUG_SEGMENTATION
int32_t nr_segmentation(unsigned char *input_buffer, int32_t nr_segmentation(unsigned char *input_buffer,
unsigned char **output_buffers, unsigned char **output_buffers,
unsigned int B, unsigned int B,
unsigned int *C, unsigned int *C,
unsigned int *K, unsigned int *K,
unsigned int *Zout, // [hna] Zout is Zc unsigned int *Zout, // [hna] Zout is Zc
unsigned int *F, unsigned int *F,
uint8_t BG) uint8_t BG)
{ {
unsigned int L,Bprime,Z,r,Kcb,Kb,k,s,crc,Kprime; unsigned int L,Bprime,Z,r,Kcb,Kb,k,s,crc,Kprime;
......
...@@ -83,8 +83,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, ...@@ -83,8 +83,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
NR_gNB_COMMON *const common_vars = &gNB->common_vars; NR_gNB_COMMON *const common_vars = &gNB->common_vars;
NR_gNB_PRACH *const prach_vars = &gNB->prach_vars; NR_gNB_PRACH *const prach_vars = &gNB->prach_vars;
NR_gNB_PUSCH **const pusch_vars = gNB->pusch_vars; NR_gNB_PUSCH **const pusch_vars = gNB->pusch_vars;
dmrs_UplinkConfig_t *dmrs_Uplink_Config = &gNB->pusch_config.dmrs_UplinkConfig;
ptrs_UplinkConfig_t *ptrs_Uplink_Config = &gNB->pusch_config.dmrs_UplinkConfig.ptrs_UplinkConfig;
/*LTE_eNB_SRS *const srs_vars = gNB->srs_vars; /*LTE_eNB_SRS *const srs_vars = gNB->srs_vars;
LTE_eNB_PRACH *const prach_vars = &gNB->prach_vars;*/ LTE_eNB_PRACH *const prach_vars = &gNB->prach_vars;*/
...@@ -154,31 +152,30 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, ...@@ -154,31 +152,30 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
} }
} }
//------------- config PUSCH DMRS parameters(to be updated from RRC)--------------
gNB->dmrs_UplinkConfig.pusch_dmrs_type = pusch_dmrs_type1;
gNB->dmrs_UplinkConfig.pusch_dmrs_AdditionalPosition = pusch_dmrs_pos0;
gNB->dmrs_UplinkConfig.pusch_maxLength = pusch_len1;
//--------------------------------------------------------------------------------
nr_init_pdsch_dmrs(gNB, cfg->cell_config.phy_cell_id.value); nr_init_pdsch_dmrs(gNB, cfg->cell_config.phy_cell_id.value);
// default values until overwritten by RRCConnectionReconfiguration //PUSCH DMRS init
gNB->nr_gold_pusch_dmrs = (uint32_t ****)malloc16(2*sizeof(uint32_t ***));
uint32_t ****pusch_dmrs = gNB->nr_gold_pusch_dmrs;
for (i=0;i<MAX_NR_OF_UL_ALLOCATIONS;i++){ for(int nscid=0; nscid<2; nscid++) {
gNB->pusch_config.pusch_TimeDomainResourceAllocation[i] = (PUSCH_TimeDomainResourceAllocation_t *)malloc16(sizeof(PUSCH_TimeDomainResourceAllocation_t)); pusch_dmrs[nscid] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
gNB->pusch_config.pusch_TimeDomainResourceAllocation[i]->mappingType = typeB; AssertFatal(pusch_dmrs[nscid]!=NULL, "NR init: pusch_dmrs for nscid %d - malloc failed\n", nscid);
}
for (int slot=0; slot<fp->slots_per_frame; slot++) {
pusch_dmrs[nscid][slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
AssertFatal(pusch_dmrs[nscid][slot]!=NULL, "NR init: pusch_dmrs for slot %d - malloc failed\n", slot);
gNB->ptrs_configured = 0; for (int symb=0; symb<fp->symbols_per_slot; symb++) {
pusch_dmrs[nscid][slot][symb] = (uint32_t *)malloc16(NR_MAX_PUSCH_DMRS_INIT_LENGTH_DWORD*sizeof(uint32_t));
AssertFatal(pusch_dmrs[nscid][slot][symb]!=NULL, "NR init: pusch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb);
}
}
}
//------------- config PUSCH PTRS parameters(to be updated from RRC)--------------// uint32_t Nid_pusch[2] = {cfg->cell_config.phy_cell_id.value,cfg->cell_config.phy_cell_id.value};
ptrs_Uplink_Config->timeDensity.ptrs_mcs1 = 0; // setting MCS values to 0 indicate abscence of time_density field in the configuration nr_gold_pusch(gNB, &Nid_pusch[0]);
ptrs_Uplink_Config->timeDensity.ptrs_mcs2 = 0;
ptrs_Uplink_Config->timeDensity.ptrs_mcs3 = 0;
ptrs_Uplink_Config->frequencyDensity.n_rb0 = 0; // setting N_RB values to 0 indicate abscence of frequency_density field in the configuration
ptrs_Uplink_Config->frequencyDensity.n_rb1 = 0;
ptrs_Uplink_Config->resourceElementOffset = 0;
//--------------------------------------------------------------------------------//
/// Transport init necessary for NR synchro /// Transport init necessary for NR synchro
init_nr_transport(gNB); init_nr_transport(gNB);
......
...@@ -31,22 +31,19 @@ ...@@ -31,22 +31,19 @@
int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
uint8_t gNB_offset,
unsigned char Ns, unsigned char Ns,
unsigned short p, unsigned short p,
unsigned char symbol, unsigned char symbol,
unsigned short bwp_start_subcarrier, unsigned short bwp_start_subcarrier,
unsigned short nb_rb_pusch, nfapi_nr_pusch_pdu_t *pusch_pdu) {
dmrs_UplinkConfig_t *dmrs_UplinkConfig)
{
int pilot[3280] __attribute__((aligned(16))); int pilot[3280] __attribute__((aligned(16)));
unsigned char aarx; unsigned char aarx;
unsigned short k; unsigned short k;
unsigned int pilot_cnt,re_cnt; unsigned int pilot_cnt,re_cnt;
int16_t ch[2],ch_r[2],ch_l[2],*pil,*rxF,*ul_ch; int16_t ch[2],ch_r[2],ch_l[2],*pil,*rxF,*ul_ch;
int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh; int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh;
int ch_offset,symbol_offset, length_dmrs, UE_id = 0; int ch_offset,symbol_offset, UE_id = 0;
unsigned short n_idDMRS[2] = {0,1}; //to update from pusch config
int32_t **ul_ch_estimates_time = gNB->pusch_vars[UE_id]->ul_ch_estimates_time; int32_t **ul_ch_estimates_time = gNB->pusch_vars[UE_id]->ul_ch_estimates_time;
__m128i *ul_ch_128; __m128i *ul_ch_128;
...@@ -71,9 +68,11 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ...@@ -71,9 +68,11 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
k = bwp_start_subcarrier; k = bwp_start_subcarrier;
int re_offset = k; int re_offset = k;
uint16_t nb_rb_pusch = pusch_pdu->rb_size;
/* /*
#ifdef DEBUG_CH #ifdef DEBUG_CH
printf("PUSCH Channel Estimation : gNB_offset %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d symbol %d\n", gNB_offset,ch_offset,symbol_offset,gNB->frame_parms.ofdm_symbol_size, printf("PUSCH Channel Estimation : ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d symbol %d\n", ,ch_offset,symbol_offset,gNB->frame_parms.ofdm_symbol_size,
gNB->frame_parms.Ncp,l,Ns,k, symbol); gNB->frame_parms.Ncp,l,Ns,k, symbol);
#endif #endif
*/ */
...@@ -117,21 +116,17 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ...@@ -117,21 +116,17 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
//------------------generate DMRS------------------// //------------------generate DMRS------------------//
length_dmrs = dmrs_UplinkConfig->pusch_maxLength; nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch, pusch_pdu->dmrs_config_type);
nr_gold_pusch(gNB, symbol, n_idDMRS, length_dmrs);
nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch[gNB_offset][Ns][0], &pilot[0], 1000, 0, nb_rb_pusch, dmrs_UplinkConfig->pusch_dmrs_type);
//------------------------------------------------// //------------------------------------------------//
for (aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) { for (aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) {
pil = (int16_t *)&pilot[0]; pil = (int16_t *)&pilot[0];
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)]; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];
ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset]; ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size)); memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
#ifdef DEBUG_PUSCH #ifdef DEBUG_PUSCH
printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], gNB->frame_parms.N_RB_UL); printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], gNB->frame_parms.N_RB_UL);
...@@ -141,8 +136,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ...@@ -141,8 +136,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
#endif #endif
//if ((gNB->frame_parms.N_RB_UL&1)==0) { //if ((gNB->frame_parms.N_RB_UL&1)==0) {
if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1){
if (dmrs_UplinkConfig->pusch_dmrs_type == pusch_dmrs_type1){
// Treat first 2 pilots specially (left edge) // Treat first 2 pilots specially (left edge)
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
...@@ -237,10 +231,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, ...@@ -237,10 +231,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
} }
// Treat first 2 pilots specially (right edge) // Treat first 2 pilots specially (right edge)
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
#ifdef DEBUG_PUSCH #ifdef DEBUG_PUSCH
printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
#endif #endif
multadd_real_vector_complex_scalar(fm, multadd_real_vector_complex_scalar(fm,
ch, ch,
......
...@@ -39,14 +39,12 @@ ...@@ -39,14 +39,12 @@
\param nb_rb_pusch, number of allocated RBs for this UE \param nb_rb_pusch, number of allocated RBs for this UE
*/ */
int32_t nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
uint8_t gNB_offset, unsigned char Ns,
unsigned char Ns, unsigned short p,
unsigned short p, unsigned char symbol,
unsigned char symbol, unsigned short bwp_start_subcarrier,
unsigned short bwp_start_subcarrier, nfapi_nr_pusch_pdu_t *pusch_pdu);
unsigned short nb_rb_pusch,
dmrs_UplinkConfig_t *dmrs_UplinkConfig);
int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id); int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id);
......
...@@ -128,22 +128,21 @@ uint8_t is_dmrs_symbol(uint8_t l, ...@@ -128,22 +128,21 @@ uint8_t is_dmrs_symbol(uint8_t l,
uint16_t n, uint16_t n,
uint8_t delta, uint8_t delta,
uint8_t duration_in_symbols, uint8_t duration_in_symbols,
dmrs_UplinkConfig_t *dmrs_UplinkConfig, uint8_t dmrs_type,
uint8_t mapping_type,
uint16_t ofdm_symbol_size) { uint16_t ofdm_symbol_size) {
uint8_t is_dmrs_freq, is_dmrs_time, dmrs_type, l0; uint8_t is_dmrs_freq, is_dmrs_time, l0;
int32_t l_prime_mask; int32_t l_prime_mask;
pusch_dmrs_AdditionalPosition_t additional_pos; pusch_dmrs_AdditionalPosition_t additional_pos = pusch_dmrs_pos0;
pusch_maxLength_t pusch_maxLength = pusch_len1;
uint8_t mapping_type = typeB;
is_dmrs_freq = 0; is_dmrs_freq = 0;
is_dmrs_time = 0; is_dmrs_time = 0;
dmrs_type = dmrs_UplinkConfig->pusch_dmrs_type;
additional_pos = dmrs_UplinkConfig->pusch_dmrs_AdditionalPosition;
l0 = get_l0_ul(mapping_type, 2); l0 = get_l0_ul(mapping_type, 2);
l_prime_mask = get_l_prime(duration_in_symbols, mapping_type, additional_pos, dmrs_UplinkConfig->pusch_maxLength); l_prime_mask = get_l_prime(duration_in_symbols, mapping_type, additional_pos, pusch_maxLength);
if (k == ((start_sc+get_dmrs_freq_idx_ul(n, k_prime, delta, dmrs_type))%ofdm_symbol_size)) if (k == ((start_sc+get_dmrs_freq_idx_ul(n, k_prime, delta, dmrs_type))%ofdm_symbol_size))
is_dmrs_freq = 1; is_dmrs_freq = 1;
...@@ -157,7 +156,7 @@ uint8_t is_dmrs_symbol(uint8_t l, ...@@ -157,7 +156,7 @@ uint8_t is_dmrs_symbol(uint8_t l,
} else if ( (l==l0) || (((l_prime_mask>>l)&1) == 1 && l!=0) ) } else if ( (l==l0) || (((l_prime_mask>>l)&1) == 1 && l!=0) )
is_dmrs_time = 1; is_dmrs_time = 1;
if (dmrs_UplinkConfig->pusch_maxLength == pusch_len2){ if (pusch_maxLength == pusch_len2){
if (((l_prime_mask>>(l-1))&1) == 1 && l!=0 && l!=1) if (((l_prime_mask>>(l-1))&1) == 1 && l!=0 && l!=1)
is_dmrs_time = 1; is_dmrs_time = 1;
......
...@@ -66,8 +66,7 @@ uint8_t is_dmrs_symbol(uint8_t l, ...@@ -66,8 +66,7 @@ uint8_t is_dmrs_symbol(uint8_t l,
uint16_t n, uint16_t n,
uint8_t delta, uint8_t delta,
uint8_t duration_in_symbols, uint8_t duration_in_symbols,
dmrs_UplinkConfig_t *dmrs_UplinkConfig, uint8_t dmrs_type,
uint8_t mapping_type,
uint16_t ofdm_symbol_size); uint16_t ofdm_symbol_size);
#undef EXTERN #undef EXTERN
......
...@@ -104,56 +104,27 @@ void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid) ...@@ -104,56 +104,27 @@ void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid)
} }
void nr_gold_pusch(PHY_VARS_gNB* gNB, unsigned short lbar,unsigned short *n_idDMRS, unsigned short length_dmrs) void nr_gold_pusch(PHY_VARS_gNB* gNB, uint32_t *Nid) {
{
unsigned char ns,l; unsigned char ns;
unsigned int n,x1,x2,x2tmp0; unsigned int n,x1,x2;
int nscid; int nscid, reset;
unsigned int nid; unsigned int nid;
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
/// to be updated from higher layer unsigned short l;
//unsigned short lbar = 0;
for (nscid=0; nscid<2; nscid++) { for (nscid=0; nscid<2; nscid++) {
if (n_idDMRS) nid = Nid[nscid];
nid = n_idDMRS[nscid]; for (ns=0; ns<fp->slots_per_frame; ns++) {
else for (l=0; l<fp->symbols_per_slot; l++) {
nid = gNB->frame_parms.Nid_cell; reset = 1;
x2 = ((1<<17) * (fp->symbols_per_slot*ns+l+1) * ((nid<<1)+1) +((nid<<1)+nscid));
//printf("gold pdsch nid %d lbar %d\n",nid,lbar); LOG_D(PHY,"DMRS slot %d, symb %d x2 %x\n",ns,l,x2);
for (ns=0; ns<20; ns++) {
for (l=0; l<length_dmrs; l++) {
x2tmp0 = ((14*ns+(lbar+l)+1)*((nid<<1)+1))<<17;
x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31); //cinit
//printf("ns %d gold pdsch x2 %d\n",ns,x2);
x1 = 1+ (1<<31);
x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
// skip first 50 double words (1600 bits)
for (n=1; n<50; n++) {
x1 = (x1>>1) ^ (x1>>4);
x1 = x1 ^ (x1<<31) ^ (x1<<28);
x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
//printf("x1 : %x, x2 : %x\n",x1,x2);
}
for (n=0; n<NR_MAX_PUSCH_DMRS_INIT_LENGTH_DWORD; n++) { for (n=0; n<NR_MAX_PUSCH_DMRS_INIT_LENGTH_DWORD; n++) {
x1 = (x1>>1) ^ (x1>>4); gNB->nr_gold_pusch_dmrs[nscid][ns][l][n] = lte_gold_generic(&x1, &x2, reset);
x1 = x1 ^ (x1<<31) ^ (x1<<28); reset = 0;
x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
gNB->nr_gold_pusch[nscid][ns][l][n] = x1^x2;
// if ((ns==2)&&(l==0))
//printf("n=%d : c %x\n",n,x1^x2);
} }
} }
} }
} }
......
...@@ -39,7 +39,7 @@ void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB); ...@@ -39,7 +39,7 @@ void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB);
void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid); void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid);
void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid); void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid);
void nr_gold_pusch(PHY_VARS_gNB* gNB, unsigned short lbar,unsigned short *n_idDMRS, unsigned short length_dmrs); void nr_gold_pusch(PHY_VARS_gNB* gNB, uint32_t *Nid);
int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB, int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
unsigned int Ns, unsigned int Ns,
......
...@@ -123,9 +123,6 @@ uint8_t get_K_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint16_t N_RB){ ...@@ -123,9 +123,6 @@ uint8_t get_K_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint16_t N_RB){
* NAME : set_ptrs_symb_idx * NAME : set_ptrs_symb_idx
* *
* PARAMETERS : ptrs_symbols PTRS OFDM symbol indicies bit mask * PARAMETERS : ptrs_symbols PTRS OFDM symbol indicies bit mask
* ptrs_UplinkConfig PTRS uplink configuration
* dmrs_UplinkConfig DMRS uplink configuration
* mapping_type PUSCH time domain mapping type
* duration_in_symbols number of scheduled PUSCH ofdm symbols * duration_in_symbols number of scheduled PUSCH ofdm symbols
* start_symbol first ofdm symbol of PUSCH within slot * start_symbol first ofdm symbol of PUSCH within slot
* L_ptrs the parameter L_ptrs * L_ptrs the parameter L_ptrs
...@@ -138,64 +135,61 @@ uint8_t get_K_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint16_t N_RB){ ...@@ -138,64 +135,61 @@ uint8_t get_K_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint16_t N_RB){
*********************************************************************/ *********************************************************************/
void set_ptrs_symb_idx(uint16_t *ptrs_symbols, void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
ptrs_UplinkConfig_t *ptrs_UplinkConfig,
dmrs_UplinkConfig_t *dmrs_UplinkConfig,
uint8_t mapping_type,
uint8_t duration_in_symbols, uint8_t duration_in_symbols,
uint8_t start_symbol, uint8_t start_symbol,
uint8_t dmrs_type,
uint8_t L_ptrs, uint8_t L_ptrs,
uint8_t pusch_maxLength,
uint16_t ofdm_symbol_size) { uint16_t ofdm_symbol_size) {
uint8_t i, last_symbol, is_dmrs_symbol1, is_dmrs_symbol2; uint8_t i, last_symbol, is_dmrs_symbol1, is_dmrs_symbol2;
int16_t l_ref; int16_t l_ref;
*ptrs_symbols = 0;
i = 0;
is_dmrs_symbol1 = 0;
is_dmrs_symbol2 = 0;
l_ref = start_symbol;
last_symbol = start_symbol + duration_in_symbols - 1;
while ( (l_ref + i*L_ptrs) <= last_symbol) {
is_dmrs_symbol1 = is_dmrs_symbol(max((l_ref + (i-1)*L_ptrs + 1), l_ref),
0,
0,
0,
0,
0,
duration_in_symbols,
dmrs_type,
ofdm_symbol_size);
is_dmrs_symbol2 = is_dmrs_symbol(l_ref + i*L_ptrs,
0,
0,
0,
0,
0,
duration_in_symbols,
dmrs_type,
ofdm_symbol_size);
if ( is_dmrs_symbol1 + is_dmrs_symbol2 > 0 ) {
if (pusch_maxLength == 2)
l_ref = l_ref + i*L_ptrs + 1;
else
l_ref = l_ref + i*L_ptrs;
i = 1;
continue;
*ptrs_symbols = 0; }
i = 0;
is_dmrs_symbol1 = 0; *ptrs_symbols = *ptrs_symbols | (1<<(l_ref + i*L_ptrs));
is_dmrs_symbol2 = 0; i++;
l_ref = start_symbol; }
last_symbol = start_symbol + duration_in_symbols - 1;
while ( (l_ref + i*L_ptrs) <= last_symbol) {
is_dmrs_symbol1 = is_dmrs_symbol(max((l_ref + (i-1)*L_ptrs + 1), l_ref),
0,
0,
0,
0,
0,
duration_in_symbols,
dmrs_UplinkConfig,
mapping_type,
ofdm_symbol_size);
is_dmrs_symbol2 = is_dmrs_symbol(l_ref + i*L_ptrs,
0,
0,
0,
0,
0,
duration_in_symbols,
dmrs_UplinkConfig,
mapping_type,
ofdm_symbol_size);
if ( is_dmrs_symbol1 + is_dmrs_symbol2 > 0 ) {
if (dmrs_UplinkConfig->pusch_maxLength == 2)
l_ref = l_ref + i*L_ptrs + 1;
else
l_ref = l_ref + i*L_ptrs;
i = 1;
continue;
}
*ptrs_symbols = *ptrs_symbols | (1<<(l_ref + i*L_ptrs));
i++;
}
} }
/******************************************************************* /*******************************************************************
...@@ -313,7 +307,7 @@ uint8_t is_ptrs_symbol(uint8_t l, ...@@ -313,7 +307,7 @@ uint8_t is_ptrs_symbol(uint8_t l,
uint16_t start_sc, uint16_t start_sc,
uint16_t ofdm_symbol_size, uint16_t ofdm_symbol_size,
pusch_dmrs_type_t pusch_dmrs_type, pusch_dmrs_type_t pusch_dmrs_type,
ptrs_UplinkConfig_t *ptrs_UplinkConfig) { uint8_t resourceElementOffset) {
uint8_t is_ptrs_freq, is_ptrs_time; uint8_t is_ptrs_freq, is_ptrs_time;
int16_t k_RE_ref; int16_t k_RE_ref;
...@@ -321,7 +315,7 @@ uint8_t is_ptrs_symbol(uint8_t l, ...@@ -321,7 +315,7 @@ uint8_t is_ptrs_symbol(uint8_t l,
is_ptrs_freq = 0; is_ptrs_freq = 0;
is_ptrs_time = 0; is_ptrs_time = 0;
k_RE_ref = get_kRE_ref(dmrs_antenna_port, pusch_dmrs_type, ptrs_UplinkConfig->resourceElementOffset); k_RE_ref = get_kRE_ref(dmrs_antenna_port, pusch_dmrs_type, resourceElementOffset);
is_ptrs_freq = is_ptrs_subcarrier(k, K_ptrs, n_rnti, N_RB, k_RE_ref, start_sc, ofdm_symbol_size); is_ptrs_freq = is_ptrs_subcarrier(k, K_ptrs, n_rnti, N_RB, k_RE_ref, start_sc, ofdm_symbol_size);
...@@ -426,4 +420,4 @@ int main(int argc, char const *argv[]) ...@@ -426,4 +420,4 @@ int main(int argc, char const *argv[])
return 0; return 0;
} }
*/ */
\ No newline at end of file
...@@ -52,12 +52,11 @@ int16_t get_kRE_ref(uint8_t dmrs_antenna_port, uint8_t pusch_dmrs_type, uint8_t ...@@ -52,12 +52,11 @@ int16_t get_kRE_ref(uint8_t dmrs_antenna_port, uint8_t pusch_dmrs_type, uint8_t
uint8_t get_K_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint16_t N_RB); uint8_t get_K_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint16_t N_RB);
void set_ptrs_symb_idx(uint16_t *ptrs_symbols, void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
ptrs_UplinkConfig_t *ptrs_UplinkConfig,
dmrs_UplinkConfig_t *dmrs_UplinkConfig,
uint8_t mapping_type,
uint8_t duration_in_symbols, uint8_t duration_in_symbols,
uint8_t start_symbol, uint8_t start_symbol,
uint8_t dmrs_type,
uint8_t L_ptrs, uint8_t L_ptrs,
uint8_t pusch_maxLength,
uint16_t ofdm_symbol_size); uint16_t ofdm_symbol_size);
uint8_t get_L_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint8_t I_mcs); uint8_t get_L_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint8_t I_mcs);
...@@ -75,8 +74,8 @@ uint8_t is_ptrs_symbol(uint8_t l, ...@@ -75,8 +74,8 @@ uint8_t is_ptrs_symbol(uint8_t l,
uint16_t start_sc, uint16_t start_sc,
uint16_t ofdm_symbol_size, uint16_t ofdm_symbol_size,
pusch_dmrs_type_t pusch_dmrs_type, pusch_dmrs_type_t pusch_dmrs_type,
ptrs_UplinkConfig_t *ptrs_UplinkConfig); uint8_t resourceElementOffset);
#endif /* PTRS_NR_H */ #endif /* PTRS_NR_H */
\ No newline at end of file
...@@ -333,23 +333,9 @@ void nr_fill_ulsch(PHY_VARS_gNB *gNB, ...@@ -333,23 +333,9 @@ void nr_fill_ulsch(PHY_VARS_gNB *gNB,
ulsch->harq_mask |= 1<<harq_pid; ulsch->harq_mask |= 1<<harq_pid;
ulsch->harq_process_id[slot] = harq_pid; ulsch->harq_process_id[slot] = harq_pid;
nfapi_nr_ul_config_ulsch_pdu *rel15_ul = &ulsch->harq_processes[harq_pid]->ulsch_pdu; memcpy((void*)&ulsch->harq_processes[harq_pid]->ulsch_pdu, (void*)ulsch_pdu, sizeof(nfapi_nr_pusch_pdu_t));
LOG_D(PHY,"Initializing nFAPI for ULSCH, UE %d, harq_pid %d\n",ulsch_id,harq_pid); LOG_D(PHY,"Initializing nFAPI for ULSCH, UE %d, harq_pid %d\n",ulsch_id,harq_pid);
//FK this is still a bad hack. We need to replace the L1 FAPI structures with the new scf ones as well.
rel15_ul->rnti = ulsch_pdu->rnti;
rel15_ul->ulsch_pdu_rel15.start_rb = ulsch_pdu->rb_start;
rel15_ul->ulsch_pdu_rel15.number_rbs = ulsch_pdu->rb_size;
rel15_ul->ulsch_pdu_rel15.start_symbol = ulsch_pdu->start_symbol_index;
rel15_ul->ulsch_pdu_rel15.number_symbols = ulsch_pdu->nr_of_symbols;
rel15_ul->ulsch_pdu_rel15.length_dmrs = gNB->pusch_config.dmrs_UplinkConfig.pusch_maxLength;
rel15_ul->ulsch_pdu_rel15.Qm = ulsch_pdu->qam_mod_order;
rel15_ul->ulsch_pdu_rel15.mcs = ulsch_pdu->mcs_index;
rel15_ul->ulsch_pdu_rel15.rv = ulsch_pdu->pusch_data.rv_index;
rel15_ul->ulsch_pdu_rel15.n_layers = ulsch_pdu->nrOfLayers;
rel15_ul->ulsch_pdu_rel15.R = ulsch_pdu->target_code_rate;
} }
...@@ -68,15 +68,8 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, ...@@ -68,15 +68,8 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
void nr_ulsch_extract_rbs_single(int32_t **rxdataF, void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
NR_gNB_PUSCH *pusch_vars, NR_gNB_PUSCH *pusch_vars,
unsigned char symbol, unsigned char symbol,
unsigned short start_rb, nfapi_nr_pusch_pdu_t *pusch_pdu,
unsigned short nb_rb_pusch, NR_DL_FRAME_PARMS *frame_parms);
uint16_t n_rnti,
NR_DL_FRAME_PARMS *frame_parms,
uint16_t number_symbols,
uint8_t mapping_type,
uint8_t ptrs_configured,
dmrs_UplinkConfig_t *dmrs_UplinkConfig,
ptrs_UplinkConfig_t *ptrs_Uplink_Config);
void nr_ulsch_scale_channel(int32_t **ul_ch_estimates_ext, void nr_ulsch_scale_channel(int32_t **ul_ch_estimates_ext,
NR_DL_FRAME_PARMS *frame_parms, NR_DL_FRAME_PARMS *frame_parms,
......
...@@ -53,12 +53,11 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -53,12 +53,11 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
uint8_t UE_id, uint8_t UE_id,
short *ulsch_llr, short *ulsch_llr,
NR_DL_FRAME_PARMS *frame_parms, NR_DL_FRAME_PARMS *frame_parms,
nfapi_nr_pusch_pdu_t *pusch_pdu,
uint32_t frame, uint32_t frame,
uint16_t nb_symb_sch,
uint16_t nb_re_dmrs,
uint8_t nr_tti_rx, uint8_t nr_tti_rx,
uint8_t harq_pid, uint8_t harq_pid,
uint8_t is_crnti); uint32_t G);
/*! \brief Perform PUSCH unscrambling. TS 38.211 V15.4.0 subclause 6.3.1.1 /*! \brief Perform PUSCH unscrambling. TS 38.211 V15.4.0 subclause 6.3.1.1
......
...@@ -121,7 +121,7 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations,uint16_t N_RB_UL, uint ...@@ -121,7 +121,7 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations,uint16_t N_RB_UL, uint
if (N_RB_UL != 273) { if (N_RB_UL != 273) {
a_segments = a_segments*N_RB_UL; a_segments = a_segments*N_RB_UL;
a_segments = a_segments/273; a_segments = a_segments/273;
} }
uint16_t ulsch_bytes = a_segments*1056; // allocated bytes per segment uint16_t ulsch_bytes = a_segments*1056; // allocated bytes per segment
...@@ -295,15 +295,13 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -295,15 +295,13 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
uint8_t UE_id, uint8_t UE_id,
short *ulsch_llr, short *ulsch_llr,
NR_DL_FRAME_PARMS *frame_parms, NR_DL_FRAME_PARMS *frame_parms,
nfapi_nr_pusch_pdu_t *pusch_pdu,
uint32_t frame, uint32_t frame,
uint16_t nb_symb_sch,
uint16_t nb_re_dmrs,
uint8_t nr_tti_rx, uint8_t nr_tti_rx,
uint8_t harq_pid, uint8_t harq_pid,
uint8_t is_crnti) uint32_t G) {
{
uint32_t A,E; uint32_t A,E;
uint32_t G;
uint32_t ret, offset; uint32_t ret, offset;
int32_t no_iteration_ldpc, length_dec; int32_t no_iteration_ldpc, length_dec;
uint32_t r,r_offset=0,Kr=8424,Kr_bytes,K_bytes_F,err_flag=0; uint32_t r,r_offset=0,Kr=8424,Kr_bytes,K_bytes_F,err_flag=0;
...@@ -317,7 +315,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -317,7 +315,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
NR_gNB_ULSCH_t *ulsch = phy_vars_gNB->ulsch[UE_id][0]; NR_gNB_ULSCH_t *ulsch = phy_vars_gNB->ulsch[UE_id][0];
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid]; NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
nfapi_nr_ul_config_ulsch_pdu_rel15_t *nfapi_ulsch_pdu_rel15 = &harq_process->ulsch_pdu.ulsch_pdu_rel15;
t_nrLDPC_dec_params decParams; t_nrLDPC_dec_params decParams;
t_nrLDPC_dec_params* p_decParams = &decParams; t_nrLDPC_dec_params* p_decParams = &decParams;
...@@ -337,13 +334,11 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -337,13 +334,11 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
double Coderate = 0.0; double Coderate = 0.0;
// ------------------------------------------------------------------ // ------------------------------------------------------------------
uint16_t nb_rb = nfapi_ulsch_pdu_rel15->number_rbs; uint16_t nb_rb = pusch_pdu->rb_size;
uint16_t number_symbols = nfapi_ulsch_pdu_rel15->number_symbols; uint8_t Qm = pusch_pdu->qam_mod_order;
uint8_t Qm = nfapi_ulsch_pdu_rel15->Qm; uint16_t R = pusch_pdu->target_code_rate;
uint16_t R = nfapi_ulsch_pdu_rel15->R; uint8_t mcs = pusch_pdu->mcs_index;
uint8_t mcs = nfapi_ulsch_pdu_rel15->mcs; uint8_t n_layers = pusch_pdu->nrOfLayers;
uint8_t n_layers = nfapi_ulsch_pdu_rel15->n_layers;
uint8_t length_dmrs = nfapi_ulsch_pdu_rel15->length_dmrs;
// ------------------------------------------------------------------ // ------------------------------------------------------------------
uint32_t i,j; uint32_t i,j;
...@@ -363,19 +358,20 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -363,19 +358,20 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
} }
// harq_process->trials[nfapi_ulsch_pdu_rel15->round]++; // harq_process->trials[nfapi_ulsch_pdu_rel15->round]++;
harq_process->TBS = nr_compute_tbs(Qm, R, nb_rb, number_symbols, nb_re_dmrs*length_dmrs, 0, n_layers); harq_process->TBS = pusch_pdu->pusch_data.tb_size;
A = harq_process->TBS; A = (harq_process->TBS)<<3;
ret = ulsch->max_ldpc_iterations + 1; ret = ulsch->max_ldpc_iterations + 1;
G = nr_get_G(nb_rb, number_symbols, nb_re_dmrs, length_dmrs, Qm, n_layers); LOG_D(PHY,"ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_rb %d, Qm %d, n_layers %d\n",harq_pid,A,G, mcs, n_layers, nb_rb, Qm, n_layers);
LOG_D(PHY,"ULSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d, nb_re_dmrs %d, Qm %d, n_layers %d\n",harq_pid,A,G, mcs, n_layers, nb_symb_sch,nb_rb, nb_re_dmrs, Qm, n_layers);
if (harq_process->round == 0) { if (harq_process->round == 0) {
// This is a new packet, so compute quantities regarding segmentation // This is a new packet, so compute quantities regarding segmentation
harq_process->B = A+24; if (A > 3824)
harq_process->B = A+24;
else
harq_process->B = A+16;
if (R<1024) if (R<1024)
Coderate = (float) R /(float) 1024; Coderate = (float) R /(float) 1024;
...@@ -412,20 +408,20 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -412,20 +408,20 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
} }
} }
// [hna] Perform nr_segmenation with input and output set to NULL to calculate only (B, C, K, Z, F) // [hna] Perform nr_segmenation with input and output set to NULL to calculate only (B, C, K, Z, F)
nr_segmentation(NULL, nr_segmentation(NULL,
NULL, NULL,
harq_process->B, harq_process->B,
&harq_process->C, &harq_process->C,
&harq_process->K, &harq_process->K,
&harq_process->Z, // [hna] Z is Zc &harq_process->Z, // [hna] Z is Zc
&harq_process->F, &harq_process->F,
p_decParams->BG); p_decParams->BG);
#ifdef DEBUG_ULSCH_DECODING #ifdef DEBUG_ULSCH_DECODING
printf("ulsch decoding nr segmentation Z %d\n", harq_process->Z); printf("ulsch decoding nr segmentation Z %d\n", harq_process->Z);
if (!frame%100) if (!frame%100)
printf("K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, harq_process->Z, harq_process->Nl); printf("K %d C %d Z %d\n", harq_process->K, harq_process->C, harq_process->Z);
#endif #endif
} }
p_decParams->Z = harq_process->Z; p_decParams->Z = harq_process->Z;
...@@ -442,7 +438,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -442,7 +438,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
if (nb_rb != 273) { if (nb_rb != 273) {
a_segments = a_segments*nb_rb; a_segments = a_segments*nb_rb;
a_segments = a_segments/273; a_segments = a_segments/273;
} }
if (harq_process->C > a_segments) { if (harq_process->C > a_segments) {
LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,a_segments); LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,a_segments);
...@@ -460,7 +456,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -460,7 +456,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
K_bytes_F = Kr_bytes-(harq_process->F>>3); K_bytes_F = Kr_bytes-(harq_process->F>>3);
for (r=0; r<harq_process->C; r++) { for (r=0; r<harq_process->C; r++) {
E = nr_get_E(G, harq_process->C, nfapi_ulsch_pdu_rel15->Qm, nfapi_ulsch_pdu_rel15->n_layers, r); E = nr_get_E(G, harq_process->C, Qm, n_layers, r);
#if gNB_TIMING_TRACE #if gNB_TIMING_TRACE
start_meas(ulsch_deinterleaving_stats); start_meas(ulsch_deinterleaving_stats);
...@@ -473,7 +469,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -473,7 +469,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
//////////////////////////// ulsch_llr =====> harq_process->e ////////////////////////////// //////////////////////////// ulsch_llr =====> harq_process->e //////////////////////////////
nr_deinterleaving_ldpc(E, nr_deinterleaving_ldpc(E,
nfapi_ulsch_pdu_rel15->Qm, Qm,
harq_process->e[r], harq_process->e[r],
ulsch_llr+r_offset); ulsch_llr+r_offset);
...@@ -493,10 +489,10 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -493,10 +489,10 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
harq_pid,r, G, harq_pid,r, G,
Kr*3, Kr*3,
harq_process->TBS, harq_process->TBS,
nfapi_ulsch_pdu_rel15->Qm, Qm,
nfapi_ulsch_pdu_rel15->number_rbs, nb_rb,
nfapi_ulsch_pdu_rel15->n_layers, n_layers,
nfapi_ulsch_pdu_rel15->rv, pusch_pdu->pusch_data.rv_index,
harq_process->round); harq_process->round);
#endif #endif
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
...@@ -508,7 +504,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -508,7 +504,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
///////////////////////// harq_process->e =====> harq_process->d ///////////////////////// ///////////////////////// harq_process->e =====> harq_process->d /////////////////////////
Tbslbrm = nr_compute_tbslbrm(0,nb_rb,nfapi_ulsch_pdu_rel15->n_layers,harq_process->C); Tbslbrm = nr_compute_tbslbrm(0,nb_rb,n_layers,harq_process->C);
if (nr_rate_matching_ldpc_rx(Ilbrm, if (nr_rate_matching_ldpc_rx(Ilbrm,
Tbslbrm, Tbslbrm,
...@@ -517,7 +513,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -517,7 +513,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
harq_process->d[r], harq_process->d[r],
harq_process->e[r], harq_process->e[r],
harq_process->C, harq_process->C,
nfapi_ulsch_pdu_rel15->rv, pusch_pdu->pusch_data.rv_index,
(harq_process->round==0)?1:0, (harq_process->round==0)?1:0,
E, E,
harq_process->F, harq_process->F,
...@@ -554,7 +550,11 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -554,7 +550,11 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
// printf("done\n"); // printf("done\n");
if (harq_process->C == 1) { if (harq_process->C == 1) {
crc_type = CRC24_A; if (A > 3824)
crc_type = CRC24_A;
else
crc_type = CRC16;
length_dec = harq_process->B; length_dec = harq_process->B;
} }
else { else {
...@@ -653,7 +653,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -653,7 +653,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
int32_t tti_rx_prev = nr_tti_rx - 1; int32_t tti_rx_prev = nr_tti_rx - 1;
if (tti_rx_prev < 0) { if (tti_rx_prev < 0) {
frame_rx_prev--; frame_rx_prev--;
tti_rx_prev += 10*frame_parms->ttis_per_subframe; tti_rx_prev += frame_parms->slots_per_frame;
} }
frame_rx_prev = frame_rx_prev%1024; frame_rx_prev = frame_rx_prev%1024;
...@@ -677,10 +677,8 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -677,10 +677,8 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
ulsch->harq_mask &= ~(1 << harq_pid); ulsch->harq_mask &= ~(1 << harq_pid);
} }
if(is_crnti) { // LOG_D(PHY,"[gNB %d] ULSCH: Setting NACK for nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
LOG_D(PHY,"[gNB %d] ULSCH: Setting NACK for nr_tti_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n", // phy_vars_gNB->Mod_id,nr_tti_rx,harq_pid,harq_process->status,harq_process->round,ulsch->Mlimit,harq_process->TBS);
phy_vars_gNB->Mod_id,nr_tti_rx,harq_pid,harq_process->status,harq_process->round,ulsch->Mlimit,harq_process->TBS);
}
harq_process->handled = 1; harq_process->handled = 1;
ret = ulsch->max_ldpc_iterations + 1; ret = ulsch->max_ldpc_iterations + 1;
...@@ -700,10 +698,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -700,10 +698,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
// harq_process->harq_ack.harq_id = harq_pid; // harq_process->harq_ack.harq_id = harq_pid;
// harq_process->harq_ack.send_harq_status = 1; // harq_process->harq_ack.send_harq_status = 1;
if(is_crnti) // LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for nr_tti_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_gNB->Mod_id,nr_tti_rx,harq_pid,harq_process->round,harq_process->TBS);
{
LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for nr_tti_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_gNB->Mod_id,nr_tti_rx,harq_pid,harq_process->round,harq_process->TBS);
}
// Reassembly of Transport block here // Reassembly of Transport block here
offset = 0; offset = 0;
......
...@@ -292,17 +292,35 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch, ...@@ -292,17 +292,35 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
printf("%02x.",a[i]); printf("%02x.",a[i]);
printf("\n"); printf("\n");
*/ */
// Add 24-bit crc (polynomial A) to payload if (A > 3824) {
crc = crc24a(harq_process->a,A)>>8; // Add 24-bit crc (polynomial A) to payload
harq_process->a[A>>3] = ((uint8_t*)&crc)[2]; crc = crc24a(harq_process->a,A)>>8;
harq_process->a[1+(A>>3)] = ((uint8_t*)&crc)[1]; harq_process->a[A>>3] = ((uint8_t*)&crc)[2];
harq_process->a[2+(A>>3)] = ((uint8_t*)&crc)[0]; harq_process->a[1+(A>>3)] = ((uint8_t*)&crc)[1];
//printf("CRC %x (A %d)\n",crc,A); harq_process->a[2+(A>>3)] = ((uint8_t*)&crc)[0];
//printf("a0 %d a1 %d a2 %d\n", a[A>>3], a[1+(A>>3)], a[2+(A>>3)]); //printf("CRC %x (A %d)\n",crc,A);
//printf("a0 %d a1 %d a2 %d\n", a[A>>3], a[1+(A>>3)], a[2+(A>>3)]);
harq_process->B = A+24; harq_process->B = A+24;
memcpy(harq_process->b,harq_process->a,(A/8)+4); AssertFatal((A/8)+4 <= MAX_NR_ULSCH_PAYLOAD_BYTES,"A %d is too big (A/8+4 = %d > %d)\n",A,(A/8)+4,MAX_NR_ULSCH_PAYLOAD_BYTES);
memcpy(harq_process->b,harq_process->a,(A/8)+4);
}
else {
// Add 16-bit crc (polynomial A) to payload
crc = crc16(harq_process->a,A)>>16;
harq_process->a[A>>3] = ((uint8_t*)&crc)[1];
harq_process->a[1+(A>>3)] = ((uint8_t*)&crc)[0];
//printf("CRC %x (A %d)\n",crc,A);
//printf("a0 %d a1 %d \n", a[A>>3], a[1+(A>>3)]);
harq_process->B = A+16;
AssertFatal((A/8)+3 <= MAX_NR_ULSCH_PAYLOAD_BYTES,"A %d is too big (A/8+3 = %d > %d)\n",A,(A/8)+3,MAX_NR_ULSCH_PAYLOAD_BYTES);
memcpy(harq_process->b,harq_process->a,(A/8)+3); // using 3 bytes to mimic the case of 24 bit crc
}
/////////// ///////////
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
......
...@@ -108,7 +108,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, ...@@ -108,7 +108,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
int8_t Wf[2], Wt[2], l_prime[2], delta; int8_t Wf[2], Wt[2], l_prime[2], delta;
uint16_t n_dmrs, code_rate, number_dmrs_symbols, k; uint16_t n_dmrs, code_rate, number_dmrs_symbols, k;
uint8_t dmrs_type; uint8_t dmrs_type;
uint8_t mapping_type;
int ap, start_symbol, Nid_cell, i; int ap, start_symbol, Nid_cell, i;
int sample_offsetF, N_RE_prime, N_PRB_oh; int sample_offsetF, N_RE_prime, N_PRB_oh;
uint16_t n_rnti; uint16_t n_rnti;
...@@ -129,8 +128,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, ...@@ -129,8 +128,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
N_PRB_oh = 0; // higher layer (RRC) parameter xOverhead in PUSCH-ServingCellConfig N_PRB_oh = 0; // higher layer (RRC) parameter xOverhead in PUSCH-ServingCellConfig
number_dmrs_symbols = 0; number_dmrs_symbols = 0;
mapping_type = UE->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType;
for (cwd_index = 0;cwd_index < num_of_codewords; cwd_index++) { for (cwd_index = 0;cwd_index < num_of_codewords; cwd_index++) {
ulsch_ue = UE->ulsch[thread_id][gNB_id][cwd_index]; ulsch_ue = UE->ulsch[thread_id][gNB_id][cwd_index];
...@@ -146,8 +143,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, ...@@ -146,8 +143,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
0, 0,
0, 0,
harq_process_ul_ue->number_of_symbols, harq_process_ul_ue->number_of_symbols,
&UE->pusch_config.dmrs_UplinkConfig, UE->pusch_config.dmrs_UplinkConfig.pusch_dmrs_type,
mapping_type,
frame_parms->ofdm_symbol_size); frame_parms->ofdm_symbol_size);
ulsch_ue->length_dmrs = UE->pusch_config.dmrs_UplinkConfig.pusch_maxLength; ulsch_ue->length_dmrs = UE->pusch_config.dmrs_UplinkConfig.pusch_maxLength;
...@@ -303,12 +299,11 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, ...@@ -303,12 +299,11 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
ulsch_ue->ptrs_symbols = 0; ulsch_ue->ptrs_symbols = 0;
set_ptrs_symb_idx(&ulsch_ue->ptrs_symbols, set_ptrs_symb_idx(&ulsch_ue->ptrs_symbols,
ptrs_Uplink_Config,
&UE->pusch_config.dmrs_UplinkConfig,
1,
harq_process_ul_ue->number_of_symbols, harq_process_ul_ue->number_of_symbols,
start_symbol, start_symbol,
dmrs_type,
L_ptrs, L_ptrs,
ulsch_ue->length_dmrs,
frame_parms->ofdm_symbol_size); frame_parms->ofdm_symbol_size);
} }
...@@ -347,8 +342,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, ...@@ -347,8 +342,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
0, 0,
0, 0,
harq_process_ul_ue->number_of_symbols, harq_process_ul_ue->number_of_symbols,
&UE->pusch_config.dmrs_UplinkConfig, dmrs_type,
mapping_type,
frame_parms->ofdm_symbol_size); frame_parms->ofdm_symbol_size);
if (is_dmrs == 1) if (is_dmrs == 1)
...@@ -414,8 +408,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, ...@@ -414,8 +408,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
n, n,
delta, delta,
harq_process_ul_ue->number_of_symbols, harq_process_ul_ue->number_of_symbols,
&UE->pusch_config.dmrs_UplinkConfig, dmrs_type,
mapping_type,
frame_parms->ofdm_symbol_size); frame_parms->ofdm_symbol_size);
if (UE->ptrs_configured == 1){ if (UE->ptrs_configured == 1){
...@@ -430,7 +423,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, ...@@ -430,7 +423,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
start_sc, start_sc,
frame_parms->ofdm_symbol_size, frame_parms->ofdm_symbol_size,
UE->pusch_config.dmrs_UplinkConfig.pusch_dmrs_type, UE->pusch_config.dmrs_UplinkConfig.pusch_dmrs_type,
ptrs_Uplink_Config); ptrs_Uplink_Config->resourceElementOffset);
} }
if (is_dmrs == 1) { if (is_dmrs == 1) {
......
...@@ -162,7 +162,7 @@ typedef struct { ...@@ -162,7 +162,7 @@ typedef struct {
typedef struct { typedef struct {
/// Nfapi ULSCH PDU /// Nfapi ULSCH PDU
nfapi_nr_ul_config_ulsch_pdu ulsch_pdu; nfapi_nr_pusch_pdu_t ulsch_pdu;
/// Frame where current HARQ round was sent /// Frame where current HARQ round was sent
uint32_t frame; uint32_t frame;
/// Subframe where current HARQ round was sent /// Subframe where current HARQ round was sent
...@@ -410,7 +410,7 @@ typedef struct { ...@@ -410,7 +410,7 @@ typedef struct {
/// \brief llr values. /// \brief llr values.
/// - first index: ? [0..1179743] (hard coded) /// - first index: ? [0..1179743] (hard coded)
int16_t *llr; int16_t *llr;
// DMRS symbol index, to be updated every DMRS symbol within a slot. /// DMRS symbol index, to be updated every DMRS symbol within a slot.
uint8_t dmrs_symbol; uint8_t dmrs_symbol;
// PTRS symbol index, to be updated every PTRS symbol within a slot. // PTRS symbol index, to be updated every PTRS symbol within a slot.
uint8_t ptrs_symbol_index; uint8_t ptrs_symbol_index;
...@@ -418,6 +418,8 @@ typedef struct { ...@@ -418,6 +418,8 @@ typedef struct {
uint16_t ptrs_symbols; uint16_t ptrs_symbols;
// PTRS subcarriers per OFDM symbol // PTRS subcarriers per OFDM symbol
uint16_t ptrs_sc_per_ofdm_symbol; uint16_t ptrs_sc_per_ofdm_symbol;
/// flag to verify if channel level computation is done
uint8_t cl_done;
} NR_gNB_PUSCH; } NR_gNB_PUSCH;
...@@ -672,11 +674,8 @@ typedef struct PHY_VARS_gNB_s { ...@@ -672,11 +674,8 @@ typedef struct PHY_VARS_gNB_s {
/// PDSCH DMRS sequence /// PDSCH DMRS sequence
uint32_t ****nr_gold_pdsch_dmrs; uint32_t ****nr_gold_pdsch_dmrs;
/// flag to indicate if PTRS is configured
uint8_t ptrs_configured;
/// PUSCH DMRS /// PUSCH DMRS
uint32_t nr_gold_pusch[2][20][2][NR_MAX_PUSCH_DMRS_INIT_LENGTH_DWORD]; uint32_t ****nr_gold_pusch_dmrs;
/// Indicator set to 0 after first SR /// Indicator set to 0 after first SR
uint8_t first_sr[NUMBER_OF_NR_SR_MAX]; uint8_t first_sr[NUMBER_OF_NR_SR_MAX];
...@@ -710,12 +709,6 @@ typedef struct PHY_VARS_gNB_s { ...@@ -710,12 +709,6 @@ typedef struct PHY_VARS_gNB_s {
/// counter to average prach energh over first 100 prach opportunities /// counter to average prach energh over first 100 prach opportunities
int prach_energy_counter; int prach_energy_counter;
PUSCH_Config_t pusch_config;
dmrs_UplinkConfig_t dmrs_UplinkConfig;
dmrs_DownlinkConfig_t dmrs_DownlinkConfig;
/* /*
time_stats_t phy_proc; time_stats_t phy_proc;
*/ */
......
...@@ -500,8 +500,8 @@ typedef enum { ...@@ -500,8 +500,8 @@ typedef enum {
pdsch_dmrs_type2 = 2 pdsch_dmrs_type2 = 2
} pdsch_dmrs_type_t; } pdsch_dmrs_type_t;
typedef enum { typedef enum {
pusch_dmrs_type1 = 1, pusch_dmrs_type1 = 0,
pusch_dmrs_type2 = 2 pusch_dmrs_type2 = 1
} pusch_dmrs_type_t; } pusch_dmrs_type_t;
typedef enum { typedef enum {
pdsch_dmrs_pos0 = 0, pdsch_dmrs_pos0 = 0,
......
...@@ -214,21 +214,16 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, ...@@ -214,21 +214,16 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH_id, uint8_t harq_pid) void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH_id, uint8_t harq_pid)
{ {
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
nfapi_nr_ul_config_ulsch_pdu *rel15_ul = &gNB->ulsch[ULSCH_id][0]->harq_processes[harq_pid]->ulsch_pdu; nfapi_nr_pusch_pdu_t *pusch_pdu = &gNB->ulsch[ULSCH_id][0]->harq_processes[harq_pid]->ulsch_pdu;
nfapi_nr_ul_config_ulsch_pdu_rel15_t *nfapi_ulsch_pdu_rel15 = &rel15_ul->ulsch_pdu_rel15;
uint8_t ret; uint8_t ret;
uint8_t l, number_dmrs_symbols = 0; uint8_t l, number_dmrs_symbols = 0;
uint8_t mapping_type;
uint32_t G; uint32_t G;
int Nid_cell = 0; // [hna] shouldn't be a local variable (should be signaled)
uint16_t start_symbol, number_symbols, nb_re_dmrs; uint16_t start_symbol, number_symbols, nb_re_dmrs;
mapping_type = gNB->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType; start_symbol = pusch_pdu->start_symbol_index;
number_symbols = pusch_pdu->nr_of_symbols;
start_symbol = nfapi_ulsch_pdu_rel15->start_symbol;
number_symbols = nfapi_ulsch_pdu_rel15->number_symbols;
for (l = start_symbol; l < start_symbol + number_symbols; l++) for (l = start_symbol; l < start_symbol + number_symbols; l++)
number_dmrs_symbols += is_dmrs_symbol(l, number_dmrs_symbols += is_dmrs_symbol(l,
...@@ -238,18 +233,18 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH ...@@ -238,18 +233,18 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
0, 0,
0, 0,
number_symbols, number_symbols,
&gNB->pusch_config.dmrs_UplinkConfig, pusch_pdu->dmrs_config_type,
mapping_type,
frame_parms->ofdm_symbol_size); frame_parms->ofdm_symbol_size);
nb_re_dmrs = ((gNB->pusch_config.dmrs_UplinkConfig.pusch_dmrs_type == pusch_dmrs_type1)?6:4)*number_dmrs_symbols;
G = nr_get_G(nfapi_ulsch_pdu_rel15->number_rbs, nb_re_dmrs = ((pusch_pdu->dmrs_config_type == pusch_dmrs_type1)?6:4)*number_dmrs_symbols;
G = nr_get_G(pusch_pdu->rb_size,
number_symbols, number_symbols,
nb_re_dmrs, nb_re_dmrs,
nfapi_ulsch_pdu_rel15->length_dmrs, 1, // FIXME only single dmrs is implemented
nfapi_ulsch_pdu_rel15->Qm, pusch_pdu->qam_mod_order,
nfapi_ulsch_pdu_rel15->n_layers); pusch_pdu->nrOfLayers);
//---------------------------------------------------------- //----------------------------------------------------------
...@@ -259,23 +254,23 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH ...@@ -259,23 +254,23 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
nr_ulsch_unscrambling(gNB->pusch_vars[ULSCH_id]->llr, nr_ulsch_unscrambling(gNB->pusch_vars[ULSCH_id]->llr,
G, G,
0, 0,
Nid_cell, pusch_pdu->data_scrambling_id,
rel15_ul->rnti); pusch_pdu->rnti);
//---------------------------------------------------------- //----------------------------------------------------------
//--------------------- ULSCH decoding --------------------- //--------------------- ULSCH decoding ---------------------
//---------------------------------------------------------- //----------------------------------------------------------
ret = nr_ulsch_decoding(gNB, ret = nr_ulsch_decoding(gNB,
ULSCH_id, ULSCH_id,
gNB->pusch_vars[ULSCH_id]->llr, gNB->pusch_vars[ULSCH_id]->llr,
frame_parms, frame_parms,
frame_rx, pusch_pdu,
number_symbols, frame_rx,
nb_re_dmrs, slot_rx,
slot_rx, harq_pid,
harq_pid, G);
0);
if (ret > gNB->ulsch[ULSCH_id][0]->max_ldpc_iterations) if (ret > gNB->ulsch[ULSCH_id][0]->max_ldpc_iterations)
LOG_I(PHY, "ULSCH %d in error\n",ULSCH_id); LOG_I(PHY, "ULSCH %d in error\n",ULSCH_id);
......
...@@ -371,7 +371,6 @@ int main(int argc, char **argv) ...@@ -371,7 +371,6 @@ int main(int argc, char **argv)
} }
unsigned char harq_pid = 0; unsigned char harq_pid = 0;
uint8_t is_crnti = 0;
unsigned int TBS = 8424; unsigned int TBS = 8424;
unsigned int available_bits; unsigned int available_bits;
uint8_t nb_re_dmrs = 6; uint8_t nb_re_dmrs = 6;
...@@ -385,7 +384,7 @@ int main(int argc, char **argv) ...@@ -385,7 +384,7 @@ int main(int argc, char **argv)
NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id][0]; NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id][0];
NR_UL_gNB_HARQ_t *harq_process_gNB = ulsch_gNB->harq_processes[harq_pid]; NR_UL_gNB_HARQ_t *harq_process_gNB = ulsch_gNB->harq_processes[harq_pid];
nfapi_nr_ul_config_ulsch_pdu_rel15_t *rel15_ul = &harq_process_gNB->ulsch_pdu.ulsch_pdu_rel15; nfapi_nr_pusch_pdu_t *rel15_ul = &harq_process_gNB->ulsch_pdu;
NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0][0]; NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0][0];
...@@ -397,14 +396,15 @@ int main(int argc, char **argv) ...@@ -397,14 +396,15 @@ int main(int argc, char **argv)
printf("\nAvailable bits %u TBS %u mod_order %d\n", available_bits, TBS, mod_order); printf("\nAvailable bits %u TBS %u mod_order %d\n", available_bits, TBS, mod_order);
/////////// setting rel15_ul parameters /////////// /////////// setting rel15_ul parameters ///////////
rel15_ul->number_rbs = nb_rb; rel15_ul->rb_size = nb_rb;
rel15_ul->number_symbols = nb_symb_sch; rel15_ul->nr_of_symbols = nb_symb_sch;
rel15_ul->Qm = mod_order; rel15_ul->qam_mod_order = mod_order;
rel15_ul->mcs = Imcs; rel15_ul->mcs_index = Imcs;
rel15_ul->rv = rvidx; rel15_ul->pusch_data.rv_index = rvidx;
rel15_ul->n_layers = Nl; rel15_ul->nrOfLayers = Nl;
rel15_ul->length_dmrs = length_dmrs; //rel15_ul->length_dmrs = length_dmrs;
rel15_ul->R = code_rate; rel15_ul->target_code_rate = code_rate;
rel15_ul->pusch_data.tb_size = TBS>>3;
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
double *modulated_input = malloc16(sizeof(double) * 16 * 68 * 384); // [hna] 16 segments, 68*Zc double *modulated_input = malloc16(sizeof(double) * 16 * 68 * 384); // [hna] 16 segments, 68*Zc
...@@ -527,8 +527,15 @@ int main(int argc, char **argv) ...@@ -527,8 +527,15 @@ int main(int argc, char **argv)
exit(-1); exit(-1);
#endif #endif
ret = nr_ulsch_decoding(gNB, UE_id, channel_output_fixed, frame_parms, uint32_t G = nr_get_G(rel15_ul->rb_size,
frame, nb_symb_sch, nb_re_dmrs, subframe, harq_pid, is_crnti); rel15_ul->nr_of_symbols,
nb_re_dmrs,
1, // FIXME only single dmrs is implemented
rel15_ul->qam_mod_order,
rel15_ul->nrOfLayers);
ret = nr_ulsch_decoding(gNB, UE_id, channel_output_fixed, frame_parms, rel15_ul,
frame, subframe, harq_pid, G);
if (ret > ulsch_gNB->max_ldpc_iterations) if (ret > ulsch_gNB->max_ldpc_iterations)
n_errors++; n_errors++;
......
...@@ -511,8 +511,7 @@ int main(int argc, char **argv) ...@@ -511,8 +511,7 @@ int main(int argc, char **argv)
0, 0,
0, 0,
nb_symb_sch, nb_symb_sch,
&UE->pusch_config.dmrs_UplinkConfig, UE->pusch_config.dmrs_UplinkConfig.pusch_dmrs_type,
UE->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType,
frame_parms->ofdm_symbol_size); frame_parms->ofdm_symbol_size);
mod_order = nr_get_Qm_ul(Imcs, 0); mod_order = nr_get_Qm_ul(Imcs, 0);
...@@ -563,10 +562,6 @@ int main(int argc, char **argv) ...@@ -563,10 +562,6 @@ int main(int argc, char **argv)
pusch_pdu->nrOfLayers = 1; pusch_pdu->nrOfLayers = 1;
pusch_pdu->ul_dmrs_symb_pos = 1; pusch_pdu->ul_dmrs_symb_pos = 1;
pusch_pdu->dmrs_config_type = 0; pusch_pdu->dmrs_config_type = 0;
// inserted to make simulation work
// remove the next 2 lines when P7 is integrated from new branch
gNB->pusch_config.dmrs_UplinkConfig.pusch_dmrs_type=pusch_dmrs_type1;
gNB->pusch_config.dmrs_UplinkConfig.pusch_maxLength = length_dmrs;
pusch_pdu->ul_dmrs_scrambling_id = 0; pusch_pdu->ul_dmrs_scrambling_id = 0;
pusch_pdu->scid = 0; pusch_pdu->scid = 0;
pusch_pdu->resource_alloc = 1; pusch_pdu->resource_alloc = 1;
...@@ -580,7 +575,7 @@ int main(int argc, char **argv) ...@@ -580,7 +575,7 @@ int main(int argc, char **argv)
pusch_pdu->pusch_data.rv_index = 0; pusch_pdu->pusch_data.rv_index = 0;
pusch_pdu->pusch_data.harq_process_id = 0; pusch_pdu->pusch_data.harq_process_id = 0;
pusch_pdu->pusch_data.new_data_indicator = 0; pusch_pdu->pusch_data.new_data_indicator = 0;
pusch_pdu->pusch_data.tb_size = TBS; pusch_pdu->pusch_data.tb_size = TBS>>3;
pusch_pdu->pusch_data.num_cb = 0; pusch_pdu->pusch_data.num_cb = 0;
......
...@@ -781,13 +781,13 @@ void nr_schedule_uss_ulsch_phytest(int Mod_idP, ...@@ -781,13 +781,13 @@ void nr_schedule_uss_ulsch_phytest(int Mod_idP,
pusch_pdu->pusch_data.rv_index = 0; pusch_pdu->pusch_data.rv_index = 0;
pusch_pdu->pusch_data.harq_process_id = 0; pusch_pdu->pusch_data.harq_process_id = 0;
pusch_pdu->pusch_data.new_data_indicator = 0; pusch_pdu->pusch_data.new_data_indicator = 0;
pusch_pdu->pusch_data.tb_size = nr_compute_tbs(pusch_pdu->mcs_index, pusch_pdu->pusch_data.tb_size = nr_compute_tbs(pusch_pdu->qam_mod_order,
pusch_pdu->target_code_rate, pusch_pdu->target_code_rate,
pusch_pdu->rb_size, pusch_pdu->rb_size,
pusch_pdu->nr_of_symbols, pusch_pdu->nr_of_symbols,
6, //nb_re_dmrs - not sure where this is coming from - its not in the FAPI 6, //nb_re_dmrs - not sure where this is coming from - its not in the FAPI
0, //nb_rb_oh 0, //nb_rb_oh
pusch_pdu->nrOfLayers = 1); pusch_pdu->nrOfLayers)>>3;
pusch_pdu->pusch_data.num_cb = 0; //CBG not supported pusch_pdu->pusch_data.num_cb = 0; //CBG not supported
//pusch_pdu->pusch_data.cb_present_and_position; //pusch_pdu->pusch_data.cb_present_and_position;
//pusch_pdu->pusch_uci; //pusch_pdu->pusch_uci;
......
...@@ -921,28 +921,6 @@ int extract_length(int startSymbolAndLength) { ...@@ -921,28 +921,6 @@ int extract_length(int startSymbolAndLength) {
if (tmp > 0 && tmp < (14-tmp2)) return(tmp); if (tmp > 0 && tmp < (14-tmp2)) return(tmp);
else return(15-tmp2); else return(15-tmp2);
} }
void fill_initialBWPDLtimeDomainAllocaion(nfapi_nr_config_request_t *cfg,int time_domain_assignment,int *k0,int *mappingType,int *start_symbol,int *length) {
AssertFatal(time_domain_assignment < cfg->pdsch_config.num_PDSCHTimeDomainResourceAllocations.value,"DL time_domain_assignment %d >= %d\n",
time_domain_assignment,cfg->pdsch_config.num_PDSCHTimeDomainResourceAllocations.value);
*k0 = cfg->pdsch_config.PDSCHTimeDomainResourceAllocation_k0[time_domain_assignment].value;
*mappingType = cfg->pdsch_config.PDSCHTimeDomainResourceAllocation_mappingType[time_domain_assignment].value;
*start_symbol = extract_startSymbol(cfg->pdsch_config.PDSCHTimeDomainResourceAllocation_startSymbolAndLength[time_domain_assignment].value);
*length = extract_length(cfg->pdsch_config.PDSCHTimeDomainResourceAllocation_startSymbolAndLength[time_domain_assignment].value);
}
void fill_initialBWPULtimeDomainAllocaion(nfapi_nr_config_request_t *cfg,int time_domain_assignment,int *k2, int *mappingType, int *start_symbol,int *length) {
AssertFatal(time_domain_assignment < cfg->pusch_config.num_PUSCHTimeDomainResourceAllocations.value,"UL time_domain_assignment %d >= %d\n",
time_domain_assignment,cfg->pusch_config.num_PUSCHTimeDomainResourceAllocations.value);
*k2 = cfg->pusch_config.PUSCHTimeDomainResourceAllocation_k2[time_domain_assignment].value;
*mappingType = cfg->pusch_config.PUSCHTimeDomainResourceAllocation_mappingType[time_domain_assignment].value;
*start_symbol = extract_startSymbol(cfg->pusch_config.PUSCHTimeDomainResourceAllocation_startSymbolAndLength[time_domain_assignment].value);
*length = extract_length(cfg->pusch_config.PUSCHTimeDomainResourceAllocation_startSymbolAndLength[time_domain_assignment].value);
}
/* /*
* Dump the UL or DL UE_list into LOG_T(MAC) * Dump the UL or DL UE_list into LOG_T(MAC)
......
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