From c631c064ecc3f0ead065215926c0dff5cc1b5bb3 Mon Sep 17 00:00:00 2001
From: hongzhi wang <hongzhi.wang@tcl.com>
Date: Fri, 31 Aug 2018 17:29:34 +0200
Subject: [PATCH] ue bug fix pdcch procedure

---
 openair1/PHY/NR_UE_TRANSPORT/dci_nr.c       | 171 +++++++++++---------
 openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 105 ++++++------
 2 files changed, 149 insertions(+), 127 deletions(-)

diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
index 86e89cbb42..e15125af1b 100755
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
@@ -51,7 +51,7 @@
 
 //#define NR_LTE_PDCCH_DCI_SWITCH
 #define NR_PDCCH_DCI_RUN              // activates new nr functions
-//#define NR_PDCCH_DCI_DEBUG            // activates NR_PDCCH_DCI_DEBUG logs
+#define NR_PDCCH_DCI_DEBUG            // activates NR_PDCCH_DCI_DEBUG logs
 #define NR_NBR_CORESET_ACT_BWP 3      // The number of CoreSets per BWP is limited to 3 (including initial CORESET: ControlResourceId 0)
 #define NR_NBR_SEARCHSPACE_ACT_BWP 10 // The number of SearSpaces per BWP is limited to 10 (including initial SEARCHSPACE: SearchSpaceId 0)
 #define PDCCH_TEST_POLAR_TEMP_FIX
@@ -550,11 +550,12 @@ void nr_pdcch_deinterleaving(NR_DL_FRAME_PARMS *frame_parms, uint16_t *z,
  * if interleaved then do this: wbar table has bundles interleaved. We have to de-interleave then
  * following procedure described in 38.211 Section 7.3.2.2:
  */
-  uint32_t bundle_id, bundle_interleaved, c=0 ,r=-1, k, l, i=0;
-  uint32_t coreset_C = (uint32_t)(coreset_nbr_rb / (coreset_interleaver_size_R*reg_bundle_size_L));
-  uint16_t *wptr;
-  wptr = &wtemp_rx[0];
-  z = &wtemp_rx[0];
+  int c=0 ,r=-1;
+  uint32_t bundle_id, bundle_interleaved, k, l, i=0;
+  uint32_t coreset_C = (uint32_t)(coreset_nbr_rb * coreset_time_dur/ (coreset_interleaver_size_R*reg_bundle_size_L));
+  //uint16_t *wptr;
+  //wptr = &wtemp_rx[0];
+  //z = &wtemp_rx[0];
   bundle_id=0;
   for (k=0 ; k<9*coreset_nbr_rb*coreset_time_dur; k++){
     #ifdef NR_PDCCH_DCI_DEBUG
@@ -571,7 +572,7 @@ void nr_pdcch_deinterleaving(NR_DL_FRAME_PARMS *frame_parms, uint16_t *z,
         r++;
       }
       #ifdef NR_PDCCH_DCI_DEBUG
-       printf("\t --> time to modify bundle_interleaved and bundle_id --> r=%d c=%d",r,c);
+       printf("\t --> time to modify bundle_interleaved and bundle_id --> r=%d c=%d\n",r,c);
       #endif
       bundle_id=c*coreset_interleaver_size_R+r;
       bundle_interleaved=(r*coreset_C+c+n_shift)%(coreset_nbr_rb * coreset_time_dur/reg_bundle_size_L);
@@ -579,15 +580,15 @@ void nr_pdcch_deinterleaving(NR_DL_FRAME_PARMS *frame_parms, uint16_t *z,
     if (coreset_interleaved == 1){
       //wptr[i+(bundle_interleaved-bundle_id)*9*reg_bundle_size_L]=wbar[i];
       #ifdef NR_PDCCH_DCI_DEBUG
-        printf("\n\t\t\t\t\t\t\t\t\t wptr[%d] <-> wbar[%d]",i,i+(bundle_interleaved-bundle_id)*9*reg_bundle_size_L);
+        printf("\t\t\t\t\t wptr[%d] = (%d,%d) <-> wbar[%d]",i, *(char*) &wbar[i], *(1 + (char*) &wbar[i]),i+(bundle_interleaved-bundle_id)*9*reg_bundle_size_L);
       #endif
-      wptr[i]=wbar[i+(bundle_interleaved-bundle_id)*9*reg_bundle_size_L];
+      z[i]=wbar[i+(bundle_interleaved-bundle_id)*9*reg_bundle_size_L];
       #ifdef NR_PDCCH_DCI_DEBUG
         printf("\t\t bundle_id = %d \t bundle_interleaved = %d (r=%d, c=%d)\n",bundle_id,bundle_interleaved,r,c);
       #endif
       i++;
     } else {
-      wptr[i]=wbar[i];
+      z[i]=wbar[i];
       i++;
     }
     //bundle_id=c*coreset_interleaver_size_R+r;
@@ -759,11 +760,11 @@ int32_t pdcch_qpsk_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
 int32_t nr_pdcch_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp,
 		char *pdcch_llr, uint8_t symbol,uint32_t coreset_nbr_rb) {
 
-	int16_t *rxF = (int16_t*) &rxdataF_comp[0][(symbol * frame_parms->N_RB_DL * 12)];
+	int16_t *rxF = (int16_t*) &rxdataF_comp[0][(symbol * coreset_nbr_rb * 9)];
 	int32_t i;
 	char *pdcch_llr8;
 
-	pdcch_llr8 = &pdcch_llr[2 * symbol * frame_parms->N_RB_DL * 12];
+	pdcch_llr8 = &pdcch_llr[2 * symbol * coreset_nbr_rb * 9];
 
 	if (!pdcch_llr8) {
 		printf("pdcch_qpsk_llr: llr is null, symbol %d\n", symbol);
@@ -1157,15 +1158,15 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
       #endif
     }
 
-    dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol * (frame_parms->N_RB_DL * NBR_RE_PER_RB_WITHOUT_DMRS)];
+    dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITHOUT_DMRS)];
     #ifdef NR_PDCCH_DCI_DEBUG
       printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> dl_ch0_ext = &dl_ch_estimates_ext[aarx = (%d)][symbol * (frame_parms->N_RB_DL * 9) = (%d)]\n",
-             aarx,symbol * (frame_parms->N_RB_DL * NBR_RE_PER_RB_WITHOUT_DMRS));
+             aarx,symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITHOUT_DMRS));
     #endif
-    rxF_ext = &rxdataF_ext[aarx][symbol * (frame_parms->N_RB_DL * NBR_RE_PER_RB_WITHOUT_DMRS)];
+    rxF_ext = &rxdataF_ext[aarx][symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITHOUT_DMRS)];
     #ifdef NR_PDCCH_DCI_DEBUG
       printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> rxF_ext = &rxdataF_ext[aarx = (%d)][symbol * (frame_parms->N_RB_DL * 9) = (%d)]\n",
-             aarx,symbol * (frame_parms->N_RB_DL * NBR_RE_PER_RB_WITHOUT_DMRS));
+             aarx,symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITHOUT_DMRS));
       printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> (for symbol=%d, aarx=%d), symbol_mod=%d, nushiftmod3=%d \n",symbol,aarx,symbol_mod,nushiftmod3);
     #endif
 
@@ -1332,7 +1333,7 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
             #endif
             dl_ch0_ext[j++] = dl_ch0[i];
             //printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> ch %d => dl_ch0(%d,%d)\n", i, *(short *) &dl_ch0[i], *(1 + (short*) &dl_ch0[i]));
-            printf("\t-> ch %d => dl_ch0(%d,%d)\n", i, *(short *) &dl_ch0[i], *(1 + (short*) &dl_ch0[i]));
+            printf("\t-> dl_ch0[%d] => dl_ch0_ext[%d](%d,%d)\n", i,(j-1), *(short *) &dl_ch0[i], *(1 + (short*) &dl_ch0[i]));
           } else {
             #ifdef NR_PDCCH_DCI_DEBUG
               printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_extract_rbs_single)-> RB[c_rb %d] \t RE[re %d] => rxF_ext[%d]=(%d,%d)\t rxF[%d]=(%d,%d) \t\t <==> DM-RS PDCCH, this is a pilot symbol\n",
@@ -2105,9 +2106,9 @@ short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
         // dl_ch128 = (__m128i *) &dl_ch_estimates_ext[(aatx << 1) + aarx][symbol * frame_parms->N_RB_DL * 12];
         // rxdataF128 = (__m128i *) &rxdataF_ext[aarx][symbol * frame_parms->N_RB_DL * 12];
         // rxdataF_comp128 = (__m128i *) &rxdataF_comp[(aatx << 1) + aarx][symbol * frame_parms->N_RB_DL * 12];
-        dl_ch128 = (__m128i *) &dl_ch_estimates_ext[(aatx << 1) + aarx][symbol * coreset_nbr_rb * 12];
-        rxdataF128 = (__m128i *) &rxdataF_ext[aarx][symbol * coreset_nbr_rb * 12];
-        rxdataF_comp128 = (__m128i *) &rxdataF_comp[(aatx << 1) + aarx][symbol * coreset_nbr_rb * 12];
+        dl_ch128 = (__m128i *) &dl_ch_estimates_ext[(aatx << 1) + aarx][symbol * coreset_nbr_rb * 9];
+        rxdataF128 = (__m128i *) &rxdataF_ext[aarx][symbol * coreset_nbr_rb * 9];
+        rxdataF_comp128 = (__m128i *) &rxdataF_comp[(aatx << 1) + aarx][symbol * coreset_nbr_rb * 9];
       #elif defined(__arm__)
       #endif
       #ifdef NR_PDCCH_DCI_DEBUG
@@ -2120,7 +2121,10 @@ short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
         #endif
         #if defined(__x86_64__) || defined(__i386__)
         #ifdef NR_PDCCH_DCI_DEBUG
-          printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_channel_compensation)-> rxdataF x dl_ch -> RB[%d] RE[%d]\n",rb,k);
+          printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_pdcch_channel_compensation)-> rxdataF_comp = rxdataF_ext(%d,%d) x dl_ch_ext(%d,%d) -> RB[%d] RE[%d]\n",
+                  *(short *) &rxdataF_ext[(rb*9)+k],*(1 + (short*) &rxdataF_ext[(rb*9)+k]),
+                  *(short *) &dl_ch_estimates_ext[(rb*9)+k],*(1 + (short*) &dl_ch_estimates_ext[(rb*9)+k]),
+                  rb,k);
         #endif
         k++;
         if (k%9 == 0) rb++;
@@ -2815,7 +2819,7 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
   // For each BWP the number of CORESETs is limited to 3 (including initial CORESET Id=0 -> ControlResourceSetId (0..maxNrofControlReourceSets-1) (0..12-1)
   //uint32_t n_BWP_start = 0;
   //uint32_t n_rb_offset = 0;
-  uint32_t n_rb_offset                                      = pdcch_vars2->coreset[nb_coreset_active].rb_offset;
+  uint32_t n_rb_offset                                      = pdcch_vars2->coreset[nb_coreset_active].rb_offset+43; //to be removed 43
   // start time position for CORESET
   // parameter symbol_mon is a 14 bits bitmap indicating monitoring symbols within a slot
   uint8_t start_symbol = 0;
@@ -2823,11 +2827,12 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
   // at the moment we are considering that the PDCCH is always starting at symbol 0 of current slot
   // the following code to initialize start_symbol must be activated once we implement PDCCH demapping on symbol not equal to 0 (considering symbol_mon)
   for (int i=0; i < 14; i++) {
-    if (symbol_mon >> (13-i) != 0) {
+    if ((symbol_mon >> (i+1))&0x1 != 0) {
       start_symbol = i;
       i=14;
     }
   }
+  
 #ifdef NR_PDCCH_DCI_DEBUG
   printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> symbol_mon=(%d) and start_symbol=(%d)\n",symbol_mon,start_symbol);
   printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> coreset_freq_dom=(%lld) n_rb_offset=(%d) coreset_time_dur=(%d) n_shift=(%d) reg_bundle_size_L=(%d) coreset_interleaver_size_R=(%d) \n",
@@ -2904,6 +2909,7 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
     #ifdef NR_PDCCH_DCI_DEBUG
       printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> we enter nr_pdcch_extract_rbs_single(is_secondary_ue=%d) to remove DM-RS PDCCH\n",
               is_secondary_ue);
+      printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n");
     #endif
     nr_pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].rxdataF,
                                 common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[nr_tti_rx]].dl_ch_estimates[eNB_id],
@@ -2930,6 +2936,7 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
 
     #ifdef NR_PDCCH_DCI_DEBUG
       printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> we enter pdcch_channel_level(avgP=%d) => compute channel level based on ofdm symbol 0, pdcch_vars[eNB_id]->dl_ch_estimates_ext\n",avgP);
+      printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> in pdcch_channel_level(dl_ch_estimates_ext -> dl_ch_estimates_ext)\n");
     #endif
     // compute channel level based on ofdm symbol 0
     pdcch_channel_level(pdcch_vars[eNB_id]->dl_ch_estimates_ext,
@@ -2951,6 +2958,7 @@ T(T_UE_PHY_PDCCH_ENERGY, T_INT(eNB_id), T_INT(0), T_INT(frame%1024), T_INT(nr_tt
 #endif
     #ifdef NR_PDCCH_DCI_DEBUG
       printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> we enter nr_pdcch_channel_compensation(log2_maxh=%d)\n",log2_maxh);
+      printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> in nr_pdcch_channel_compensation(rxdataF_ext x dl_ch_estimates_ext -> rxdataF_comp)\n");
     #endif
     // compute LLRs for ofdm symbol 0 only
     nr_pdcch_channel_compensation(pdcch_vars[eNB_id]->rxdataF_ext,
@@ -3058,6 +3066,7 @@ printf("\t### in nr_rx_pdcch() function we enter pdcch_channel_compensation(log2
 
     #ifdef NR_PDCCH_DCI_DEBUG
       printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> we enter nr_pdcch_llr(for symbol %d), pdcch_vars[eNB_id]->rxdataF_comp ---> pdcch_vars[eNB_id]->llr \n",s);
+      printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> in nr_pdcch_llr(rxdataF_comp -> llr)\n");
     #endif
     nr_pdcch_llr(frame_parms,
                  pdcch_vars[eNB_id]->rxdataF_comp,
@@ -3107,6 +3116,11 @@ T(T_UE_PHY_PDCCH_IQ, T_INT(frame_parms->N_RB_DL), T_INT(frame_parms->N_RB_DL),
                           coreset_nbr_rb);
   #ifdef NR_PDCCH_DCI_DEBUG
     printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> we enter nr_pdcch_unscrambling()\n");
+    for (int i=0; i<(coreset_time_dur*coreset_nbr_rb*9); i++){
+		printf("\te_rx[%d]=(%d,%d)",i,*(char*) &pdcch_vars[eNB_id]->e_rx[i],*(1 + (char*) &pdcch_vars[eNB_id]->e_rx[i]));
+		if (i%10 == 0) printf("\n");
+	}
+	printf("\n");
   #endif
   nr_pdcch_unscrambling(pdcch_vars[eNB_id]->crnti,
                         frame_parms,
@@ -3116,6 +3130,15 @@ T(T_UE_PHY_PDCCH_IQ, T_INT(frame_parms->N_RB_DL), T_INT(frame_parms->N_RB_DL),
                         // get_nCCE(n_pdcch_symbols, frame_parms, mi) * 72,
                         pdcch_DMRS_scrambling_id,
                         do_common);
+   #ifdef NR_PDCCH_DCI_DEBUG
+    printf("\t<-NR_PDCCH_DCI_DEBUG (nr_rx_pdcch)-> we end nr_pdcch_unscrambling()\n");
+    for (int i=0; i<(coreset_time_dur*coreset_nbr_rb*9); i++){
+		printf("\te_rx[%d]=(%d,%d)",i,*(char*) &pdcch_vars[eNB_id]->e_rx[i],*(1 + (char*) &pdcch_vars[eNB_id]->e_rx[i]));
+		if (i%10 == 0) printf("\n");
+	}
+	printf("\n");
+  #endif
+
 /*
 	printf("\t### in nr_rx_pdcch() function we enter pdcch_demapping()\n");
 
@@ -3724,39 +3747,6 @@ uint8_t generate_dci_top_emul(PHY_VARS_eNB *phy_vars_eNB,
 #endif
 
 
-void dci_decoding(uint8_t DCI_LENGTH,
-                  uint8_t aggregation_level,
-                  t_nrPolar_paramsPtr currentPtr,
-                  double *e,
-                  uint8_t *decoded_output)
-{
-	
-	int8_t decoderState=0;
-
-#ifdef DEBUG_DCI_DECODING
-  int32_t i;
-#endif
-
-  if (aggregation_level>16) {
-    LOG_I(PHY," dci.c: dci_decoding FATAL, illegal aggregation_level %d\n",aggregation_level);
-    return;
-  }
-
-
-#ifdef DEBUG_DCI_DECODING
-  LOG_I(PHY," Doing DCI decoding for %d bits, DCI_LENGTH %d,coded_bits %d, e %p\n",3*(DCI_LENGTH+16),DCI_LENGTH,coded_bits,e);
-#endif
-
-   
-  decoderState = polar_decoder(e,
-							   decoded_output,
-							   currentPtr,
-							   8,
-							   0);
-									 
-}
-
-
 static uint8_t dci_decoded_output[RX_NB_TH][(MAX_DCI_SIZE_BITS+64)/8];
 
 /*uint16_t get_nCCE(uint8_t num_pdcch_symbols,NR_DL_FRAME_PARMS *frame_parms,uint8_t mi)
@@ -3946,10 +3936,11 @@ void nr_dci_decoding_procedure0(int s,
 
   uint16_t crc, CCEind, nCCE[3];
   uint32_t *CCEmap = NULL, CCEmap_mask = 0;
-  int L2 = (1 << L);
+  uint8_t L2 = (1 << L);
   unsigned int Yk, nb_candidates = 0, i, m;
   unsigned int CCEmap_cand;
-  double *polar_input = malloc (sizeof(double) * 108*L);
+  double *polar_input = malloc (sizeof(double) * 108*L2);
+  int8_t decoderState=0;
 
   // A[p], p is the current active CORESET
   uint16_t A[3]={39827,39829,39839};
@@ -4037,6 +4028,9 @@ void nr_dci_decoding_procedure0(int s,
         nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.srs_nrofCandidates;
     } else {
       nb_candidates = (L2 == 4) ? 4 : ((L2 == 8)? 2 : 1); // according to Table 10.1-1 (38.213 section 10.1)
+      #ifdef NR_PDCCH_DCI_DEBUG
+        printf("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0)-> we are in common searchSpace and nb_candidates=%d for L2=%d\n",nb_candidates,L2);
+      #endif
     }
   } else {
     switch (L2) {
@@ -4058,6 +4052,7 @@ void nr_dci_decoding_procedure0(int s,
     default:
       break;
     }
+
     // Find first available in ue specific search space
     // according to procedure in Section 10.1 of 38.213
     // compute Yk
@@ -4148,19 +4143,31 @@ void nr_dci_decoding_procedure0(int s,
         printf ("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0)-> ... we have to replace this part of the code by polar decoding\n");
       #endif
       
-      for (int m=0; m < (nCCE[p]*6*9*2); m++)
+//      for (int m=0; m < (nCCE[p]*6*9*2); m++)
+  printf("polar intput: ");
+      for (int m=0; m < (L2*6*9*2); m++){
         polar_input[m] = (pdcch_vars[eNB_id]->e_rx[CCEind * 54+m]>0) ? (1.0):(-1.0);
+        printf("\t polar_input[%d]=%lf <-> e_rx[%d]=%d\n",m,polar_input[m],(CCEind * 54+m),pdcch_vars[eNB_id]->e_rx[CCEind * 54+m]);
+	}
+	printf("\n");
 
       #ifdef PDCCH_TEST_POLAR_TEMP_FIX
       	  t_nrPolar_paramsPtr currentPtr = NULL;
-      	  nr_polar_init(&currentPtr, NR_POLAR_DCI_MESSAGE_TYPE, dci_alloc.size, dci_alloc.L);
+      	  nr_polar_init(&currentPtr, NR_POLAR_DCI_MESSAGE_TYPE, 41, 8);
 
-	  #else
-		  nr_polar_init(nrPolar_params, NR_POLAR_DCI_MESSAGE_TYPE, sizeof_bits, L);
-		  t_nrPolar_paramsPtr currentPtr = nr_polar_params(*nrPolar_params, NR_POLAR_DCI_MESSAGE_TYPE, sizeof_bits,L);
+	  //#else
+		//  nr_polar_init(nrPolar_params, NR_POLAR_DCI_MESSAGE_TYPE, (uint16_t)sizeof_bits, L2);
+		//  t_nrPolar_paramsPtr currentPtr = nr_polar_params(*nrPolar_params, NR_POLAR_DCI_MESSAGE_TYPE, (uint16_t)sizeof_bits,L2);
       #endif
-      
-      dci_decoding(sizeof_bits, L, currentPtr, polar_input, &dci_decoded_output[current_thread_id][0]);
+  
+      decoderState = polar_decoder(polar_input,
+							   &dci_decoded_output[current_thread_id][0],
+							   currentPtr,
+							   8,
+							   0);
+			printf("decoderState %d\n", decoderState);				   
+							   
+      //dci_decoding(sizeof_bits, 2, currentPtr, polar_input, &dci_decoded_output[current_thread_id][0]);
       /*
       for (i=0;i<3+(sizeof_bits>>3);i++)
       printf("dci_decoded_output[%d] => %x\n",i,dci_decoded_output[i]);
@@ -5093,30 +5100,37 @@ uint8_t nr_dci_decoding_procedure(int s,
                                   int p,
                                   PHY_VARS_NR_UE *ue,
                                   NR_DCI_ALLOC_t *dci_alloc,
-                                  int do_common,
+                                  NR_SEARCHSPACE_TYPE_t searchSpacetype,
                                   int16_t eNB_id,
                                   uint8_t nr_tti_rx,
-                                  uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS],
                                   uint8_t dci_fields_sizes_cnt[MAX_NR_DCI_DECODED_SLOT][NBR_NR_DCI_FIELDS][NBR_NR_FORMATS],
                                   uint16_t n_RB_ULBWP,
                                   uint16_t n_RB_DLBWP,
                                   crc_scrambled_t *crc_scrambled,
                                   format_found_t *format_found) {
+//                                  uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS],
 
-  crc_scrambled_t crc_scrambled_ = *crc_scrambled;
-  format_found_t format_found_   = *format_found;
   #ifdef NR_PDCCH_DCI_DEBUG
-    printf("\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure) nr_tti_rx=%d and format_found=%d %d\n",nr_tti_rx,*format_found,format_found_);
+    printf("\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure) nr_tti_rx=%d n_RB_ULBWP=%d n_RB_DLBWP=%d format_found=%d\n",
+            nr_tti_rx,n_RB_ULBWP,n_RB_DLBWP,*format_found);
   #endif
+
+  int do_common = (int)searchSpacetype;
+  uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS];
+  crc_scrambled_t crc_scrambled_ = *crc_scrambled;
+  format_found_t format_found_   = *format_found;
   uint8_t dci_cnt = 0, old_dci_cnt = 0;
   uint32_t CCEmap0 = 0, CCEmap1 = 0, CCEmap2 = 0;
 
   NR_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]];
+  NR_UE_PDCCH *pdcch_vars2 = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id];
   NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
   t_nrPolar_paramsPtr *nrPolar_params = &ue->nrPolar_params;
   uint8_t mi;// = get_mi(&ue->frame_parms, nr_tti_rx);
   // we need to initialize this values as crc is going to be compared with them
-  uint16_t c_rnti=pdcch_vars[eNB_id]->crnti;
+  //uint16_t c_rnti=pdcch_vars[eNB_id]->crnti;
+  uint16_t c_rnti=pdcch_vars2->crnti; //to be removed FIXME!!!
+  printf("c_rnti=%d\n",c_rnti);
   uint16_t cs_rnti,new_rnti,tc_rnti;
   uint16_t p_rnti=P_RNTI;
   uint16_t si_rnti=SI_RNTI;
@@ -5150,9 +5164,8 @@ uint8_t nr_dci_decoding_procedure(int s,
    *
    */
 
-  NR_UE_PDCCH *pdcch_vars2                         = ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id];
-  NR_UE_SEARCHSPACE_CSS_DCI_FORMAT_t css_dci_format = pdcch_vars2->searchSpace[s].searchSpaceType.common_dci_formats;
-  NR_UE_SEARCHSPACE_USS_DCI_FORMAT_t uss_dci_format = pdcch_vars2->searchSpace[s].searchSpaceType.ue_specific_dci_formats;
+  NR_UE_SEARCHSPACE_CSS_DCI_FORMAT_t css_dci_format = pdcch_vars2->searchSpace[s].searchSpaceType.common_dci_formats;       //FIXME!!!
+  NR_UE_SEARCHSPACE_USS_DCI_FORMAT_t uss_dci_format = pdcch_vars2->searchSpace[s].searchSpaceType.ue_specific_dci_formats;  //FIXME!!!
 
   // The following initialization is only for test purposes. To be removed
   // NR_UE_SEARCHSPACE_CSS_DCI_FORMAT_t
@@ -5168,14 +5181,16 @@ uint8_t nr_dci_decoding_procedure(int s,
 
   #ifdef NR_PDCCH_DCI_DEBUG
     printf("\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure)-> searSpaceType=%d\n",do_common);
-    if (do_common) {
+    if (do_common==0) {
       printf("\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure)-> css_dci_format=%d\n",css_dci_format);
     } else {
       printf("\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure)-> uss_dci_format=%d\n",uss_dci_format);
     }
   #endif
+  
+  
   // A set of PDCCH candidates for a UE to monitor is defined in terms of PDCCH search spaces
-  if (do_common) { // COMMON SearchSpaceType assigned to current SearchSpace/CORESET
+  if (do_common==0) { // COMMON SearchSpaceType assigned to current SearchSpace/CORESET
     // Type0-PDCCH  common search space for a DCI format with CRC scrambled by a SI-RNTI
                // number of consecutive resource blocks and a number of consecutive symbols for
                // the control resource set of the Type0-PDCCH common search space from
@@ -5207,6 +5222,7 @@ uint8_t nr_dci_decoding_procedure(int s,
         printf("\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure)-> calculating dci format size for common searchSpaces with format css_dci_format=%d, format_0_0_1_0_size_bits=%d, format_0_0_1_0_size_bytes=%d\n",
                 css_dci_format,format_0_0_1_0_size_bits,format_0_0_1_0_size_bytes);
       #endif
+#if 0
       // for aggregation level 4. The number of candidates (L2=4) will be calculated in function nr_dci_decoding_procedure0
       #ifdef NR_PDCCH_DCI_DEBUG
         printf("\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure)-> common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
@@ -5225,6 +5241,7 @@ uint8_t nr_dci_decoding_procedure(int s,
           for (int j=0; j<NBR_NR_FORMATS; j++)
             dci_fields_sizes_cnt[dci_cnt-1][i][j]=dci_fields_sizes[i][j];
       }
+#endif
       // for aggregation level 8. The number of candidates (L2=8) will be calculated in function nr_dci_decoding_procedure0
       #ifdef NR_PDCCH_DCI_DEBUG
         printf("\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure)-> common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
@@ -5243,6 +5260,7 @@ uint8_t nr_dci_decoding_procedure(int s,
           for (int j=0; j<NBR_NR_FORMATS; j++)
             dci_fields_sizes_cnt[dci_cnt-1][i][j]=dci_fields_sizes[i][j];
       }
+#if 0
       // for aggregation level 16. The number of candidates (L2=16) will be calculated in function nr_dci_decoding_procedure0
       #ifdef NR_PDCCH_DCI_DEBUG
         printf("\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure)-> common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
@@ -5261,6 +5279,7 @@ uint8_t nr_dci_decoding_procedure(int s,
           for (int j=0; j<NBR_NR_FORMATS; j++)
             dci_fields_sizes_cnt[dci_cnt-1][i][j]=dci_fields_sizes[i][j];
       }
+#endif
     }
 
     // Type3-PDCCH  common search space for a DCI format with CRC scrambled by INT-RNTI, or SFI-RNTI,
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 509775f0c3..9669dca16c 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -54,7 +54,7 @@
 #define DEBUG_PHY_PROC
 
 #define NR_PDCCH_SCHED
-//#define NR_PDCCH_SCHED_DEBUG
+#define NR_PDCCH_SCHED_DEBUG
 //#define NR_PUCCH_SCHED
 //#define NR_PUCCH_SCHED_DEBUG
 
@@ -3142,18 +3142,28 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
   // Higher layers have updated the number of searchSpaces with are active in the current slot and this value is stored in variable nb_searchspace_total
   int nb_searchspace_total = pdcch_vars2->nb_search_space;
   #ifdef NR_PDCCH_SCHED_DEBUG
+    printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> there is a bug in FAPI to calculate nb_searchspace_total=%d\n",nb_searchspace_total);
+  #endif
+  if (nb_searchspace_total>1) nb_searchspace_total=1; // to be removed when fixing bug in FAPI
+  #ifdef NR_PDCCH_SCHED_DEBUG
+    printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> there is a bug in FAPI to calculate nb_searchspace_total so we set it to 1...\n");
     printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> the number of searchSpaces active in the current slot(%d) is %d) \n",
             nr_tti_rx,nb_searchspace_total);
   #endif
   // p in TS 38.212 Subclause 10.1, for each active BWP the UE can deal with 3 different CORESETs (including coresetId 0 for common search space)
   int nb_coreset_total = NR_NBR_CORESET_ACT_BWP;
-  unsigned int dci_cnt=0;
+  uint8_t dci_cnt=0;
   // this table contains 56 (NBR_NR_DCI_FIELDS) elements for each dci field and format described in TS 38.212. Each element represents the size in bits for each dci field
-  uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS] = {0};
+  //uint8_t dci_fields_sizes[NBR_NR_DCI_FIELDS][NBR_NR_FORMATS] = {0};
   // this is the UL bandwidth part. FIXME! To be defined where this value comes from
   uint16_t n_RB_ULBWP = 106;
   // this is the DL bandwidth part. FIXME! To be defined where this value comes from
   uint16_t n_RB_DLBWP = 106;
+  #ifdef NR_PDCCH_SCHED_DEBUG
+    printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> n_RB_ULBWP=%d n_RB_DLBWP=%d\n",
+            n_RB_ULBWP,
+            n_RB_DLBWP);
+  #endif
 
   // First we have to identify each searchSpace active at a time and do PDCCH monitoring corresponding to current searchSpace
   // Up to 10 searchSpaces can be configured to UE (s<=10)
@@ -3286,8 +3296,8 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
               ue->high_speed_flag,
               ue->is_secondary_ue);*/ //removed for nr_ue_pdcch_procedures
         #ifdef NR_PDCCH_SCHED_DEBUG
-          printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_rx_pdcch(nb_coreset_active=%d, (symbol_within_slot_mon&0x3FFF)=%d, searchSpaceType=%d)\n",
-                  nb_coreset_active,(symbol_within_slot_mon&0x3FFF),
+          printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_rx_pdcch with eNB_id=%d (nb_coreset_active=%d, (symbol_within_slot_mon&0x3FFF)=%d, searchSpaceType=%d)\n",
+                  eNB_id,nb_coreset_active,(symbol_within_slot_mon&0x3FFF),
                   searchSpaceType);
         #endif
         nr_rx_pdcch(ue,
@@ -3337,57 +3347,42 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
 */  //removed for nr_ue_pdcch_procedures
         crc_scrambled_t crc_scrambled;
         format_found_t format_found=255;
-
+        
+        #ifdef NR_PDCCH_SCHED_DEBUG
         if (searchSpaceType == common) {  // search all possible dci's for COMMON SEARCH SPACES according to the current SEARCHSPACE configuration
-          #ifdef NR_PDCCH_SCHED_DEBUG
-            printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_dci_decoding_procedure(searchSpaceType=%d, nb_searchspace_active=%d, nb_coreset_active=%d) -> dci_cnt=%d\n",
-                    searchSpaceType,
+            printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_dci_decoding_procedure with eNB_id=%d (n_RB_ULBWP=%d, n_RB_DLBWP=%d, searchSpaceType=%d, nb_searchspace_active=%d, nb_coreset_active=%d) -> dci_cnt=%d\n",
+                    eNB_id,n_RB_ULBWP,n_RB_DLBWP,searchSpaceType,
                     nb_searchspace_active,
                     nb_coreset_active,
                     dci_cnt);
-          #endif
-          dci_cnt += nr_dci_decoding_procedure(nb_searchspace_active,
-                                              nb_coreset_active,
-                                              ue,
-                                              dci_alloc_rx[dci_cnt],
-                                              searchSpaceType,  // if we're in PUSCH don't listen to common search space,
-                                                                // later when we need paging or RA during connection, update this ...
-                                              eNB_id,
-                                              nr_tti_rx,
-                                              dci_fields_sizes,dci_fields_sizes_cnt,
-                                              n_RB_ULBWP,
-                                              n_RB_DLBWP,
-                                              &crc_scrambled,
-                                              &format_found);
-          #ifdef NR_PDCCH_SCHED_DEBUG
-            printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Ending function nr_dci_decoding_procedure() -> dci_cnt=%d\n",dci_cnt);
-          #endif
         }
         if (searchSpaceType == ue_specific){// search all possible dci's for UE-SPECIFIC SEARCH SPACES according to the current SEARCHSPACE configuration
-          #ifdef NR_PDCCH_SCHED_DEBUG
-            printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_dci_decoding_procedure(searchSpaceType=%d, nb_searchspace_active=%d, nb_coreset_active=%d) -> dci_cnt=%d\n",
-                    searchSpaceType,
+             printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_dci_decoding_procedure with eNB_id=%d (n_RB_ULBWP=%d, n_RB_DLBWP=%d, searchSpaceType=%d, nb_searchspace_active=%d, nb_coreset_active=%d) -> dci_cnt=%d\n",
+                    eNB_id,n_RB_ULBWP,n_RB_DLBWP,searchSpaceType,
                     nb_searchspace_active,
                     nb_coreset_active,
                     dci_cnt);
-          #endif
-          dci_cnt += nr_dci_decoding_procedure(nb_searchspace_active,
-                                              nb_coreset_active,
-                                              ue,
-                                              dci_alloc_rx[dci_cnt],
-                                              searchSpaceType,  // if we're in PUSCH don't listen to common search space,
-                                                                // later when we need paging or RA during connection, update this ...
-                                              eNB_id,
-                                              nr_tti_rx,
-                                              dci_fields_sizes,dci_fields_sizes_cnt,
-                                              n_RB_ULBWP,
-                                              n_RB_DLBWP,
-                                              &crc_scrambled,
-                                              &format_found);
-          #ifdef NR_PDCCH_SCHED_DEBUG
-            printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Ending function nr_dci_decoding_procedure() -> dci_cnt=%d\n",dci_cnt);
-          #endif
         }
+        #endif
+
+       
+      
+        nr_dci_decoding_procedure(nb_searchspace_active,
+                                             nb_coreset_active,
+                                             ue,
+                                             &dci_alloc_rx[dci_cnt],
+                                             searchSpaceType,
+                                             eNB_id,
+                                             nr_tti_rx,
+                                             dci_fields_sizes_cnt,
+                                             n_RB_ULBWP,
+                                             n_RB_DLBWP,
+                                             &crc_scrambled,
+                                             &format_found);
+        #ifdef NR_PDCCH_SCHED_DEBUG
+          printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Ending function nr_dci_decoding_procedure() -> dci_cnt=%d\n",dci_cnt);
+        #endif
+        
 
         VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_OUT);
         //LOG_D(PHY,"[UE  %d][PUSCH] Frame %d nr_tti_rx %d PHICH RX\n",ue->Mod_id,frame_rx,nr_tti_rx);
@@ -3504,7 +3499,12 @@ int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
         if ((dci_alloc_rx[i].format == format1_1)){ // This format not implemented at a first time. FIXME
         }
         NR_DCI_INFO_EXTRACTED_t nr_dci_info_extracted;
-        nr_generate_ue_ul_dlsch_params_from_dci(ue,
+        #ifdef NR_PDCCH_SCHED_DEBUG
+            printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_generate_ue_ul_dlsch_params_from_dci with eNB_id=%d dci_cnt=%d\n",
+                    eNB_id,
+                    dci_cnt);
+       #endif
+       nr_generate_ue_ul_dlsch_params_from_dci(ue,
                                                 eNB_id,
                                                 frame_rx,
                                                 nr_tti_rx,
@@ -5448,6 +5448,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
   uint8_t next1_thread_id = ue->current_thread_id[nr_tti_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[nr_tti_rx]+1);
   uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1);
 
+#if 0
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
 
 #if T_TRACER
@@ -5459,9 +5460,9 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
 #endif
 
   // start timers
-#ifdef UE_DEBUG_TRACE
+//#ifdef UE_DEBUG_TRACE
   LOG_I(PHY," ****** start RX-Chain for AbsSubframe %d.%d ******  \n", frame_rx%1024, nr_tti_rx);
-#endif
+//#endif
 
 #if UE_TIMING_TRACE
   start_meas(&ue->phy_proc_rx[ue->current_thread_id[nr_tti_rx]]);
@@ -5491,6 +5492,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
   ue->Mod_id,frame_rx, nr_tti_rx);
 #endif
 
+
   if (ue->frame_parms.Ncp == 0) {  // normal prefix
     pilot1 = 4;
   } else { // extended prefix
@@ -5521,6 +5523,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
 
   LOG_D(PHY," ------ slot 0 Processing: AbsSubframe %d.%d ------  \n", frame_rx%1024, nr_tti_rx);
   LOG_D(PHY," ------  --> FFT/ChannelEst/PDCCH slot 0: AbsSubframe %d.%d ------  \n", frame_rx%1024, nr_tti_rx);
+#endif
 
   //nr_gold_pdcch(ue,0, 2);
 /*
@@ -5546,7 +5549,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
   }*/
     //ue_measurement_procedures(l-1,ue,proc,eNB_id,(nr_tti_rx<<1),abstraction_flag,mode);
 
-    if (do_pdcch_flag) {
+    //if (do_pdcch_flag) {
 //      if ((l==pilot1) || ((pmch_flag==1)&(l==l2)))  {
 //	LOG_D(PHY,"[UE  %d] Frame %d: Calling pdcch procedures (eNB %d)\n",ue->Mod_id,frame_rx,eNB_id);
 
@@ -5561,7 +5564,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
     //     (ue->rx_pdcch_stats[ue->current_thread_id[nr_tti_rx]].p_time)/(cpuf*1000.0));
 	LOG_D(PHY,"num_pdcch_symbols %d\n",ue->pdcch_vars[ue->current_thread_id[nr_tti_rx]][eNB_id]->num_pdcch_symbols);
 //      }
-    }
+    //}
 
 //  } // for l=1..l2
 
-- 
2.26.2