From 2dfe84a7e4da77d3fae2d44a85aac0946e9f7ae4 Mon Sep 17 00:00:00 2001
From: Raymond Knopp <florian.kaltenberger@eurecom.fr>
Date: Sun, 10 Apr 2016 23:25:58 +0200
Subject: [PATCH] bugfixing for UL. Remaining problems: CCE allocations in
 subframe 5 lead to occasional illegal DCI allocations (affects UL DCI which
 is missed by UE). waveform compliance with CQI in ULSCH.

---
 openair1/PHY/LTE_TRANSPORT/dci_tools.c        |   10 +-
 openair1/PHY/LTE_TRANSPORT/phich.c            |    6 +-
 openair1/PHY/LTE_TRANSPORT/prach.c            |   66 +-
 openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c   |  504 +----
 openair1/SCHED/phy_procedures_lte_eNb.c       | 1962 ++++++++---------
 openair1/SIMULATION/LTE_PHY/dlsim.c           |    4 +-
 openair1/SIMULATION/LTE_PHY/mbmssim.c         |    3 +-
 openair1/SIMULATION/LTE_PHY/pbchsim.c         |   13 +-
 openair1/SIMULATION/LTE_PHY/pdcchsim.c        |    7 +-
 openair1/SIMULATION/LTE_PHY/ulsim.c           |    4 +-
 openair2/LAYER2/MAC/eNB_scheduler.c           |   12 +
 openair2/LAYER2/MAC/eNB_scheduler_ulsch.c     |   17 +-
 openair2/UTIL/LOG/vcd_signal_dumper.c         |   18 +
 openair2/UTIL/LOG/vcd_signal_dumper.h         |   18 +
 .../CONF/enb.band7.tm1.100PRB.usrpb210.conf   |    8 +-
 targets/RT/USER/eNB_usrp.gtkw                 |   40 +-
 16 files changed, 1143 insertions(+), 1549 deletions(-)

diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index 852e6104358..a163225f03c 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -7127,10 +7127,10 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
 
     harq_pid = subframe2harq_pid(frame_parms,
                                  pdcch_alloc2ul_frame(frame_parms,
-                                     phy_vars_eNB->proc[sched_subframe].frame_tx,
-                                     subframe),
+						      phy_vars_eNB->proc[sched_subframe].frame_tx,
+						      subframe),
                                  pdcch_alloc2ul_subframe(frame_parms,subframe));
-
+    
     //    printf("eNB: sched_subframe %d, subframe %d, frame_tx %d\n",sched_subframe,subframe,phy_vars_eNB->proc[sched_subframe].frame_tx);
 
     switch (frame_parms->N_RB_DL) {
@@ -7598,9 +7598,9 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
         break;
       }
     } else {
-      ulsch->harq_processes[harq_pid]->O_RI = 0;//1;
+      ulsch->harq_processes[harq_pid]->O_RI = 0;
       ulsch->harq_processes[harq_pid]->Or2                                   = 0;
-      ulsch->harq_processes[harq_pid]->Or1                                   = 0;//sizeof_HLC_subband_cqi_nopmi_5MHz;
+      ulsch->harq_processes[harq_pid]->Or1                                   = 0;
       ulsch->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_nopmi;
     }
 
diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c
index 4c9986bf16f..8b3a6c87588 100644
--- a/openair1/PHY/LTE_TRANSPORT/phich.c
+++ b/openair1/PHY/LTE_TRANSPORT/phich.c
@@ -1466,7 +1466,6 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
 
         nseq_PHICH = ((ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) +
                       ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH);
-        //#ifdef DEBUG_PHICH
         LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d dci_alloc %d)\n",
               phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,
               subframe,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,
@@ -1474,7 +1473,6 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
               ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb,
               ulsch_eNB[UE_id]->harq_processes[harq_pid]->dci_alloc);
 
-        //#endif
         if (ulsch_eNB[UE_id]->Msg3_active == 1) {
           LOG_D(PHY,"[eNB %d][PUSCH %d][RAPROC] Frame %d, subframe %d: Generating Msg3 PHICH for UE %d, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d\n",
                 phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
@@ -1509,12 +1507,10 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
             LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d : PHICH NACK / (no format0 DCI) Setting subframe_scheduling_flag\n",
                   phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
             ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
-            //      ulsch_eNB[UE_id]->harq_processes[harq_pid]->Ndi = 0;
-            //      ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++; //this is already done in phy_procedures
             ulsch_eNB[UE_id]->harq_processes[harq_pid]->rvidx = rv_table[ulsch_eNB[UE_id]->harq_processes[harq_pid]->round&3];
             ulsch_eNB[UE_id]->harq_processes[harq_pid]->O_RI                                  = 0;
             ulsch_eNB[UE_id]->harq_processes[harq_pid]->Or2                                   = 0;
-            ulsch_eNB[UE_id]->harq_processes[harq_pid]->Or1                                   = 0;//sizeof_HLC_subband_cqi_nopmi_5MHz;
+            ulsch_eNB[UE_id]->harq_processes[harq_pid]->Or1                                   = 0;
             ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_nopmi;
 
           } else {
diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c
index 8173f35f678..b93519d393b 100644
--- a/openair1/PHY/LTE_TRANSPORT/prach.c
+++ b/openair1/PHY/LTE_TRANSPORT/prach.c
@@ -1058,21 +1058,24 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
 }
 //__m128i mmtmpX0,mmtmpX1,mmtmpX2,mmtmpX3;
 
-void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_energy_list, uint16_t *preamble_delay_list, uint16_t Nf, uint8_t tdd_mapindex)
+void rx_prach(PHY_VARS_eNB *phy_vars_eNB,
+	      uint8_t subframe,
+	      uint16_t *preamble_energy_list, 
+	      uint16_t *preamble_delay_list, 
+	      uint16_t Nf, 
+	      uint8_t tdd_mapindex)
 {
 
   int i;
-  lte_frame_type_t frame_type         = phy_vars_eNB->lte_frame_parms.frame_type;
-
-  //uint8_t tdd_config         = phy_vars_eNB->lte_frame_parms.tdd_config;
-  uint16_t rootSequenceIndex = phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex;
-  uint8_t prach_ConfigIndex  = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
-  uint8_t Ncs_config         = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig;
-  uint8_t restricted_set     = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag;
-  //uint8_t n_ra_prboffset     = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset;
-  int16_t *prachF           = phy_vars_eNB->lte_eNB_prach_vars.prachF;
-  int16_t **rxsigF          = phy_vars_eNB->lte_eNB_prach_vars.rxsigF;
-  int16_t **prach_ifft      = phy_vars_eNB->lte_eNB_prach_vars.prach_ifft;
+  lte_frame_type_t frame_type = phy_vars_eNB->lte_frame_parms.frame_type;
+
+  uint16_t rootSequenceIndex  = phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex;
+  uint8_t prach_ConfigIndex   = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
+  uint8_t Ncs_config          = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig;
+  uint8_t restricted_set      = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag;
+  int16_t *prachF             = phy_vars_eNB->lte_eNB_prach_vars.prachF;
+  int16_t **rxsigF            = phy_vars_eNB->lte_eNB_prach_vars.rxsigF;
+  int16_t **prach_ifft        = phy_vars_eNB->lte_eNB_prach_vars.prach_ifft;
   int16_t *prach[4];
   int16_t *prach2;
   uint8_t n_ra_prb;
@@ -1086,12 +1089,8 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_ene
   uint16_t numshift=0;
   uint16_t *prach_root_sequence_map;
   uint8_t prach_fmt = get_prach_fmt(prach_ConfigIndex,frame_type);
-  //uint8_t Nsp=2;
-  //uint8_t f_ra,t1_ra;
   uint16_t N_ZC = (prach_fmt <4)?839:139;
   uint8_t not_found;
-  //  LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
-  //  uint16_t subframe_offset;
   int k;
   uint16_t u;
   int16_t *Xu;
@@ -1107,7 +1106,6 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_ene
 
   for (aa=0; aa<nb_ant_rx; aa++) {
     prach[aa] = (int16_t*)&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti-phy_vars_eNB->N_TA_offset];
-    //    remove_625_Hz(phy_vars_eNB,prach[aa]);
   }
 
   // First compute physical root sequence
@@ -1134,37 +1132,6 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_ene
   n_ra_prb = get_prach_prb_offset(&(phy_vars_eNB->lte_frame_parms),tdd_mapindex,Nf);
   prach_root_sequence_map = (prach_fmt < 4) ? prach_root_sequence_map0_3 : prach_root_sequence_map4;
 
-  /*
-  // this code is now part of get_prach_prb_offset
-  if (frame_type == TDD) { // TDD
-    // adjust n_ra_prboffset for frequency multiplexing (p.36 36.211)
-
-    f_ra = tdd_preamble_map[prach_ConfigIndex][tdd_config].map[tdd_mapindex].f_ra;
-
-    if (prach_fmt < 4) {
-      if ((f_ra&1) == 0) {
-        n_ra_prb = n_ra_prboffset + 6*(f_ra>>1);
-      } else {
-        n_ra_prb = phy_vars_eNB->lte_frame_parms.N_RB_UL - 6 - n_ra_prboffset + 6*(f_ra>>1);
-      }
-
-    } else {
-      if ((tdd_config >2) && (tdd_config<6))
-        Nsp = 2;
-
-      t1_ra = tdd_preamble_map[prach_ConfigIndex][tdd_config].map[0].t1_ra;
-
-      if ((((Nf&1)*(2-Nsp)+t1_ra)&1) == 0) {
-        n_ra_prb = 6*f_ra;
-      } else {
-        n_ra_prb = phy_vars_eNB->lte_frame_parms.N_RB_UL - 6*(f_ra+1);
-      }
-
-    }
-  }
-  */
-
-  //    printf("NCS %d\n",NCS);
   // PDP is oversampled, e.g. 1024 sample instead of 839
   // Adapt the NCS (zero-correlation zones) with oversampling factor e.g. 1024/839
   NCS2 = (N_ZC==839) ? ((NCS<<10)/839) : ((NCS<<8)/139);
@@ -1217,9 +1184,6 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_ene
     break;
   }
 
-  //  nsymb = (frame_parms->Ncp==0) ? 14:12;
-  //  subframe_offset = (unsigned int)frame_parms->ofdm_symbol_size*subframe*nsymb;
-
   preamble_offset_old = 99;
 
   for (preamble_index=0 ; preamble_index<64 ; preamble_index++) {
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index 0b63541555f..60838c44b73 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -246,7 +246,7 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
   uint8_t *columnset;
   unsigned int sumKr=0;
   unsigned int Qprime,L,G,Q_CQI,Q_RI,H,Hprime,Hpp,Cmux,Rmux_prime,O_RCC;
-  unsigned int Qprime_ACK,Qprime_CQI,Qprime_RI,len_ACK=0,len_RI=0;
+  unsigned int Qprime_ACK,Qprime_RI,len_ACK=0,len_RI=0;
   //  uint8_t q_ACK[MAX_ACK_PAYLOAD],q_RI[MAX_RI_PAYLOAD];
   int metric,metric_new;
   uint8_t o_flip[8];
@@ -410,12 +410,13 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
   else
     L=8;
 
+  // NOTE: we have to handle the case where we have a very small number of bits (condition on pg. 26 36.212)
   if (ulsch_harq->Or1 > 0)
     Qprime = (ulsch_harq->Or1 + L) * ulsch_harq->Msc_initial*ulsch_harq->Nsymb_initial * ulsch->beta_offset_cqi_times8;
   else
     Qprime=0;
 
-  if (Qprime > 0) {
+  if (Qprime > 0) {  // check if ceiling is larger than floor in Q' expression
     if ((Qprime % (8*sumKr)) > 0)
       Qprime = 1+(Qprime/(8*sumKr));
     else
@@ -426,14 +427,10 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
 
 
 
-  if (Qprime > (G - ulsch_harq->O_RI))
-    Qprime = G - ulsch_harq->O_RI;
-
   Q_CQI = Q_m * Qprime;
 #ifdef DEBUG_ULSCH_DECODING
   msg("ulsch_decoding: G %d, Q_RI %d, Q_CQI %d (L %d, Or1 %d) O_ACK %d\n",G,Q_RI,Q_CQI,L,ulsch_harq->Or1,ulsch_harq->O_ACK);
 #endif
-  Qprime_CQI = Qprime;
 
   G = G - Q_RI - Q_CQI;
 
@@ -452,9 +449,6 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
   //  Rmux       = Hpp*Q_m/Cmux;
   Rmux_prime = Hpp/Cmux;
 
-#ifdef DEBUG_ULSCH_DECODING
-  msg("ulsch_decoding.c: G raw %d (%d symb), Hpp %d, Cmux %d, Rmux_prime %d\n",G,ulsch_harq->Nsymb_pusch,Hpp,Cmux,Rmux_prime);
-#endif
   // Clear "tag" interleaving matrix to allow for CQI/DATA identification
   memset(ytag,0,Cmux*Rmux_prime);
 
@@ -462,128 +456,7 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
 
   i=0;
   memset(y,LTE_NULL,Q_m*Hpp);
-  /*
-  //  Do RI coding
-  if (ulsch->O_RI == 1) {
-    switch (Q_m) {
-    case 2:
-      q_RI[0] = 0;
-      q_RI[1] = PUSCH_y;
-      len_RI=2;
-      break;
-    case 4:
-      q_RI[0] = 0;
-      q_RI[1] = PUSCH_y;//1;
-      q_RI[2] = PUSCH_x;//o_RI[0];
-      q_RI[3] = PUSCH_x;//1;
-      len_RI=4;
-      break;
-    case 6:
-      q_RI[0] = 0;
-      q_RI[1] = PUSCH_y;//1;
-      q_RI[2] = PUSCH_x;//1;
-      q_RI[3] = PUSCH_x;//ulsch->o_RI[0];
-      q_RI[4] = PUSCH_x;//1;
-      q_RI[5] = PUSCH_x;//1;
-      len_RI=6;
-      break;
-    }
-  }
-  else if (ulsch->O_RI > 1){
-    LOG_E(PHY,"ulsch_decoding: FATAL, RI cannot be more than 1 bit yet\n");
-    return(-1);
-  }
-
-  // 1-bit ACK/NAK
-  if (ulsch_harq->O_ACK == 1) {
-    switch (Q_m) {
-    case 2:
-      q_ACK[0] = 0;
-      q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : 0;
-      len_ACK = 2;
-      break;
-    case 4:
-      q_ACK[0] = 0;
-      q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : 0;
-      q_ACK[2] = PUSCH_x;
-      q_ACK[3] = PUSCH_x;
-      len_ACK = 4;
-      break;
-    case 6:
-      q_ACK[0] = 0;
-      q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : 0;
-      q_ACK[2] = PUSCH_x;
-      q_ACK[3] = PUSCH_x;
-      q_ACK[4] = PUSCH_x;
-      q_ACK[6] = PUSCH_x;
-      len_ACK = 6;
-      break;
-    }
-  }
-  // two-bit ACK/NAK
-  if (ulsch_harq->O_ACK == 2) {
-    switch (Q_m) {
-    case 2:
-      q_ACK[0] = 0;
-      q_ACK[1] = 0;
-      q_ACK[2] = 0;
-      q_ACK[3] = 0;
-      q_ACK[4] = 0;
-      q_ACK[5] = 0;
-      len_ACK = 6;
-      break;
-    case 4:
-      q_ACK[0]  = 0;
-      q_ACK[1]  = 0;
-      q_ACK[2]  = PUSCH_x;
-      q_ACK[3]  = PUSCH_x;//1;
-      q_ACK[4]  = 0;
-      q_ACK[5]  = 0;
-      q_ACK[6]  = PUSCH_x;
-      q_ACK[7]  = PUSCH_x;//1;
-      q_ACK[8]  = 0;
-      q_ACK[9]  = 0;
-      q_ACK[10] = PUSCH_x;
-      q_ACK[11] = PUSCH_x;//1;
-      len_ACK = 12;
-      break;
-    case 6:
-      q_ACK[0] = 0;
-      q_ACK[1] = 0;
-      q_ACK[2] = PUSCH_x;
-      q_ACK[3] = PUSCH_x;
-      q_ACK[4] = PUSCH_x;
-      q_ACK[5] = PUSCH_x;
-
-      q_ACK[6] = 0;
-      q_ACK[7] = 0;
-      q_ACK[8] = PUSCH_x;
-      q_ACK[9] = PUSCH_x;
-      q_ACK[10] = PUSCH_x;
-      q_ACK[11] = PUSCH_x;
-
-      q_ACK[12] = 0;
-      q_ACK[13] = 0;
-      q_ACK[14] = PUSCH_x;
-      q_ACK[15] = PUSCH_x;
-      q_ACK[16] = PUSCH_x;
-      q_ACK[17] = PUSCH_x;
-      len_ACK = 18;
-
-      break;
-    }
-  }
-  if (ulsch_harq->O_ACK > 2) {
-    LOG_E(PHY,"ulsch_decoding: FATAL, ACK cannot be more than 2 bits yet\n");
-    return(-1);
-  }
 
-
-  // RI BITS
-
-  //  memset(ytag2,0,Q_m*Hpp);
-
-  */
   // read in buffer and unscramble llrs for everything but placeholder bits
   // llrs stored per symbol correspond to columns of interleaving matrix
 
@@ -724,40 +597,6 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
   }
 
 
-  //      for (q=0;q<Q_m;q++) {
-  /*
-  if ((i&0x1f)==0) {
-    s = lte_gold_generic(&x1, &x2, reset);
-    //    msg("lte_gold[%d]=%x\n",i,s);
-    reset = 0;
-  }
-  c = (uint8_t)((s>>(i&0x1f))&1);
-
-
-
-  // if bits are tagged as placeholders (RI,ACK)
-
-  if (ytag2[q+(Q_m*((r*Cmux)+j))] == PUSCH_y) {
-
-    c=c_prev;
-  }
-  else if (ytag2[q+(Q_m*((r*Cmux)+j))] == PUSCH_x) {
-    c = 0;
-  #ifdef DEBUG_ULSCH_DECODING
-    //    msg("ulsch_decoding.c: PUSCH_x in row %d, col %d: llr %d\n",r,j,ulsch_llr[i]);
-  #endif
-  }
-  c_prev = c;
-  #ifdef DEBUG_ULSCH_DECODING
-  //  msg("llr[%d] = %d (c %d, ytag2 %d) ==> ",i,ulsch_llr[i],c,ytag2[q+(Q_m*((r*Cmux)+j))]);
-  #endif
-  // note flipped here for reverse polarity in 3GPP bit mapping
-  y[q+(Q_m*((r*Cmux)+j))] = (c==0) ? -ulsch_llr[i] : ulsch_llr[i];
-  i++;
-  #ifdef DEBUG_ULSCH_DECODING
-  //  msg("%d\n",y[q+(Q_m*((r*Cmux)+j))]);
-  #endif
-  */
   stop_meas(&phy_vars_eNB->ulsch_demultiplexing_stats);
 
   if (i!=(H+Q_RI))
@@ -819,11 +658,6 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
     for (q=0; q<Q_m; q++) {
       if (y[q+(Q_m*((r*Cmux) + columnset[j]))]!=0)
         ulsch_harq->q_ACK[(q+(Q_m*i))%len_ACK] += y[q+(Q_m*((r*Cmux) + columnset[j]))];
-
-#ifdef DEBUG_ULSCH_DECODING
-      //      LOG_D(PHY,"ACK %d => %d (%d,%d,%d)\n",(q+(Q_m*i))%len_ACK,ulsch_harq->q_ACK[(q+(Q_m*i))%len_ACK],q+(Q_m*((r*Cmux) + columnset[j])),r,columnset[j]);
-      printf("ACK %d => %d (%d,%d,%d)\n",(q+(Q_m*i))%len_ACK,ulsch_harq->q_ACK[(q+(Q_m*i))%len_ACK],q+(Q_m*((r*Cmux) + columnset[j])),r,columnset[j]);
-#endif
       y[q+(Q_m*((r*Cmux) + columnset[j]))]=0;  // NULL LLRs in ACK positions
     }
 
@@ -879,173 +713,129 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
   j2=0;
 
   //  r=0;
-  for (i=0; i<Qprime_CQI; i++) {
-
-    /*
-    while (ytag[(r*Cmux)+j]==LTE_NULL) {
-    #ifdef DEBUG_ULSCH_DECODING
-      msg("ulsch_decoding.c: r %d, j %d: LTE_NULL\n",r,j);
-    #endif
-      j++;
-      if (j==Cmux) {
-    j=0;
-    r++;
+  if (Q_RI>0) {
+    for (i=0; i<(Q_CQI/Q_m); i++) {
+      
+      while (ytag[j]==LTE_NULL) {
+	j++;
+	j2+=Q_m;
       }
-    }
-    for (q=0;q<Q_m;q++) {
-      ys = y[q+(Q_m*((r*Cmux)+j))];
-      if (ys>127)
-    ulsch_harq->q[q+(Q_m*i)] = 127;
-      else if (ys<-128)
-    ulsch_harq->q[q+(Q_m*i)] = -128;
-      else
-    ulsch_harq->q[q+(Q_m*i)] = ys;
-    #ifdef DEBUG_ULSCH_DECODING
-      msg("ulsch_decoding.c: CQI %d, r %d, j %d, y[%d] %d\n",q+(Q_m*i),r,j, q+(Q_m*((r*Cmux) + j)),ys);
-    #endif
-    }
-    */
-    while (ytag[j]==LTE_NULL) {
-      j++;
+      
+      for (q=0; q<Q_m; q++) {
+	//      ys = y[q+(Q_m*((r*Cmux)+j))];
+	ys = y[q+j2];
+	
+	if (ys>127)
+	  ulsch_harq->q[q+(Q_m*i)] = 127;
+	else if (ys<-128)
+	  ulsch_harq->q[q+(Q_m*i)] = -128;
+	else
+	  ulsch_harq->q[q+(Q_m*i)] = ys;
+      }
+      
       j2+=Q_m;
     }
-
-    for (q=0; q<Q_m; q++) {
-      //      ys = y[q+(Q_m*((r*Cmux)+j))];
-      ys = y[q+j2];
-
-      if (ys>127)
-        ulsch_harq->q[q+(Q_m*i)] = 127;
-      else if (ys<-128)
-        ulsch_harq->q[q+(Q_m*i)] = -128;
-      else
-        ulsch_harq->q[q+(Q_m*i)] = ys;
-
-#ifdef DEBUG_ULSCH_DECODING
-      msg("ulsch_decoding.c: CQI %d, q %d, y[%d] %d\n",q+(Q_m*i),q,j2, q+j2,ys);
-#endif
-    }
-
-    j2+=Q_m;
-  }
-
-  // j2=j*Q_m;
-
-  switch (Q_m) {
-  case 2:
-    for (iprime=0; iprime<(Hprime-Qprime_CQI)<<1;) {
-      while (ytag[j]==LTE_NULL) {
-        j++;
-        j2+=2;
+    
+    
+    switch (Q_m) {
+    case 2:
+      for (iprime=0; iprime<G<<1;) {
+	while (ytag[j]==LTE_NULL) {
+	  j++;
+	  j2+=2;
+	}
+	
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	
       }
-
-      ulsch_harq->e[iprime++] = y[j2++];
-      ulsch_harq->e[iprime++] = y[j2++];
-#ifdef DEBUG_ULSCH_DECODING
-      //  msg("ulsch_decoding.c: e %d, r %d, j %d, y[%d] %d\n",g,r,j,q+(Q_m*((r*Cmux) + j)),y[q+(Q_m*((r*Cmux)+j))]);
-#endif
-
-    }
-
-    //    write_output("/tmp/ulsch_e.m","ulsch_e",ulsch->e,iprime,1,0);
-    break;
-
-  case 4:
-    for (iprime=0; iprime<(Hprime-Qprime_CQI)<<2;) {
-      while (ytag[j]==LTE_NULL) {
-        j++;
-        j2+=4;
+      
+      
+      break;
+      
+    case 4:
+      for (iprime=0; iprime<G<<2;) {
+	while (ytag[j]==LTE_NULL) {
+	  j++;
+	  j2+=4;
+	}
+	
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	
       }
-
-      ulsch_harq->e[iprime++] = y[j2++];
-      ulsch_harq->e[iprime++] = y[j2++];
-      ulsch_harq->e[iprime++] = y[j2++];
-      ulsch_harq->e[iprime++] = y[j2++];
-#ifdef DEBUG_ULSCH_DECODING
-      //  msg("ulsch_decoding.c: e %d, r %d, j %d, y[%d] %d\n",g,r,j,q+(Q_m*((r*Cmux) + j)),y[q+(Q_m*((r*Cmux)+j))]);
-#endif
-
-    }
-
-    break;
-
-  case 6:
-    for (iprime=0; iprime<(Hprime-Qprime_CQI)*6;) {
-      while (ytag[j]==LTE_NULL) {
-        j++;
-        j2+=6;
+      
+      break;
+      
+    case 6:
+      for (iprime=0; iprime<G*6;) {
+	while (ytag[j]==LTE_NULL) {
+	  j++;
+	  j2+=6;
+	}
+	
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	
       }
-
-      ulsch_harq->e[iprime++] = y[j2++];
-      ulsch_harq->e[iprime++] = y[j2++];
-      ulsch_harq->e[iprime++] = y[j2++];
-      ulsch_harq->e[iprime++] = y[j2++];
-      ulsch_harq->e[iprime++] = y[j2++];
-      ulsch_harq->e[iprime++] = y[j2++];
-#ifdef DEBUG_ULSCH_DECODING
-      //  msg("ulsch_decoding.c: e %d, r %d, j %d, y[%d] %d\n",g,r,j,q+(Q_m*((r*Cmux) + j)),y[q+(Q_m*((r*Cmux)+j))]);
-#endif
+      
+      break;
 
     }
-
-    break;
-
   }
-
-  /*
-  for (i=0,iprime=-Qprime_CQI;i<Hprime;i++,iprime++) {
-
-    while (ytag[(r*Cmux)+j]==LTE_NULL) {
-  #ifdef DEBUG_ULSCH_DECODING
-      msg("ulsch_decoding.c: r %d, j %d: LTE_NULL\n",r,j);
-  #endif
-      j++;
-      if (j==Cmux) {
-  j=0;
-  r++;
+  else {
+    for (i=0; i<(Q_CQI/Q_m); i++) {
+      
+      for (q=0; q<Q_m; q++) {
+	ys = y[q+j2];
+	if (ys>127)
+	  ulsch_harq->q[q+(Q_m*i)] = 127;
+	else if (ys<-128)
+	  ulsch_harq->q[q+(Q_m*i)] = -128;
+	else
+	  ulsch_harq->q[q+(Q_m*i)] = ys;
       }
+      
+      j2+=Q_m;
     }
-
-    if (i<Qprime_CQI) {
-
-      for (q=0;q<Q_m;q++) {
-  ys = y[q+(Q_m*((r*Cmux)+j))];
-  if (ys>127)
-    ulsch_harq->q[q+(Q_m*i)] = 127;
-  else if (ys<-128)
-    ulsch_harq->q[q+(Q_m*i)] = -128;
-  else
-    ulsch_harq->q[q+(Q_m*i)] = ys;
-  #ifdef DEBUG_ULSCH_DECODING
-  msg("ulsch_decoding.c: CQI %d, r %d, j %d, y[%d] %d\n",q+(Q_m*i),r,j, q+(Q_m*((r*Cmux) + j)),ys);
-  #endif
+    
+    switch (Q_m) {
+    case 2:
+      for (iprime=0; iprime<G<<1;) {
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
       }
-    }
-    else {
-      for (q=0;q<Q_m;q++) {
-  g = q+(Q_m*iprime);
-  ulsch->e[g] = y[q+(Q_m*((r*Cmux)+j))];
-  #ifdef DEBUG_ULSCH_DECODING
-  //  msg("ulsch_decoding.c: e %d, r %d, j %d, y[%d] %d\n",g,r,j,q+(Q_m*((r*Cmux) + j)),y[q+(Q_m*((r*Cmux)+j))]);
-  #endif
+      break;
+    case 4:
+      for (iprime=0; iprime<G<<2;) {
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
       }
-    }
-    j++;
-    if (j==Cmux) {
-      j=0;
-      r++;
+      break;
+    case 6:
+      for (iprime=0; iprime<G*6;) {
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+	ulsch_harq->e[iprime++] = y[j2++];
+      }
+      break;
     }
   }
-  */
-
   // Do CQI/RI/HARQ-ACK Decoding first and pass to MAC
 
   // HARQ-ACK
   wACK_idx = (ulsch->bundling==0) ? 4 : ((Nbundled-1)&3);
-#ifdef DEBUG_ULSCH_DECODING
-  msg("ulsch_decoding.c: Bundling %d, Nbundled %d, wACK_idx %d\n",
-      ulsch->bundling,Nbundled,wACK_idx);
-#endif
 
   if (ulsch_harq->O_ACK == 1) {
     ulsch_harq->q_ACK[0] *= wACK_RX[wACK_idx][0];
@@ -1055,10 +845,6 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
       ulsch_harq->o_ACK[0] = 0;
     else
       ulsch_harq->o_ACK[0] = 1;
-
-#ifdef DEBUG_ULSCH_DECODING
-    msg("ulsch_decoding.c: ulsch_q_ACK[0] %d (%d,%d)\n",ulsch_harq->q_ACK[0],wACK_RX[wACK_idx][0],wACK_RX[wACK_idx][1]);
-#endif
   }
 
   if (ulsch_harq->O_ACK == 2) {
@@ -1068,16 +854,12 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
       ulsch_harq->q_ACK[0] = ulsch_harq->q_ACK[0]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[3]*wACK_RX[wACK_idx][1];
       ulsch_harq->q_ACK[1] = ulsch_harq->q_ACK[1]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[4]*wACK_RX[wACK_idx][1];
       ulsch_harq->q_ACK[2] = ulsch_harq->q_ACK[2]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[5]*wACK_RX[wACK_idx][1];
-
       break;
-
     case 4:
       ulsch_harq->q_ACK[0] = ulsch_harq->q_ACK[0]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[5]*wACK_RX[wACK_idx][1];
       ulsch_harq->q_ACK[1] = ulsch_harq->q_ACK[1]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[8]*wACK_RX[wACK_idx][1];
       ulsch_harq->q_ACK[2] = ulsch_harq->q_ACK[4]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[9]*wACK_RX[wACK_idx][1];
-
       break;
-
     case 6:
       ulsch_harq->q_ACK[0] =  ulsch_harq->q_ACK[0]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[7]*wACK_RX[wACK_idx][1];
       ulsch_harq->q_ACK[1] =  ulsch_harq->q_ACK[1]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[12]*wACK_RX[wACK_idx][1];
@@ -1114,37 +896,15 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
     }
   }
 
-#ifdef DEBUG_ULSCH_DECODING
-
-  for (i=0; i<ulsch_harq->O_ACK; i++)
-    msg("ulsch_decoding: O_ACK[%d] %d, q_ACK => (%d,%d,%d)\n",i,ulsch_harq->o_ACK[i],ulsch_harq->q_ACK[0],ulsch_harq->q_ACK[1],ulsch_harq->q_ACK[2]);
-
-#endif
-
   // RI
 
   if ((ulsch_harq->O_RI == 1) && (Qprime_RI > 0)) {
     ulsch_harq->o_RI[0] = ((ulsch_harq->q_RI[0] + ulsch_harq->q_RI[Q_m/2]) > 0) ? 0 : 1;
   }
 
-#ifdef DEBUG_ULSCH_DECODING
-
-  if (Qprime_RI > 0) {
-    for (i=0; i<2*ulsch_harq->O_RI; i++)
-      msg("ulsch_decoding: q_RI[%d] %d\n",i,ulsch_harq->q_RI[i]);
-  }
-
-  if (Qprime_CQI > 0) {
-    for (i=0; i<ulsch_harq->O_RI; i++)
-      LOG_D(PHY,"ulsch_decoding: O_RI[%d] %d\n",i,ulsch_harq->o_RI[i]);
-  }
-
-#endif
-
-
   // CQI
 
-  if (Qprime_CQI>0) {
+  if (Q_CQI>0) {
     memset((void *)&dummy_w_cc[0],0,3*(ulsch_harq->Or1+8+32));
 
     O_RCC = generate_dummy_w_cc(ulsch_harq->Or1+8,
@@ -1169,7 +929,6 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
     else
       ulsch_harq->cqi_crc_status = 0;
 
-    //printf("crc(cqi) rx: %x\n",(crc8(o_flip,ulsch->Or1)>>24));
 
     if (ulsch->harq_processes[harq_pid]->Or1<=32) {
       ulsch_harq->o[3] = o_flip[0] ;
@@ -1274,44 +1033,21 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
 
     stop_meas(&phy_vars_eNB->ulsch_rate_unmatching_stats);
     r_offset += E;
-    /*
-    msg("Subblock deinterleaving, d %p w %p\n",
-     ulsch_harq->d[r],
-     ulsch_harq->w);
-    */
+
     start_meas(&phy_vars_eNB->ulsch_deinterleaving_stats);
     sub_block_deinterleaving_turbo(4+Kr,
                                    &ulsch_harq->d[r][96],
                                    ulsch_harq->w[r]);
     stop_meas(&phy_vars_eNB->ulsch_deinterleaving_stats);
-    /*
-    #ifdef DEBUG_ULSCH_DECODING
-    msg("decoder input(segment %d) :",r);
-    for (i=0;i<(3*8*Kr_bytes)+12;i++)
-      msg("%d : %d\n",i,ulsch_harq->d[r][96+i]);
-    msg("\n");
-    #endif
-    */
   }
 
     for (r=0; r<ulsch_harq->C; r++) {
-      //    msg("Clearing c, %p\n",ulsch_harq->c[r]);
-      //    memset(ulsch_harq->c[r],0,16);//block_length);
-      //    msg("done\n");
+
       if (ulsch_harq->C == 1)
         crc_type = CRC24_A;
       else
         crc_type = CRC24_B;
 
-      /*
-        msg("decoder input(segment %d)\n",r);
-        for (i=0;i<(3*8*Kr_bytes)+12;i++)
-        if ((ulsch_harq->d[r][96+i]>7) ||
-        (ulsch_harq->d[r][96+i] < -8))
-        msg("%d : %d\n",i,ulsch_harq->d[r][96+i]);
-        msg("\n");
-      */
-
       start_meas(&phy_vars_eNB->ulsch_turbo_decoding_stats);
 
       ret = tc(&ulsch_harq->d[r][96],
@@ -1334,28 +1070,10 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
 
       status[r] = ret;
 
-      if (ret==(1+ulsch->max_turbo_iterations)) {// a Code segment is in error so break;
-#ifdef DEBUG_ULSCH_DECODING
-        msg("ULSCH harq_pid %d CRC failed\n",harq_pid);
-#endif
-        /*
-          for (i=0;i<Kr_bytes;i++)
-          printf("segment %d : byte %d => %d\n",r,i,ulsch_harq->c[r][i]);
-          return(ret);
-        */
-      }
-
-#ifdef DEBUG_ULSCH_DECODING
-      else
-        msg("ULSCH harq_pid %d CRC OK : %d iterations\n",harq_pid, ret);
-
-#endif
-
     }
 
   // Reassembly of Transport block here
   offset = 0;
-  //  msg("F %d, Fbytes %d\n",ulsch_harq->F,ulsch_harq->F>>3);
 
   ret = 1;
 
@@ -1373,8 +1091,6 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
                &ulsch_harq->c[0][(ulsch_harq->F>>3)],
                Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0));
         offset = Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0);
-        //            msg("copied %d bytes to b sequence\n",
-        //             Kr_bytes - (ulsch_harq->F>>3));
       } else {
         memcpy(ulsch_harq->b+offset,
                ulsch_harq->c[r],
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 43d2120639e..18d20f6372a 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -594,22 +594,12 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1);
   start_meas(&phy_vars_eNB->phy_proc_tx);
 
-#ifdef DEBUG_PHY_PROC
-  LOG_D(PHY,"[%s %"PRIu8"] Frame %d subframe %d : Doing phy_procedures_eNB_TX\n",
-        (r_type == multicast_relay) ? "RN/eNB" : "eNB",
-        phy_vars_eNB->Mod_id, frame, subframe);
-#endif
-
   for (i=0; i<NUMBER_OF_UE_MAX; i++) {
     // If we've dropped the UE, go back to PRACH mode for this UE
-    //#if !defined(EXMIMO_IOT)
+
     if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) {
       LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, triggering UL Failure\n",
             phy_vars_eNB->Mod_id,phy_vars_eNB->CC_id,frame,subframe, i, phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors);
-      /*
-      phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
-      remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
-      */
       phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0;
       mac_xface->UL_failure_indication(phy_vars_eNB->Mod_id,
 				       phy_vars_eNB->CC_id,
@@ -619,7 +609,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 				       
     }
 	
-    //#endif
+
   }
 
 
@@ -689,9 +679,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
               phy_vars_rn->Mod_id,phy_vars_rn->frame, subframe,subframe%5,
               phy_vars_rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size);
       } else {
-        /* LOG_I(PHY,"[RN %d] Frame %d subframe %d: do not forward MCH pdu for MBSFN  sync area %d (MCS %d, TBS %d)\n",
-           phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1,
-           mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size);*/
         mch_pduP=NULL;
       }
 
@@ -841,20 +828,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
 
 
-#ifdef DEBUG_PHY_PROC
-    uint16_t frame_tx = (((int) (pbch_pdu[2]&0x3))<<8) + ((int) (pbch_pdu[1]&0xfc)) + phy_vars_eNB->proc[sched_subframe].frame_tx%4;
-
-    LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Generating PBCH, mode1_flag=%"PRIu8", frame_tx=%"PRIu16", pdu=%02"PRIx8"%02"PRIx8"%02"PRIx8"\n",
-          phy_vars_eNB->Mod_id,
-          phy_vars_eNB->proc[sched_subframe].frame_tx,
-          subframe,
-          phy_vars_eNB->lte_frame_parms.mode1_flag,
-          frame_tx,
-          pbch_pdu[2],
-          pbch_pdu[1],
-          pbch_pdu[0]);
-#endif
-
     if (abstraction_flag==0) {
 
       generate_pbch(&phy_vars_eNB->lte_eNB_pbch,
@@ -881,7 +854,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
     if (abstraction_flag==0) {
 
       if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
-        //    printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->proc[sched_subframe].frame_tx,next_slot>>1);
         generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
                      AMP,
                      &phy_vars_eNB->lte_frame_parms,
@@ -932,7 +904,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
     if (abstraction_flag==0) {
 
       if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
-        //      printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->proc[sched_subframe].frame_tx,next_slot>>1);
         generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
                      AMP,
                      &phy_vars_eNB->lte_frame_parms,
@@ -986,10 +957,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
       }
   }
 
-#ifdef EMOS
-  //emos_dump_eNB.dci_cnt[next_slot>>1] = DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci; //nb_dci_common+nb_dci_ue_spec;
-#endif
-
   // clear previous allocation information for all UEs
   for (i=0; i<NUMBER_OF_UE_MAX; i++) {
     phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[subframe] = 0;
@@ -1012,21 +979,17 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
 #endif
 
-  for (i=0; i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) {
-    LOG_D(PHY,"[eNB] Subframe %d: DCI %d/%d : rnti %x, CCEind %d\n",subframe,i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci,DCI_pdu->dci_alloc[i].rnti,DCI_pdu->dci_alloc[i].firstCCE);
-#ifdef DEBUG_PHY_PROC
 
-    if (DCI_pdu->dci_alloc[i].rnti != SI_RNTI) {
-      LOG_D(PHY,"[eNB] Subframe %d : Doing DCI index %"PRIu32"/%d\n",subframe,i,DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci);
-      dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
-    }
 
-#endif
+  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->num_pdcch_symbols);
+
+  for (i=0; i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) {
+    LOG_D(PHY,"[eNB] Subframe %d: DCI %d/%d : rnti %x, CCEind %d\n",subframe,i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci,DCI_pdu->dci_alloc[i].rnti,DCI_pdu->dci_alloc[i].firstCCE);
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].rnti);
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].format);
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].firstCCE);
 
     if (DCI_pdu->dci_alloc[i].rnti == SI_RNTI) {
-#ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB %"PRIu8"] SI generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id);
-#endif
 
       generate_eNB_dlsch_params_from_dci(frame,
 					 subframe,
@@ -1059,9 +1022,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
       
 
     } else if (DCI_pdu->dci_alloc[i].ra_flag == 1) {
-#ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB %"PRIu8"] RA generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id);
-#endif
 
       generate_eNB_dlsch_params_from_dci(frame,
 					 subframe,
@@ -1076,8 +1036,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
                                          P_RNTI,
                                          phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
 
-      //    mac_xface->macphy_exit("Transmitted RAR, exiting\n");
-
 
       phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE;
 
@@ -1097,10 +1055,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
     else if (DCI_pdu->dci_alloc[i].format != format0) { // this is a normal DLSCH allocation
 
-#ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB] Searching for RNTI %"PRIx16"\n",DCI_pdu->dci_alloc[i].rnti);
-#endif
-
       if (phy_vars_eNB->mac_enabled==1)
 	UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
       else
@@ -1152,14 +1106,11 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
 #endif
 
-#ifdef DEBUG_PHY_PROC
-        //if (phy_vars_eNB->proc[sched_subframe].frame_tx%100 == 0)
         LOG_D(PHY,"[eNB %"PRIu8"][DCI][PDSCH %"PRIx16"] Frame %d subframe %d UE_id %"PRId8" Generated DCI format %d, aggregation %d\n",
               phy_vars_eNB->Mod_id, DCI_pdu->dci_alloc[i].rnti,
               phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,UE_id,
               DCI_pdu->dci_alloc[i].format,
               1<<DCI_pdu->dci_alloc[i].L);
-#endif
       } else {
         LOG_D(PHY,"[eNB %"PRIu8"][PDSCH] Frame %d : No UE_id with corresponding rnti %"PRIx16", dropping DLSCH\n",
               phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,DCI_pdu->dci_alloc[i].rnti);
@@ -1168,6 +1119,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
   }
 
+  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,(frame*10)+subframe);
+
   // Apply physicalConfigDedicated if needed
   phy_config_dedicated_eNB_step2(phy_vars_eNB);
 
@@ -1180,7 +1133,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
       if (harq_pid==255) {
         LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx);
-        //mac_exit_wrapper("Invalid harq_pid (255) detected");
         return; 
       }
 
@@ -1195,8 +1147,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
         return; // not reached
       }
 
-      //#ifdef DEBUG_PHY_PROC
-      //if (phy_vars_eNB->proc[sched_subframe].frame_tx%100 == 0)
       LOG_D(PHY,
             "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8") (DCI pos %"PRIu32"/%d), aggregation %d\n",
             phy_vars_eNB->Mod_id,
@@ -1212,10 +1162,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
             i,
             DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci,
             1<<DCI_pdu->dci_alloc[i].L);
-      //#endif
-
-      //dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
-      //LOG_D(PHY,"[eNB] cba generate_eNB_ulsch_params_from_dci for ue %d for dci rnti %x\n", UE_id, DCI_pdu->dci_alloc[i].rnti);
 
       generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0],
                                          DCI_pdu->dci_alloc[i].rnti,
@@ -1245,13 +1191,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
       
 
-#ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB %"PRIu8"][PUSCH %"PRIu8"] frame %d subframe %d Setting subframe_scheduling_flag for UE %"PRIu32" harq_pid %"PRIu8" (ul subframe %"PRIu8")\n",
-            phy_vars_eNB->Mod_id,harq_pid,
-            phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i,harq_pid,
-            pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe));
-#endif
-
       if ((DCI_pdu->dci_alloc[i].rnti  >= CBA_RNTI) && (DCI_pdu->dci_alloc[i].rnti < P_RNTI))
         phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1;
       else
@@ -1274,13 +1213,11 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
   }
 
   if (abstraction_flag == 0) {
-    //#ifdef DEBUG_PHY_PROC
 
     if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0)
       LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,
             DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
 
-    //#endif
 
     num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci,
                                          DCI_pdu->Num_common_dci,
@@ -1291,10 +1228,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
                                          phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
                                          subframe);
 
-#ifdef DEBUG_PHY_PROC
-    //  LOG_I(PHY,"[eNB %d] Frame %d, subframe %d: num_pdcch_symbols %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, next_slot>>1,num_pdcch_symbols);
-
-#endif
   }
 
 #ifdef PHY_ABSTRACTION // FIXME this ifdef seems suspicious
@@ -1307,10 +1240,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0);
 
-#ifdef DEBUG_PHY_PROC
-  //LOG_D(PHY,"[eNB %d] Frame %d, slot %d: num_pdcch_symbols=%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, next_slot,num_pdcch_symbols);
-#endif
-
   // Check for SI activity
 
   if (phy_vars_eNB->dlsch_eNB_SI->active == 1) {
@@ -1339,21 +1268,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
       smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), DLSCH_pdu, input_buffer_length);
     }
 
-#endif
-
-#ifdef DEBUG_PHY_PROC
-#ifdef DEBUG_DLSCH
-   //FIXME: The code below is commented as next_slot is not defined which results in failed compilation
-   /*
-    LOG_D(PHY,"[eNB %"PRIu8"][SI] Frame %d, slot %d: Calling generate_dlsch (SI) with input size = %"PRIu16", num_pdcch_symbols %"PRIu8"\n",
-          phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, next_slot, input_buffer_length,num_pdcch_symbols); // FIXME this code is broken (next_slot?)
-
-    for (i=0; i<input_buffer_length; i++)
-      LOG_T(PHY,"%x.",i,DLSCH_pdu[i]);// FIXME this code is broken (number of arguments)
-
-    LOG_T(PHY,"\n");
-    */
-#endif
 #endif
 
     if (abstraction_flag == 0) {
@@ -1412,10 +1326,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
   // Check for RA activity
   if (phy_vars_eNB->dlsch_eNB_ra->active == 1) {
-#ifdef DEBUG_PHY_PROC
-    LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d, RA active, filling RAR:\n",
-          phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe);
-#endif
 
     input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8;
 
@@ -1425,11 +1335,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
                                         dlsch_input_buffer,
                                         phy_vars_eNB->lte_frame_parms.N_RB_UL,
                                         input_buffer_length);
-    /*
-      for (i=0;i<input_buffer_length;i++)
-      LOG_T(PHY,"%x.",dlsch_input_buffer[i]);
-      LOG_T(PHY,"\n");
-    */
     if (crnti!=0) 
       UE_id = add_ue(crnti,phy_vars_eNB);
     else 
@@ -1437,7 +1342,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
     if (UE_id==-1) {
       LOG_W(PHY,"[eNB] Max user count reached.\n");
-      //mac_xface->macphy_exit("[PHY][eNB] Max user count reached.\n");
       mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
                                 phy_vars_eNB->CC_id,
                                 phy_vars_eNB->proc[sched_subframe].frame_tx,
@@ -1467,15 +1371,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
             phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame,
             phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe);
 
-    /*
-      for (i=0; i<input_buffer_length; i++)
-	dlsch_input_buffer[i]= (unsigned char) i; //(taus()&0xff);
-      
-      dlsch_input_buffer[1] = (phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)>>(2+4); // 7 MSBs of timing advance + divide by 4
-      dlsch_input_buffer[2] = ((phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)<<(4-2))&0xf0;  // 4 LSBs of timing advance + divide by 4
-      //LOG_I(PHY,"UE %d: timing_offset = %d\n",UE_id,phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset);
-    */
-
 #if defined(SMBV) && !defined(EXMIMO)
 
       // Configures the data source of allocation (allocation is configured by DCI)
@@ -1486,13 +1381,13 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
 #endif
 
-#ifdef DEBUG_PHY_PROC
+
       LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA) with input size = %"PRIu16",Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n",
             phy_vars_eNB->Mod_id,
             phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,input_buffer_length,
             phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame,
             phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe);
-#endif
+
 
       if (abstraction_flag == 0) {
 
@@ -1538,11 +1433,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
       LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d subframe %d Deactivating DLSCH RA\n",phy_vars_eNB->Mod_id,
             phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
 
-#ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d, DLSCH (RA) re_allocated = %"PRIu16"\n",phy_vars_eNB->Mod_id,
-            phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, re_allocated);
-#endif
-
     } //max user count
 
     phy_vars_eNB->dlsch_eNB_ra->active = 0;
@@ -1558,7 +1448,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
       input_buffer_length = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS/8;
 
 
-      //#ifdef DEBUG_PHY_PROC
+
       LOG_D(PHY,
             "[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")\n",
             phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,harq_pid,
@@ -1574,7 +1464,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
             pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc),
             phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx,
             phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round);
-      //#endif
+
 #if defined(MESSAGE_CHART_GENERATOR_PHY)
       MSC_LOG_TX_MESSAGE(
         MSC_PHY_ENB,MSC_PHY_UE,
@@ -1699,7 +1589,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 #endif
       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active = 0;
 
-      //mac_xface->macphy_exit("first dlsch transmitted\n");
     }
 
     else if ((phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0])&&
@@ -1708,16 +1597,13 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
       // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later)
       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->subframe_tx[subframe]=0;
-#ifdef DEBUG_PHY_PROC
-      //LOG_D(PHY,"[eNB %d] DCI: Clearing subframe_tx for subframe %d, UE %d\n",phy_vars_eNB->Mod_id,subframe,UE_id);
-#endif
     }
   }
 
 
 
   // if we have PHICH to generate
-  //    printf("[PHY][eNB] Frame %d subframe %d Checking for phich\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
+
   if (is_phich_subframe(&phy_vars_eNB->lte_frame_parms,subframe))
   {
     generate_phich_top(phy_vars_eNB,
@@ -2226,7 +2112,6 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t
     LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id, 
           frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB);
 
-    //    LOG_I(PHY,"[eNB %d][RAPROC] PRACH: rootSequenceIndex %d, prach_ConfigIndex %d, zeroCorrelationZoneConfig %d, highSpeedFlag %d, prach_FreqOffset %d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset);
 
     rx_prach(phy_vars_eNB,
              subframe,
@@ -2271,20 +2156,12 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t
 #endif
 
   if (preamble_energy_list[preamble_max] > 580) {
-    /*
-    write_output("prach_ifft0.m","prach_t0",prach_ifft[0],2048,1,1);
-    write_output("prach_rx0.m","prach_rx0",&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],6144+792,1,1);
-    write_output("prach_rxF0.m","prach_rxF0",phy_vars_eNB->lte_eNB_prach_vars.rxsigF[0],24576,1,1);
-
-    mac_xface->macphy_exit("Exiting for PRACH debug\n");
-    */
-
 
     UE_id = find_next_ue_index(phy_vars_eNB);
  
     if (UE_id>=0) {
       phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits
-      //phy_vars_eNb->eNB_UE_stats[(uint32_t)UE_id].mode = PRACH;
+
       phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].sector = 0;
       LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n",
             phy_vars_eNB->Mod_id,
@@ -2344,13 +2221,9 @@ void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_
 }
 
 
+void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) {
 
-void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,const uint8_t abstraction_flag,const relaying_type_t r_type)
-{
-  //RX processing
-  UNUSED(r_type);
-  uint32_t l, ret=0,i,j,k;
-  uint32_t harq_pid, harq_idx, round;
+  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
   uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0};
   int16_t n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3;
   uint8_t do_SR = 0;
@@ -2358,887 +2231,1028 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
   int32_t metric0=0,metric1=0,metric0_SR=0;
   ANFBmode_t bundling_flag;
   PUCCH_FMT_t format;
-  uint8_t nPRS;
-  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
-  int sync_pos;
-  uint16_t rnti=0;
-  uint8_t access_mode;
-  int num_active_cba_groups;
+
   const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
   const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
 
-  AssertFatal(sched_subframe < NUM_ENB_THREADS, "Bad sched_subframe %d", sched_subframe);
+  if ((phy_vars_eNB->dlsch_eNB[UE_id][0]) &&
+      (phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti>0) &&
+      (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { 
 
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1);
-  start_meas(&phy_vars_eNB->phy_proc_rx);
-#ifdef DEBUG_PHY_PROC
-  LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",phy_vars_eNB->Mod_id,frame, subframe);
-#endif
+      // check SR availability
+      do_SR = is_SR_subframe(phy_vars_eNB,UE_id,sched_subframe);
+      //      do_SR = 0;
 
+      // Now ACK/NAK
+      // First check subframe_tx flag for earlier subframes
+      get_n1_pucch_eNB(phy_vars_eNB,
+                       UE_id,
+                       sched_subframe,
+                       &n1_pucch0,
+                       &n1_pucch1,
+                       &n1_pucch2,
+                       &n1_pucch3);
 
-  phy_vars_eNB->rb_mask_ul[0]=0;
-  phy_vars_eNB->rb_mask_ul[1]=0;
-  phy_vars_eNB->rb_mask_ul[2]=0;
-  phy_vars_eNB->rb_mask_ul[3]=0;
+      LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n",
+            phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,
+            frame,subframe,
+            n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR);
 
-  if (abstraction_flag == 0) {
-    remove_7_5_kHz(phy_vars_eNB,subframe<<1);
-    remove_7_5_kHz(phy_vars_eNB,(subframe<<1)+1);
-  }
+      if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) {  // no TX PDSCH that have to be checked and no SR for this UE_id
+      } else {
+        // otherwise we have some PUCCH detection to do
 
-  // check if we have to detect PRACH first
-  if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,subframe)>0) {
-    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1);
-    prach_procedures(phy_vars_eNB,sched_subframe,abstraction_flag);
-    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
-  }
+	// Null out PUCCH PRBs for noise measurement
+	switch(phy_vars_eNB->lte_frame_parms.N_RB_UL) {
+	case 6:
+	  phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5
+	  break;
+	case 15:
+	  phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14
+	  break;
+	case 25:
+	  phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24
+	  break;
+	case 50:
+	  phy_vars_eNB->rb_mask_ul[0] |= 0x1;
+	  phy_vars_eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32)
+	  break;
+	case 75:
+	  phy_vars_eNB->rb_mask_ul[0] |= 0x1;
+	  phy_vars_eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64)
+	  break;
+	case 100:
+	  phy_vars_eNB->rb_mask_ul[0] |= 0x1;
+	  phy_vars_eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96)
+	  break;
+	default:
+	  LOG_E(PHY,"Unknown number for N_RB_UL %d\n",phy_vars_eNB->lte_frame_parms.N_RB_UL);
+	  break;
+	}
 
-  if (abstraction_flag == 0) {
-    start_meas(&phy_vars_eNB->ofdm_demod_stats);
+        if (do_SR == 1) {
+          phy_vars_eNB->eNB_UE_stats[UE_id].sr_total++;
 
-    for (l=0; l<phy_vars_eNB->lte_frame_parms.symbols_per_tti/2; l++) {
+          if (abstraction_flag == 0)
+            metric0_SR = rx_pucch(phy_vars_eNB,
+				  pucch_format1,
+				  UE_id,
+				  phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
+				  0, // n2_pucch
+				  0, // shortened format, should be use_srs flag, later
+				  &SR_payload,
+				  subframe,
+				  PUCCH1_THRES);
 
-      slot_fep_ul(&phy_vars_eNB->lte_frame_parms,
-                  &phy_vars_eNB->lte_eNB_common_vars,
-                  l,
-                  subframe<<1,
-                  0,
-                  0
-                 );
-      slot_fep_ul(&phy_vars_eNB->lte_frame_parms,
-                  &phy_vars_eNB->lte_eNB_common_vars,
-                  l,
-                  (subframe<<1)+1,
-                  0,
-                  0
-                 );
-    }
+#ifdef PHY_ABSTRACTION
+          else {
+            metric0_SR = rx_pucch_emul(phy_vars_eNB,
+				       UE_id,
+				       pucch_format1,
+				       0,
+				       &SR_payload,
+				       sched_subframe);
+            LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id,
+                  phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe,SR_payload,phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex);
+          }
 
-    stop_meas(&phy_vars_eNB->ofdm_demod_stats);
-  }
+#endif
 
-  // Check for active processes in current subframe
-  harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
-                               frame,subframe);
-  // reset the cba flag used for collision detection
-  for (i=0; i < NUM_MAX_CBA_GROUP; i++) {
-    phy_vars_eNB->cba_last_reception[i]=0;
-  }
+          if (SR_payload == 1) {
+            LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id,
+                  phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe);
+            phy_vars_eNB->eNB_UE_stats[UE_id].sr_received++;
 
-  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
+            if (phy_vars_eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4
+              /* is this test necessary? */
+              if (phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status != SCH_IDLE)
+                put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[UE_id][0], 0);
+              phy_vars_eNB->first_sr[UE_id] = 0;
+              phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->round=0;
+              phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status=SCH_IDLE;
+              LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n",
+                    phy_vars_eNB->Mod_id,
+                    phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe);
+            }
 
-    if (phy_vars_eNB->mac_enabled==1) {
-      if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) {
-	process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid);
-      }
-    }
+	    if (phy_vars_eNB->mac_enabled==1) {
+	      mac_xface->SR_indication(phy_vars_eNB->Mod_id,
+				       phy_vars_eNB->CC_id,
+				       frame,
+				       phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,subframe);
+	    }
+          }
+        }// do_SR==1
 
+        if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR
+        } else if (phy_vars_eNB->lte_frame_parms.frame_type==FDD) { // FDD
+          // if SR was detected, use the n1_pucch from SR, else use n1_pucch0
+	  //          n1_pucch0 = (SR_payload==1) ? phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0;
 
-    phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = -63;
-    phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = 0;
-    phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = -63;
+	  LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload);
 
-    if ((phy_vars_eNB->ulsch_eNB[i]) &&
-        (phy_vars_eNB->ulsch_eNB[i]->rnti>0) &&
-        (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) {
+          if (abstraction_flag == 0) {
 
-      round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
 
-      for (int rb=0;
-           rb<=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb;
-	   rb++) {
-	int rb2 = rb+phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb;
-	phy_vars_eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31));
-      }
-#ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x (UE_id %d)\n",
-            phy_vars_eNB->Mod_id,harq_pid,
-            frame,subframe,phy_vars_eNB->ulsch_eNB[i]->rnti,i);
-#endif
 
-#ifdef DEBUG_PHY_PROC
+            metric0 = rx_pucch(phy_vars_eNB,
+                               pucch_format1a,
+                               UE_id,
+                               (uint16_t)n1_pucch0,
+                               0, //n2_pucch
+                               0, // shortened format
+                               pucch_payload0,
+                               subframe,
+                               PUCCH1a_THRES);
 
-      if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
-        LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n",
-              phy_vars_eNB->Mod_id,
-              frame,
-              subframe,
-              phy_vars_eNB->eNB_UE_stats[i].sector);
-      } else {
-        LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s\n",
-              phy_vars_eNB->Mod_id,
-              frame,
-              subframe,
-              i,
-              mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]);
-      }
+            if (metric0 < metric0_SR)
+	      metric0=rx_pucch(phy_vars_eNB,
+			       pucch_format1a,
+			       UE_id,
+			       phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
+			       0, //n2_pucch
+			       0, // shortened format
+			       pucch_payload0,
+			       subframe,
+			       PUCCH1a_THRES);
+	  }
+          else {
+#ifdef PHY_ABSTRACTION
+            metric0 = rx_pucch_emul(phy_vars_eNB,UE_id,
+                                    pucch_format1a,
+                                    0,
+                                    pucch_payload0,
+                                    subframe);
+#endif
+          }
 
+#ifdef DEBUG_PHY_PROC
+          LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n",
+                phy_vars_eNB->Mod_id,
+                phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,
+                frame,subframe,
+                pucch_payload0[0],metric0);
 #endif
 
-      nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1];
+          process_HARQ_feedback(UE_id,sched_subframe,phy_vars_eNB,
+                                0,// pusch_flag
+                                pucch_payload0,
+                                2,
+                                SR_payload);
 
-      phy_vars_eNB->ulsch_eNB[i]->cyclicShift = (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
-          nPRS)%12;
+        } // FDD
+        else {  //TDD
 
-      if (frame_parms->frame_type == FDD ) {
-        int sf = (subframe<4) ? (subframe+6) : (subframe-4);
+          bundling_flag = phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode;
 
-        if (phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission
-          phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1;
-        } else {
-          phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0;
-        }
-      }
+          // fix later for 2 TB case and format1b
 
-      LOG_D(PHY,
-            "[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n",
-            phy_vars_eNB->Mod_id,harq_pid,frame,subframe,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx,
-            phy_vars_eNB->ulsch_eNB[i]->cyclicShift,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2,
-            phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,
-            nPRS,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK);
-      phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb;
-      phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
-      phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs;
-      start_meas(&phy_vars_eNB->ulsch_demodulation_stats);
+          if ((frame_parms->frame_type==FDD) ||
+              (bundling_flag==bundling)    ||
+              ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) {
+            format = pucch_format1a;
+            //      msg("PUCCH 1a\n");
+          } else {
+            format = pucch_format1b;
+            //      msg("PUCCH 1b\n");
+          }
 
-      if (abstraction_flag==0) {
-        rx_ulsch(phy_vars_eNB,
-                 sched_subframe,
-                 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
-                 i,
-                 phy_vars_eNB->ulsch_eNB,
-                 0);
-      }
+          // if SR was detected, use the n1_pucch from SR
+          if (SR_payload==1) {
+#ifdef DEBUG_PHY_PROC
+            LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id,
+                  phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,
+                  frame,subframe,
+                  n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
+#endif
 
+            if (abstraction_flag == 0)
+              metric0_SR = rx_pucch(phy_vars_eNB,
+				    format,
+				    UE_id,
+				    phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
+				    0, //n2_pucch
+				    0, // shortened format
+				    pucch_payload0,
+				    subframe,
+				    PUCCH1a_THRES);
+            else {
 #ifdef PHY_ABSTRACTION
-      else {
-        rx_ulsch_emul(phy_vars_eNB,
-                      subframe,
-                      phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
-                      i);
-      }
-
+              metric0 = rx_pucch_emul(phy_vars_eNB,UE_id,
+                                      format,
+                                      0,
+                                      pucch_payload0,
+                                      subframe);
 #endif
-      stop_meas(&phy_vars_eNB->ulsch_demodulation_stats);
-
-
-      start_meas(&phy_vars_eNB->ulsch_decoding_stats);
-
-      if (abstraction_flag == 0) {
-        ret = ulsch_decoding(phy_vars_eNB,
-                             i,
-                             sched_subframe,
-                             0, // control_only_flag
-                             phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI,
-			     phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0);
-      }
+            }
+          } else { //using n1_pucch0/n1_pucch1 resources
+#ifdef DEBUG_PHY_PROC
+            LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id,
+                  phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,
+                  frame,subframe,
+                  n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
+#endif
+            metric0=0;
+            metric1=0;
 
+            // Check n1_pucch0 metric
+            if (n1_pucch0 != -1) {
+              if (abstraction_flag == 0)
+                metric0 = rx_pucch(phy_vars_eNB,
+                                   format,
+                                   UE_id,
+                                   (uint16_t)n1_pucch0,
+                                   0, // n2_pucch
+                                   0, // shortened format
+                                   pucch_payload0,
+                                   subframe,
+                                   PUCCH1a_THRES);
+              else {
 #ifdef PHY_ABSTRACTION
-      else {
-        ret = ulsch_decoding_emul(phy_vars_eNB,
-                                  sched_subframe,
-                                  i,
-                                  &rnti);
-      }
-
+                metric0 = rx_pucch_emul(phy_vars_eNB,UE_id,
+                                        format,
+                                        0,
+                                        pucch_payload0,
+                                        subframe);
 #endif
-      stop_meas(&phy_vars_eNB->ulsch_decoding_stats);
+              }
+            }
 
-      //#ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
-            phy_vars_eNB->Mod_id,harq_pid,
-            frame,subframe,
-            phy_vars_eNB->ulsch_eNB[i]->rnti,
-            dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
-            dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
-            phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0],
-            phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1],
-            phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
-            phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
-            ret);
+            // Check n1_pucch1 metric
+            if (n1_pucch1 != -1) {
+              if (abstraction_flag == 0)
+                metric1 = rx_pucch(phy_vars_eNB,
+                                   format,
+                                   UE_id,
+                                   (uint16_t)n1_pucch1,
+                                   0, //n2_pucch
+                                   0, // shortened format
+                                   pucch_payload1,
+                                   subframe,
+                                   PUCCH1a_THRES);
+              else {
+#ifdef PHY_ABSTRACTION
+                metric1 = rx_pucch_emul(phy_vars_eNB,UE_id,
+                                        format,
+                                        1,
+                                        pucch_payload1,
+                                        subframe);
 
 
-      //compute the expected ULSCH RX power (for the stats)
-      phy_vars_eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF =
-        get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0); // 0 means bw_factor is not considered
+#endif
+              }
+            }
+          }
 
-      //dump_ulsch(phy_vars_eNB, sched_subframe, i);
+          if (SR_payload == 1) {
+            pucch_payload = pucch_payload0;
 
-      phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
-#ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n",
-            phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid);
-#endif
-      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0;
+            if (bundling_flag == bundling)
+              pucch_sel = 2;
+          } else if (bundling_flag == multiplexing) { // multiplexing + no SR
+            pucch_payload = (metric1>metric0) ? pucch_payload1 : pucch_payload0;
+            pucch_sel     = (metric1>metric0) ? 1 : 0;
+          } else { // bundling + no SR
+            if (n1_pucch1 != -1)
+              pucch_payload = pucch_payload1;
+            else if (n1_pucch0 != -1)
+              pucch_payload = pucch_payload0;
+
+            pucch_sel = 2;  // indicate that this is a bundled ACK/NAK
+          }
 
-      if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) {
 #ifdef DEBUG_PHY_PROC
-        //if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50))
-        print_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL);
+          LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id,
+                phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,
+                frame,subframe,
+                metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]);
 #endif
-        extract_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,
-                    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,
-                    &phy_vars_eNB->eNB_UE_stats[i],
-                    phy_vars_eNB->lte_frame_parms.N_RB_DL,
-                    &rnti, &access_mode);
-        phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0];
+          process_HARQ_feedback(UE_id,sched_subframe,phy_vars_eNB,
+                                0,// pusch_flag
+                                pucch_payload,
+                                pucch_sel,
+                                SR_payload);
+        }
       }
 
-      if (ret == (1+MAX_TURBO_ITERATIONS)) {
-
-        phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++;
+    }
+}
 
-        LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round);
+void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) {
 
-        if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
-          LOG_D(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n",
-                phy_vars_eNB->Mod_id,
-                phy_vars_eNB->CC_id,
-                frame,subframe, i,
-                phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
-                phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1);
+  uint8_t access_mode;
+  int num_active_cba_groups;
+  const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
+  const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
+  uint16_t rnti=0;
+  int ret=0;
 
-	  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
-		phy_vars_eNB->Mod_id,harq_pid,
-		frame,subframe,
-		phy_vars_eNB->ulsch_eNB[i]->rnti,
-		dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
-		dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
-		phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0],
-		phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1],
-		phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
-		phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
-		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
-		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
-		ret);
+  num_active_cba_groups = phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups;
+  
+  if ((phy_vars_eNB->ulsch_eNB[UE_id]) &&
+      (num_active_cba_groups > 0) &&
+      (phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]>0) &&
+      (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) {
+    rnti=0;
+    
+#ifdef DEBUG_PHY_PROC
+    LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n",
+	  phy_vars_eNB->Mod_id,harq_pid,
+	  frame,subframe,
+	  UE_id, (uint16_t)phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[UE_id].mode]);
+#endif
+    
+    if (abstraction_flag==0) {
+      rx_ulsch(phy_vars_eNB,
+	       sched_subframe,
+	       phy_vars_eNB->eNB_UE_stats[UE_id].sector,  // this is the effective sector id
+	       UE_id,
+	       phy_vars_eNB->ulsch_eNB,
+	       0);
+    }
+    
+#ifdef PHY_ABSTRACTION
+    else {
+      rx_ulsch_emul(phy_vars_eNB,
+		    subframe,
+		    phy_vars_eNB->eNB_UE_stats[UE_id].sector,  // this is the effective sector id
+		    i);
+    }
+    
+#endif
+    
+    if (abstraction_flag == 0) {
+      ret = ulsch_decoding(phy_vars_eNB,
+			   UE_id,
+			   sched_subframe,
+			   0, // control_only_flag
+			   phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->V_UL_DAI,
+			   phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0);
+    }
+    
+#ifdef PHY_ABSTRACTION
+    else {
+      ret = ulsch_decoding_emul(phy_vars_eNB,
+				sched_subframe,
+				UE_id,
+				&rnti);
+    }
+    
+#endif
+    
+    if (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->cqi_crc_status == 1) {
+#ifdef DEBUG_PHY_PROC
+      
+      print_CQI(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL);
+#endif
+      access_mode = UNKNOWN_ACCESS;
+      extract_CQI(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,
+		  phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,
+		  &phy_vars_eNB->eNB_UE_stats[UE_id],
+		  phy_vars_eNB->lte_frame_parms.N_RB_DL,
+		  &rnti, &access_mode);
+      phy_vars_eNB->eNB_UE_stats[UE_id].rank = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o_RI[0];
+    }
+    
+      phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0;
+      phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status= SCH_IDLE;
+      
+      if ((num_active_cba_groups > 0) &&
+          (UE_id + num_active_cba_groups < NUMBER_OF_UE_MAX) &&
+          (phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->cba_rnti[UE_id%num_active_cba_groups] > 0 ) &&
+          (phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->num_active_cba_groups> 0)) {
+#ifdef DEBUG_PHY_PROC
+        LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n",
+              phy_vars_eNB->Mod_id,harq_pid,frame,subframe,UE_id,harq_pid,
+              UE_id+num_active_cba_groups, UE_id%phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups);
+#endif
+        phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1;
+        phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE;
+        phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS;
+      }
 
-          if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round ==
-              phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) {
-            LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n",
-                  phy_vars_eNB->Mod_id, i);
-            phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
-	    if (phy_vars_eNB->mac_enabled==1) {
-	      mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
-					phy_vars_eNB->CC_id,
-					frame,
-					phy_vars_eNB->eNB_UE_stats[i].crnti);
-	    }
-            mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti);
+      if (ret == (1+MAX_TURBO_ITERATIONS)) {
+        phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round]++;
+        phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1;
+        phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 0;
+        phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++;
+      } // ulsch in error
+      else {
+        LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n",
+              phy_vars_eNB->Mod_id,harq_pid,
+              frame,subframe);
 
-            phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
-            //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0;
+        phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1;
+        phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 1;
+        phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round = 0;
+        phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_consecutive_errors = 0;
+#ifdef DEBUG_PHY_PROC
+#ifdef DEBUG_ULSCH
+        LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",
+              frame,subframe,
+              harq_pid,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3);
+
+        for (j=0; j<phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3; j++)
+          LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b[j]);
+
+        LOG_T(PHY,"\n");
+#endif
+#endif
+
+        if (access_mode > UNKNOWN_ACCESS) {
+          LOG_D(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n",
+                phy_vars_eNB->Mod_id, frame,subframe,
+                UE_id, phy_vars_eNB->ulsch_eNB[UE_id]->rnti,
+                UE_id % phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]);
 
+          // detect if there is a CBA collision
+          if (phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups] == 0 ) {
+            mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
+                              phy_vars_eNB->CC_id,
+                              frame,subframe,
+                              phy_vars_eNB->ulsch_eNB[UE_id]->rnti,
+                              phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b,
+                              phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3,
+                              harq_pid,
+                              NULL);
+
+            phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1;//(subframe);
           } else {
-            // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI)
-            phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1;
+            if (phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups] == 1 )
+              LOG_N(PHY,"[eNB%d] Frame %d subframe %d : first CBA collision detected \n ",
+                    phy_vars_eNB->Mod_id,frame,subframe);
 
-            get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms,
-                               subframe,
-                               frame,
-                               &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame,
-                               &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe);
-          }/*
-
-    LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe,
-    harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
-    for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
-      printf("%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]);
-    printf("\n");
-     */
-          //    dump_ulsch(phy_vars_eNB,sched_subframe,i);
-          //#ifndef EXMIMO_IOT
-          LOG_D(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error, i = %d \n", frame,subframe,i);
-          //#else
-          //mac_exit_wrapper("Msg3 error");
-          //#endif
-        } // This is Msg3 error
-        else { //normal ULSCH
-          LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n",
-                phy_vars_eNB->Mod_id,harq_pid,
-                frame,subframe, i,
-                phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
-                phy_vars_eNB->ulsch_eNB[i]->Mlimit,
-                phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
-                phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]);
+            LOG_N(PHY,"[eNB%d] Frame %d subframe %d : CBA collision set SR for UE %d in group %d \n ",
+                  phy_vars_eNB->Mod_id,frame,subframe,
+                  phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups],UE_id%num_active_cba_groups );
 
-#if defined(MESSAGE_CHART_GENERATOR_PHY)
-          MSC_LOG_RX_DISCARDED_MESSAGE(
-            MSC_PHY_ENB,MSC_PHY_UE,
-            NULL,0,
-            "%05u:%02u ULSCH received rnti %x harq id %u round %d",
-            frame,subframe,
-            phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1
-            );
-#endif
-          /*
-          LOG_T(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:\n",frame,subframe,
-          harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
-          if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0]!=NULL){
-            for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
-              LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]);
-            LOG_T(PHY,"\n");
+            phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1;
+
+            mac_xface->SR_indication(phy_vars_eNB->Mod_id,
+                                     phy_vars_eNB->CC_id,
+                                     frame,
+                                     phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,subframe);
           }
-          */
+        } // UNKNOWN_ACCESS
+      } // ULSCH CBA not in error
+  }
 
+}
 
-          //    dump_ulsch(phy_vars_eNB,sched_subframe,i);
-          //mac_exit_wrapper("ULSCH error");
+void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,const uint8_t abstraction_flag,const relaying_type_t r_type)
+{
+  //RX processing
+  UNUSED(r_type);
+  uint32_t l, ret=0,i,j,k;
+  uint32_t harq_pid, harq_idx, round;
+  uint8_t nPRS;
+  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
+  int sync_pos;
+  uint16_t rnti=0;
+  uint8_t access_mode;
 
-          if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mlimit) {
-            LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mlimit %d reached\n",
-                  phy_vars_eNB->Mod_id,harq_pid,
-                  frame,subframe, i,
-                  phy_vars_eNB->ulsch_eNB[i]->Mlimit);
+  const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
+  const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
 
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0;
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0;
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++;
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors++;
-            //dump_ulsch(phy_vars_eNB, sched_subframe, i);
-	    // indicate error to MAC
-	    mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
-			      phy_vars_eNB->CC_id,
-			      frame,subframe,
-			      phy_vars_eNB->ulsch_eNB[i]->rnti,
-			      NULL,
-			      0,
-			      harq_pid,
-			      &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag);
-          }
-        }
-      }  // ulsch in error
-      else {
-        if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
-	  LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n",
-		phy_vars_eNB->Mod_id,harq_pid,
-		frame,subframe);
-	  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
-		phy_vars_eNB->Mod_id,harq_pid,
-		frame,subframe,
-		phy_vars_eNB->ulsch_eNB[i]->rnti,
-		dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
-		dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
-		phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0],
-		phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1],
-		phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
-		phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
-		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
-		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
-		ret);
-	}
-#if defined(MESSAGE_CHART_GENERATOR_PHY)
-        MSC_LOG_RX_MESSAGE(
-          MSC_PHY_ENB,MSC_PHY_UE,
-          NULL,0,
-          "%05u:%02u ULSCH received rnti %x harq id %u",
-          frame,subframe,
-          phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid
-          );
+  AssertFatal(sched_subframe < NUM_ENB_THREADS, "Bad sched_subframe %d", sched_subframe);
+
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1);
+  start_meas(&phy_vars_eNB->phy_proc_rx);
+#ifdef DEBUG_PHY_PROC
+  LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",phy_vars_eNB->Mod_id,frame, subframe);
 #endif
-        for (j=0; j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx; j++)
-          //this is the RSSI per RB
-          phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] =
-	    
-            dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]*
-                     (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/
-                     phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) -
-            phy_vars_eNB->rx_total_gain_eNB_dB -
-            hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 -
-            get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100;
-	    
-	    /*
-            dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]*phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb) -
-            phy_vars_eNB->rx_total_gain_eNB_dB -
-            hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 -
-            get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100;*/
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
-        phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0;
 
-        if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
-	  if (phy_vars_eNB->mac_enabled==1) {
-	  //#ifdef DEBUG_PHY_PROC
-          LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n",
-                phy_vars_eNB->Mod_id,
-                frame,harq_pid,i);
-	  //#endif
-          mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
-                            phy_vars_eNB->CC_id,
-                            frame,subframe,
-                            phy_vars_eNB->ulsch_eNB[i]->rnti,
-                            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
-                            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3,
-                            harq_pid,
-                            &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag);
-
-          // one-shot msg3 detection by MAC: empty PDU (e.g. CRNTI)
-          if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 0 ) {
-            phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
-            mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
-                                      phy_vars_eNB->CC_id,
-                                      frame,
-                                      phy_vars_eNB->eNB_UE_stats[i].crnti);
-            mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti);
-            phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
-          }
 
-          /*
-            mac_xface->terminate_ra_proc(phy_vars_eNB->Mod_id,
-            frame,
-            phy_vars_eNB->ulsch_eNB[i]->rnti,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
-          */
-	  }
+  phy_vars_eNB->rb_mask_ul[0]=0;
+  phy_vars_eNB->rb_mask_ul[1]=0;
+  phy_vars_eNB->rb_mask_ul[2]=0;
+  phy_vars_eNB->rb_mask_ul[3]=0;
 
-          phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH;
-          phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0;
+  if (abstraction_flag == 0) {
+    remove_7_5_kHz(phy_vars_eNB,subframe<<1);
+    remove_7_5_kHz(phy_vars_eNB,(subframe<<1)+1);
+  }
 
-	  //#ifdef DEBUG_PHY_PROC
-	    LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,subframe,i);
-	    //#endif //DEBUG_PHY_PROC
+  // check if we have to detect PRACH first
+  if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,subframe)>0) {
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1);
+    prach_procedures(phy_vars_eNB,sched_subframe,abstraction_flag);
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
+  }
 
-          for (k=0; k<8; k++) { //harq_processes
-            for (j=0; j<phy_vars_eNB->dlsch_eNB[i][0]->Mlimit; j++) {
-              phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0;
-              phy_vars_eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0;
-              phy_vars_eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0;
-            }
+  if (abstraction_flag == 0) {
+    start_meas(&phy_vars_eNB->ofdm_demod_stats);
+
+    for (l=0; l<phy_vars_eNB->lte_frame_parms.symbols_per_tti/2; l++) {
+
+      slot_fep_ul(&phy_vars_eNB->lte_frame_parms,
+                  &phy_vars_eNB->lte_eNB_common_vars,
+                  l,
+                  subframe<<1,
+                  0,
+                  0
+                 );
+      slot_fep_ul(&phy_vars_eNB->lte_frame_parms,
+                  &phy_vars_eNB->lte_eNB_common_vars,
+                  l,
+                  (subframe<<1)+1,
+                  0,
+                  0
+                 );
+    }
+
+    stop_meas(&phy_vars_eNB->ofdm_demod_stats);
+  }
+
+  // Check for active processes in current subframe
+  harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
+                               frame,subframe);
+
+  // reset the cba flag used for collision detection
+  for (i=0; i < NUM_MAX_CBA_GROUP; i++) {
+    phy_vars_eNB->cba_last_reception[i]=0;
+  }
+
+  // Do PUCCH processing first
+
+  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
+    pucch_procedures(sched_subframe,phy_vars_eNB,i,harq_pid,abstraction_flag);
+  }
 
-            phy_vars_eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0;
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[k]=0;
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0;
+  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
 
-            for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->Mlimit; j++) {
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0;
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0;
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0;
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0;
-            }
-          }
+    // check for Msg3
+    if (phy_vars_eNB->mac_enabled==1) {
+      if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) {
+	process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid);
+      }
+    }
 
-          phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0;
-          phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK_round0=0;
-          phy_vars_eNB->eNB_UE_stats[i].dlsch_mcs_offset=0;
 
-          //mac_xface->macphy_exit("Mode PUSCH. Exiting.\n");
-        } else {
+    phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = -63;
+    phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = 0;
+    phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = -63;
 
+    if ((phy_vars_eNB->ulsch_eNB[i]) &&
+        (phy_vars_eNB->ulsch_eNB[i]->rnti>0) &&
+        (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) {
+      // UE is has ULSCH scheduling
+      round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
+
+      for (int rb=0;
+           rb<=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb;
+	   rb++) {
+	int rb2 = rb+phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb;
+	phy_vars_eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31));
+      }
 #ifdef DEBUG_PHY_PROC
-#ifdef DEBUG_ULSCH
-          LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe,
-                harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
+      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x (UE_id %d)\n",
+            phy_vars_eNB->Mod_id,harq_pid,
+            frame,subframe,phy_vars_eNB->ulsch_eNB[i]->rnti,i);
+#endif
 
-          for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++)
-            LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]);
+      if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
+        LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n",
+              phy_vars_eNB->Mod_id,
+              frame,
+              subframe,
+              phy_vars_eNB->eNB_UE_stats[i].sector);
+	VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,1);
+      } else {
+        LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s\n",
+              phy_vars_eNB->Mod_id,
+              frame,
+              subframe,
+              i,
+              mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]);
+      }
 
-          LOG_T(PHY,"\n");
-#endif
-#endif
-          //dump_ulsch(phy_vars_eNB,sched_subframe,i);
 
+      nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1];
 
-	  if (phy_vars_eNB->mac_enabled==1) {
-          //    if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->calibration_flag == 0) {
-          mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
-                            phy_vars_eNB->CC_id,
-                            frame,subframe,
-                            phy_vars_eNB->ulsch_eNB[i]->rnti,
-                            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
-                            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3,
-                            harq_pid,
-                            NULL);
-          //}
-          /*
-            else {
-            // Retrieve calibration information and do whatever
-            LOG_D(PHY,"[eNB][Auto-Calibration] Frame %d, Subframe %d : ULSCH PDU (RX) %d bytes\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
-            }
-          */
-#ifdef LOCALIZATION
-          start_meas(&phy_vars_eNB->localization_stats);
-          aggregate_eNB_UE_localization_stats(phy_vars_eNB,
-                                              i,
-                                              frame,
-                                              subframe,
-                                              get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 1)/100);
-          stop_meas(&phy_vars_eNB->localization_stats);
-#endif
+      phy_vars_eNB->ulsch_eNB[i]->cyclicShift = (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
+          nPRS)%12;
 
-	  }
-        }
+      if (frame_parms->frame_type == FDD ) {
+        int sf = (subframe<4) ? (subframe+6) : (subframe-4);
 
-        // estimate timing advance for MAC
-        if (abstraction_flag == 0) {
-          sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,sched_subframe);
-          phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/4; //to check
+        if (phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission
+          phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1;
+        } else {
+          phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0;
         }
+      }
 
-#ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"[eNB %d] frame %d, subframe %d: user %d: timing advance = %d\n",
-              phy_vars_eNB->Mod_id,
-              frame, subframe,
-              i,
-              phy_vars_eNB->eNB_UE_stats[i].timing_advance_update);
-#endif
+      LOG_D(PHY,
+            "[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n",
+            phy_vars_eNB->Mod_id,harq_pid,frame,subframe,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx,
+            phy_vars_eNB->ulsch_eNB[i]->cyclicShift,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2,
+            phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,
+            nPRS,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK);
+      phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb;
+      phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
+      phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs;
+      start_meas(&phy_vars_eNB->ulsch_demodulation_stats);
 
+      if (abstraction_flag==0) {
+        rx_ulsch(phy_vars_eNB,
+                 sched_subframe,
+                 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
+                 i,
+                 phy_vars_eNB->ulsch_eNB,
+                 0);
+      }
 
-      }  // ulsch not in error
+#ifdef PHY_ABSTRACTION
+      else {
+        rx_ulsch_emul(phy_vars_eNB,
+                      subframe,
+                      phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
+                      i);
+      }
 
-      // process HARQ feedback
-#ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id,
-            phy_vars_eNB->dlsch_eNB[i][0]->rnti,
-            frame,subframe,
-            i);
 #endif
-      process_HARQ_feedback(i,
-                            sched_subframe,
-                            phy_vars_eNB,
-                            1, // pusch_flag
-                            0,
-                            0,
-                            0);
+      stop_meas(&phy_vars_eNB->ulsch_demodulation_stats);
 
-#ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n",
-            phy_vars_eNB->Mod_id,frame,subframe,
-            phy_vars_eNB->eNB_UE_stats[i].sector,
-            harq_pid,
-            i,
-            ret,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid],
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]);
-#endif
-      
-      // dump stats to VCD
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0+harq_pid,phy_vars_eNB->pusch_stats_mcs[0][(frame*10)+subframe]);
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0+harq_pid,phy_vars_eNB->pusch_stats_rb[0][(frame*10)+subframe]);
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0+harq_pid,phy_vars_eNB->pusch_stats_round[0][(frame*10)+subframe]);
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[0]));
-    } // ulsch_eNB[0] && ulsch_eNB[0]->rnti>0 && ulsch_eNB[0]->subframe_scheduling_flag == 1
 
-    else if ((phy_vars_eNB->dlsch_eNB[i][0]) &&
-             (phy_vars_eNB->dlsch_eNB[i][0]->rnti>0)) { // check for PUCCH
+      start_meas(&phy_vars_eNB->ulsch_decoding_stats);
 
-      // check SR availability
-      do_SR = is_SR_subframe(phy_vars_eNB,i,sched_subframe);
-      //      do_SR = 0;
+      if (abstraction_flag == 0) {
+        ret = ulsch_decoding(phy_vars_eNB,
+                             i,
+                             sched_subframe,
+                             0, // control_only_flag
+                             phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI,
+			     phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0);
+      }
 
-      // Now ACK/NAK
-      // First check subframe_tx flag for earlier subframes
-      get_n1_pucch_eNB(phy_vars_eNB,
-                       i,
-                       sched_subframe,
-                       &n1_pucch0,
-                       &n1_pucch1,
-                       &n1_pucch2,
-                       &n1_pucch3);
+#ifdef PHY_ABSTRACTION
+      else {
+        ret = ulsch_decoding_emul(phy_vars_eNB,
+                                  sched_subframe,
+                                  i,
+                                  &rnti);
+      }
 
-      LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n",
-            phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[i][0]->rnti,
-            frame,subframe,
-            n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR);
+#endif
+      stop_meas(&phy_vars_eNB->ulsch_decoding_stats);
 
-      if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) {  // no TX PDSCH that have to be checked and no SR for this UE_id
-      } else {
-        // otherwise we have some PUCCH detection to do
+      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
+            phy_vars_eNB->Mod_id,harq_pid,
+            frame,subframe,
+            phy_vars_eNB->ulsch_eNB[i]->rnti,
+            dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
+            dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
+            phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0],
+            phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1],
+            phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
+            phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
+            ret);
 
-	// Null out PUCCH PRBs for noise measurement
-	switch(phy_vars_eNB->lte_frame_parms.N_RB_UL) {
-	case 6:
-	  phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5
-	  break;
-	case 15:
-	  phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14
-	  break;
-	case 25:
-	  phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24
-	  break;
-	case 50:
-	  phy_vars_eNB->rb_mask_ul[0] |= 0x1;
-	  phy_vars_eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32)
-	  break;
-	case 75:
-	  phy_vars_eNB->rb_mask_ul[0] |= 0x1;
-	  phy_vars_eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64)
-	  break;
-	case 100:
-	  phy_vars_eNB->rb_mask_ul[0] |= 0x1;
-	  phy_vars_eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96)
-	  break;
-	default:
-	  LOG_E(PHY,"Unknown number for N_RB_UL %d\n",phy_vars_eNB->lte_frame_parms.N_RB_UL);
-	  break;
-	}
 
-        if (do_SR == 1) {
-          phy_vars_eNB->eNB_UE_stats[i].sr_total++;
+      //compute the expected ULSCH RX power (for the stats)
+      phy_vars_eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF =
+        get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0); // 0 means bw_factor is not considered
 
-          if (abstraction_flag == 0)
-            metric0_SR = rx_pucch(phy_vars_eNB,
-				  pucch_format1,
-				  i,
-				  phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex,
-				  0, // n2_pucch
-				  0, // shortened format, should be use_srs flag, later
-				  &SR_payload,
-				  subframe,
-				  PUCCH1_THRES);
+      //dump_ulsch(phy_vars_eNB, sched_subframe, i);
 
-#ifdef PHY_ABSTRACTION
-          else {
-            metric0_SR = rx_pucch_emul(phy_vars_eNB,
-				       i,
-				       pucch_format1,
-				       0,
-				       &SR_payload,
-				       sched_subframe);
-            LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id,
-                  phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe,SR_payload,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex);
-          }
+      phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
+#ifdef DEBUG_PHY_PROC
+      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n",
+            phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid);
+#endif
+      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0;
 
+      if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) {
+#ifdef DEBUG_PHY_PROC
+        //if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50))
+        print_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL);
 #endif
+        extract_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,
+                    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,
+                    &phy_vars_eNB->eNB_UE_stats[i],
+                    phy_vars_eNB->lte_frame_parms.N_RB_DL,
+                    &rnti, &access_mode);
+        phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0];
 
-          if (SR_payload == 1) {
-            LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id,
-                  phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe);
-            phy_vars_eNB->eNB_UE_stats[i].sr_received++;
+      }
 
-            if (phy_vars_eNB->first_sr[i] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4
-              /* is this test necessary? */
-              if (phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->status != SCH_IDLE)
-                put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[i][0], 0);
-              phy_vars_eNB->first_sr[i] = 0;
-              phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->round=0;
-              phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->status=SCH_IDLE;
-              LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n",
-                    phy_vars_eNB->Mod_id,
-                    phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe);
-            }
+      if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1)
+	VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,0);
 
-	    if (phy_vars_eNB->mac_enabled==1) {
-	      mac_xface->SR_indication(phy_vars_eNB->Mod_id,
-				       phy_vars_eNB->CC_id,
-				       frame,
-				       phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe);
-	    }
-          }
-        }// do_SR==1
+      if (ret == (1+MAX_TURBO_ITERATIONS)) {
 
-        if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR
-        } else if (phy_vars_eNB->lte_frame_parms.frame_type==FDD) { // FDD
-          // if SR was detected, use the n1_pucch from SR, else use n1_pucch0
-	  //          n1_pucch0 = (SR_payload==1) ? phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex:n1_pucch0;
+        phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
+        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
+        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0;
+        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++;
 
-	  LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex,SR_payload);
+        LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round);
 
-          if (abstraction_flag == 0) {
+        if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
+          LOG_D(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n",
+                phy_vars_eNB->Mod_id,
+                phy_vars_eNB->CC_id,
+                frame,subframe, i,
+                phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
+                phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1);
+
+	  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
+		phy_vars_eNB->Mod_id,harq_pid,
+		frame,subframe,
+		phy_vars_eNB->ulsch_eNB[i]->rnti,
+		dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
+		dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
+		phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0],
+		phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1],
+		phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
+		phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
+		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
+		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
+		ret);
+
+          if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round ==
+              phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) {
+            LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n",
+                  phy_vars_eNB->Mod_id, i);
+            phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
+	    if (phy_vars_eNB->mac_enabled==1) {
+	      mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
+					phy_vars_eNB->CC_id,
+					frame,
+					phy_vars_eNB->eNB_UE_stats[i].crnti);
+	    }
+            mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti);
 
+            phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
+            //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0;
 
+          } else {
+            // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI)
+            phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1;
 
-            metric0 = rx_pucch(phy_vars_eNB,
-                               pucch_format1a,
-                               i,
-                               (uint16_t)n1_pucch0,
-                               0, //n2_pucch
-                               0, // shortened format
-                               pucch_payload0,
+            get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms,
                                subframe,
-                               PUCCH1a_THRES);
+                               frame,
+                               &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame,
+                               &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe);
+          }
+          LOG_D(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error, i = %d \n", frame,subframe,i);
+        } // This is Msg3 error
 
-            if (metric0 < metric0_SR)
-	      metric0=rx_pucch(phy_vars_eNB,
-			       pucch_format1a,
-			       i,
-			       phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex,
-			       0, //n2_pucch
-			       0, // shortened format
-			       pucch_payload0,
-			       subframe,
-			       PUCCH1a_THRES);
-	  }
-          else {
-#ifdef PHY_ABSTRACTION
-            metric0 = rx_pucch_emul(phy_vars_eNB,i,
-                                    pucch_format1a,
-                                    0,
-                                    pucch_payload0,
-                                    subframe);
+        else { //normal ULSCH
+          LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n",
+                phy_vars_eNB->Mod_id,harq_pid,
+                frame,subframe, i,
+                phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
+                phy_vars_eNB->ulsch_eNB[i]->Mlimit,
+                phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
+                phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]);
+
+#if defined(MESSAGE_CHART_GENERATOR_PHY)
+          MSC_LOG_RX_DISCARDED_MESSAGE(
+            MSC_PHY_ENB,MSC_PHY_UE,
+            NULL,0,
+            "%05u:%02u ULSCH received rnti %x harq id %u round %d",
+            frame,subframe,
+            phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1
+            );
 #endif
-          }
 
-#ifdef DEBUG_PHY_PROC
-          LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n",
-                phy_vars_eNB->Mod_id,
-                phy_vars_eNB->dlsch_eNB[i][0]->rnti,
-                frame,subframe,
-                pucch_payload0[0],metric0);
+          if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mlimit) {
+            LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mlimit %d reached\n",
+                  phy_vars_eNB->Mod_id,harq_pid,
+                  frame,subframe, i,
+                  phy_vars_eNB->ulsch_eNB[i]->Mlimit);
+
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0;
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0;
+            phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++;
+            phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors++;
+
+	    // indicate error to MAC
+	    mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
+			      phy_vars_eNB->CC_id,
+			      frame,subframe,
+			      phy_vars_eNB->ulsch_eNB[i]->rnti,
+			      NULL,
+			      0,
+			      harq_pid,
+			      &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag);
+          }
+        }
+      }  // ulsch in error
+      else {
+        if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
+	  LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n",
+		phy_vars_eNB->Mod_id,harq_pid,
+		frame,subframe);
+	  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
+		phy_vars_eNB->Mod_id,harq_pid,
+		frame,subframe,
+		phy_vars_eNB->ulsch_eNB[i]->rnti,
+		dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
+		dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
+		phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0],
+		phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1],
+		phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
+		phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
+		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
+		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
+		ret);
+	}
+#if defined(MESSAGE_CHART_GENERATOR_PHY)
+        MSC_LOG_RX_MESSAGE(
+          MSC_PHY_ENB,MSC_PHY_UE,
+          NULL,0,
+          "%05u:%02u ULSCH received rnti %x harq id %u",
+          frame,subframe,
+          phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid
+          );
 #endif
+        for (j=0; j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx; j++)
+          //this is the RSSI per RB
+          phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] =
+	    
+            dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]*
+                     (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/
+                     phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) -
+            phy_vars_eNB->rx_total_gain_eNB_dB -
+            hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 -
+            get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100;
+	    
+        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
+        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
+        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
+        phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0;
 
-          process_HARQ_feedback(i,sched_subframe,phy_vars_eNB,
-                                0,// pusch_flag
-                                pucch_payload0,
-                                2,
-                                SR_payload);
+        if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
+	  if (phy_vars_eNB->mac_enabled==1) {
 
-        } // FDD
-        else {  //TDD
+	    LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n",
+		  phy_vars_eNB->Mod_id,
+		  frame,harq_pid,i);
+	    
+	    mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
+			      phy_vars_eNB->CC_id,
+			      frame,subframe,
+			      phy_vars_eNB->ulsch_eNB[i]->rnti,
+			      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
+			      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3,
+			      harq_pid,
+			      &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag);
+	    
+	    // one-shot msg3 detection by MAC: empty PDU (e.g. CRNTI)
+	    if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 0 ) {
+	      phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
+	      mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
+					phy_vars_eNB->CC_id,
+					frame,
+					phy_vars_eNB->eNB_UE_stats[i].crnti);
+	      mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti);
+	      phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
+	    } // Msg3_flag == 0
+	    
+	  } // mac_enabled==1
 
-          bundling_flag = phy_vars_eNB->pucch_config_dedicated[i].tdd_AckNackFeedbackMode;
+          phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH;
+          phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0;
 
-          // fix later for 2 TB case and format1b
+	  LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,subframe,i);
 
-          if ((frame_parms->frame_type==FDD) ||
-              (bundling_flag==bundling)    ||
-              ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) {
-            format = pucch_format1a;
-            //      msg("PUCCH 1a\n");
-          } else {
-            format = pucch_format1b;
-            //      msg("PUCCH 1b\n");
-          }
+          for (k=0; k<8; k++) { //harq_processes
+            for (j=0; j<phy_vars_eNB->dlsch_eNB[i][0]->Mlimit; j++) {
+              phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0;
+              phy_vars_eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0;
+              phy_vars_eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0;
+            }
 
-          // if SR was detected, use the n1_pucch from SR
-          if (SR_payload==1) {
-#ifdef DEBUG_PHY_PROC
-            LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id,
-                  phy_vars_eNB->dlsch_eNB[i][0]->rnti,
-                  frame,subframe,
-                  n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
-#endif
+            phy_vars_eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0;
+            phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[k]=0;
+            phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0;
 
-            if (abstraction_flag == 0)
-              metric0_SR = rx_pucch(phy_vars_eNB,
-				    format,
-				    i,
-				    phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex,
-				    0, //n2_pucch
-				    0, // shortened format
-				    pucch_payload0,
-				    subframe,
-				    PUCCH1a_THRES);
-            else {
-#ifdef PHY_ABSTRACTION
-              metric0 = rx_pucch_emul(phy_vars_eNB,i,
-                                      format,
-                                      0,
-                                      pucch_payload0,
-                                      subframe);
-#endif
+            for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->Mlimit; j++) {
+              phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0;
+              phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0;
+              phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0;
+              phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0;
             }
-          } else { //using n1_pucch0/n1_pucch1 resources
+          }
+
+          phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0;
+          phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK_round0=0;
+          phy_vars_eNB->eNB_UE_stats[i].dlsch_mcs_offset=0;
+        } // Msg3_flag==1
+	else {  // Msg3_flag == 0
+
 #ifdef DEBUG_PHY_PROC
-            LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id,
-                  phy_vars_eNB->dlsch_eNB[i][0]->rnti,
-                  frame,subframe,
-                  n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
-#endif
-            metric0=0;
-            metric1=0;
+#ifdef DEBUG_ULSCH
+          LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe,
+                harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
 
-            // Check n1_pucch0 metric
-            if (n1_pucch0 != -1) {
-              if (abstraction_flag == 0)
-                metric0 = rx_pucch(phy_vars_eNB,
-                                   format,
-                                   i,
-                                   (uint16_t)n1_pucch0,
-                                   0, // n2_pucch
-                                   0, // shortened format
-                                   pucch_payload0,
-                                   subframe,
-                                   PUCCH1a_THRES);
-              else {
-#ifdef PHY_ABSTRACTION
-                metric0 = rx_pucch_emul(phy_vars_eNB,i,
-                                        format,
-                                        0,
-                                        pucch_payload0,
-                                        subframe);
+          for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++)
+            LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]);
+
+          LOG_T(PHY,"\n");
+#endif
 #endif
-              }
-            }
 
-            // Check n1_pucch1 metric
-            if (n1_pucch1 != -1) {
-              if (abstraction_flag == 0)
-                metric1 = rx_pucch(phy_vars_eNB,
-                                   format,
-                                   i,
-                                   (uint16_t)n1_pucch1,
-                                   0, //n2_pucch
-                                   0, // shortened format
-                                   pucch_payload1,
-                                   subframe,
-                                   PUCCH1a_THRES);
-              else {
-#ifdef PHY_ABSTRACTION
-                metric1 = rx_pucch_emul(phy_vars_eNB,i,
-                                        format,
-                                        1,
-                                        pucch_payload1,
-                                        subframe);
+	  if (phy_vars_eNB->mac_enabled==1) {
 
+	    mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
+			      phy_vars_eNB->CC_id,
+			      frame,subframe,
+			      phy_vars_eNB->ulsch_eNB[i]->rnti,
+			      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
+			      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3,
+			      harq_pid,
+			      NULL);
 
+#ifdef LOCALIZATION
+	    start_meas(&phy_vars_eNB->localization_stats);
+	    aggregate_eNB_UE_localization_stats(phy_vars_eNB,
+						i,
+						frame,
+						subframe,
+						get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 1)/100);
+	    stop_meas(&phy_vars_eNB->localization_stats);
 #endif
-              }
-            }
-          }
+	    
+	  } // mac_enabled==1
+        } // Msg3_flag == 0
 
-          if (SR_payload == 1) {
-            pucch_payload = pucch_payload0;
+        // estimate timing advance for MAC
+        if (abstraction_flag == 0) {
+          sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,sched_subframe);
+          phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/4; //to check
+        }
 
-            if (bundling_flag == bundling)
-              pucch_sel = 2;
-          } else if (bundling_flag == multiplexing) { // multiplexing + no SR
-            pucch_payload = (metric1>metric0) ? pucch_payload1 : pucch_payload0;
-            pucch_sel     = (metric1>metric0) ? 1 : 0;
-          } else { // bundling + no SR
-            if (n1_pucch1 != -1)
-              pucch_payload = pucch_payload1;
-            else if (n1_pucch0 != -1)
-              pucch_payload = pucch_payload0;
+#ifdef DEBUG_PHY_PROC
+        LOG_D(PHY,"[eNB %d] frame %d, subframe %d: user %d: timing advance = %d\n",
+              phy_vars_eNB->Mod_id,
+              frame, subframe,
+              i,
+              phy_vars_eNB->eNB_UE_stats[i].timing_advance_update);
+#endif
 
-            pucch_sel = 2;  // indicate that this is a bundled ACK/NAK
-          }
 
+      }  // ulsch not in error
+
+      // process HARQ feedback
 #ifdef DEBUG_PHY_PROC
-          LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id,
-                phy_vars_eNB->dlsch_eNB[i][0]->rnti,
-                frame,subframe,
-                metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]);
+      LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id,
+            phy_vars_eNB->dlsch_eNB[i][0]->rnti,
+            frame,subframe,
+            i);
 #endif
-          process_HARQ_feedback(i,sched_subframe,phy_vars_eNB,
-                                0,// pusch_flag
-                                pucch_payload,
-                                pucch_sel,
-                                SR_payload);
-        }
+      process_HARQ_feedback(i,
+                            sched_subframe,
+                            phy_vars_eNB,
+                            1, // pusch_flag
+                            0,
+                            0,
+                            0);
+
+#ifdef DEBUG_PHY_PROC
+      LOG_D(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n",
+            phy_vars_eNB->Mod_id,frame,subframe,
+            phy_vars_eNB->eNB_UE_stats[i].sector,
+            harq_pid,
+            i,
+            ret,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status,
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
+            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
+            phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid],
+            phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]);
+#endif
+      
+      // dump stats to VCD
+      if (i==0) {
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0+harq_pid,phy_vars_eNB->pusch_stats_mcs[0][(frame*10)+subframe]);
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0+harq_pid,phy_vars_eNB->pusch_stats_rb[0][(frame*10)+subframe]);
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0+harq_pid,phy_vars_eNB->pusch_stats_round[0][(frame*10)+subframe]);
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[0]));
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES0+harq_pid,ret);
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN0+harq_pid,(frame*10)+subframe);
       }
+    } // ulsch_eNB[0] && ulsch_eNB[0]->rnti>0 && ulsch_eNB[0]->subframe_scheduling_flag == 1
 
-    } 
 
+    // update ULSCH statistics for tracing
     if ((frame % 100 == 0) && (subframe == 4)) {
       for (harq_idx=0; harq_idx<8; harq_idx++) {
         for (round=0; round<phy_vars_eNB->ulsch_eNB[i]->Mlimit; round++) {
@@ -3268,166 +3282,8 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
       phy_vars_eNB->eNB_UE_stats[i].total_TBS_last = phy_vars_eNB->eNB_UE_stats[i].total_TBS;
     }
 
-    num_active_cba_groups = phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups;
-
-    /*if (num_active_cba_groups > 0 )
-      LOG_D(PHY,"[eNB] last slot %d trying cba transmission decoding UE %d num_grps %d rnti %x flag %d\n",
-      last_slot, i, num_active_cba_groups,phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups],
-      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag );
-    */
-    if ((phy_vars_eNB->ulsch_eNB[i]) &&
-        (num_active_cba_groups > 0) &&
-        (phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]>0) &&
-        (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) {
-      rnti=0;
-
-#ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n",
-            phy_vars_eNB->Mod_id,harq_pid,
-            frame,subframe,
-            i, (uint16_t)phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]);
-#endif
-
-      if (abstraction_flag==0) {
-        rx_ulsch(phy_vars_eNB,
-                 sched_subframe,
-                 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
-                 i,
-                 phy_vars_eNB->ulsch_eNB,
-                 0);
-      }
-
-#ifdef PHY_ABSTRACTION
-      else {
-        rx_ulsch_emul(phy_vars_eNB,
-                      subframe,
-                      phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
-                      i);
-      }
-
-#endif
-
-      if (abstraction_flag == 0) {
-        ret = ulsch_decoding(phy_vars_eNB,
-                             i,
-                             sched_subframe,
-                             0, // control_only_flag
-                             phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI,
-                             phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0);
-      }
-
-#ifdef PHY_ABSTRACTION
-      else {
-        ret = ulsch_decoding_emul(phy_vars_eNB,
-                                  sched_subframe,
-                                  i,
-                                  &rnti);
-      }
-
-#endif
-
-      if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) {
-#ifdef DEBUG_PHY_PROC
-        //if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50))
-        print_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL);
-#endif
-        access_mode = UNKNOWN_ACCESS;
-        extract_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,
-                    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,
-                    &phy_vars_eNB->eNB_UE_stats[i],
-                    phy_vars_eNB->lte_frame_parms.N_RB_DL,
-                    &rnti, &access_mode);
-        phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0];
-      }
-
-      /*  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the sched_subframeuling_flag, total cba groups %d %d\n",
-      phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i,harq_pid,
-      phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups,num_active_cba_groups);
-      */
-      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0;
-      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->status= SCH_IDLE;
-
-      if ((num_active_cba_groups > 0) &&
-          //  (i % num_active_cba_groups == 0) && // this ue is used a a template for the CBA
-          (i + num_active_cba_groups < NUMBER_OF_UE_MAX) &&
-          (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->cba_rnti[i%num_active_cba_groups] > 0 ) &&
-          (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->num_active_cba_groups> 0)) {
-#ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n",
-              phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid,
-              i+num_active_cba_groups, i%phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups);
-#endif
-        phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1;
-        phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE;
-        phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS;
-      }
-
-      if (ret == (1+MAX_TURBO_ITERATIONS)) {
-        phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++;
-      } // ulsch in error
-      else {
-        LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n",
-              phy_vars_eNB->Mod_id,harq_pid,
-              frame,subframe);
-
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
-        phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0;
-#ifdef DEBUG_PHY_PROC
-#ifdef DEBUG_ULSCH
-        LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",
-              frame,subframe,
-              harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
-
-        for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++)
-          LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]);
-
-        LOG_T(PHY,"\n");
-#endif
-#endif
-
-        if (access_mode > UNKNOWN_ACCESS) {
-          LOG_D(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n",
-                phy_vars_eNB->Mod_id, frame,subframe,
-                i, phy_vars_eNB->ulsch_eNB[i]->rnti,
-                i % phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]);
-
-          // detect if there is a CBA collision
-          if (phy_vars_eNB->cba_last_reception[i%num_active_cba_groups] == 0 ) {
-            mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
-                              phy_vars_eNB->CC_id,
-                              frame,subframe,
-                              phy_vars_eNB->ulsch_eNB[i]->rnti,
-                              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
-                              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3,
-                              harq_pid,
-                              NULL);
-
-            phy_vars_eNB->cba_last_reception[i%num_active_cba_groups]+=1;//(subframe);
-          } else {
-            if (phy_vars_eNB->cba_last_reception[i%num_active_cba_groups] == 1 )
-              LOG_N(PHY,"[eNB%d] Frame %d subframe %d : first CBA collision detected \n ",
-                    phy_vars_eNB->Mod_id,frame,subframe);
-
-            LOG_N(PHY,"[eNB%d] Frame %d subframe %d : CBA collision set SR for UE %d in group %d \n ",
-                  phy_vars_eNB->Mod_id,frame,subframe,
-                  phy_vars_eNB->cba_last_reception[i%num_active_cba_groups],i%num_active_cba_groups );
-
-            phy_vars_eNB->cba_last_reception[i%num_active_cba_groups]+=1;
-
-            mac_xface->SR_indication(phy_vars_eNB->Mod_id,
-                                     phy_vars_eNB->CC_id,
-                                     frame,
-                                     phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe);
-          }
-        }
-      } // ULSCH CBA not in error
-    }
-
+    // CBA (non-LTE)
+    cba_procedures(sched_subframe,phy_vars_eNB,i,harq_pid,abstraction_flag);
   } // loop i=0 ... NUMBER_OF_UE_MAX-1
 
   if (abstraction_flag == 0) {
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index 50afd8bcefe..02fe3f1d29b 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -99,7 +99,7 @@ uint64_t DLSCH_alloc_pdu_1[2];
 #define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2)
 //#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
 //#define DLSCH_RB_ALLOC 0x0001
-void do_OFDM_mod_l(mod_sym_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms)
+void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms)
 {
 
   int aa, slot_offset, slot_offset_F;
@@ -2111,7 +2111,7 @@ PMI_FEEDBACK:
 
           //  printf("Trial %d : Round %d, pmi_feedback %d \n",trials,round,pmi_feedback);
           for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
-            memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(mod_sym_t));
+            memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t));
           }
 
           if (input_fd==NULL) {
diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c
index 8b6e4f937e6..9f099446093 100644
--- a/openair1/SIMULATION/LTE_PHY/mbmssim.c
+++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c
@@ -131,7 +131,6 @@ int main(int argc, char **argv)
   double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1=0.0;
   uint8_t snr1set=0;
   double snr_step=1,input_snr_step=1;
-  //mod_sym_t **txdataF;
   int **txdata;
   double **s_re,**s_im,**r_re,**r_im;
   double iqim = 0.0;
@@ -451,7 +450,7 @@ int main(int argc, char **argv)
       //if (trials%100==0)
       //eNB2UE[0]->first_run = 1;
       eNB2UE->first_run = 1;
-      memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(mod_sym_t));
+      memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t));
 
       generate_mch(PHY_vars_eNB,sched_subframe,input_buffer,0);
 
diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c
index e99da5041bb..4a2b3f93512 100644
--- a/openair1/SIMULATION/LTE_PHY/pbchsim.c
+++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c
@@ -57,11 +57,11 @@ PHY_VARS_UE *PHY_vars_UE;
 
 #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
 
-mod_sym_t *dummybuf[4];
-mod_sym_t dummy0[2048*14];
-mod_sym_t dummy1[2048*14];
-mod_sym_t dummy2[2048*14];
-mod_sym_t dummy3[2048*14];
+int32_t *dummybuf[4];
+int32_t dummy0[2048*14];
+int32_t dummy1[2048*14];
+int32_t dummy2[2048*14];
+int32_t dummy3[2048*14];
 
 
 int main(int argc, char **argv)
@@ -72,7 +72,6 @@ int main(int argc, char **argv)
   int i,l,aa;
   double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1;
   uint8_t snr1set=0;
-  //mod_sym_t **txdataF;
   int **txdata,**txdata1,**txdata2;
   double **s_re,**s_im,**s_re1,**s_im1,**s_re2,**s_im2,**r_re,**r_im,**r_re1,**r_im1,**r_re2,**r_im2;
   double iqim = 0.0;
@@ -603,7 +602,7 @@ int main(int argc, char **argv)
       dummybuf[2] = dummy2;
       dummybuf[3] = dummy3;
       generate_pbch(&PHY_vars_eNB->lte_eNB_pbch,
-                    (mod_sym_t**)dummybuf,
+                    (int32_t**)dummybuf,
                     AMP,
                     &PHY_vars_eNB->lte_frame_parms,
                     pbch_pdu,
diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c
index b87711348fc..94bbbfaec3f 100644
--- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c
+++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c
@@ -410,7 +410,6 @@ int main(int argc, char **argv)
 
   int i,l,aa;
   double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1;
-  //mod_sym_t **txdataF;
 
   int **txdata;
   double **s_re,**s_im,**r_re,**r_im;
@@ -773,8 +772,8 @@ int main(int argc, char **argv)
 
 
 
-  PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(8,MAX_TURBO_ITERATIONS,N_RB_DL,0);
-  PHY_vars_UE->ulsch_ue[0]   = new_ue_ulsch(8,N_RB_DL,0);
+  PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0);
+  PHY_vars_UE->ulsch_ue[0]   = new_ue_ulsch(N_RB_DL,0);
 
 
   PHY_vars_eNB->proc[subframe].frame_tx    = 0;
@@ -838,7 +837,7 @@ int main(int argc, char **argv)
 
       //    printf("DCI (SF %d): txdataF %p (0 %p)\n",subframe,&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][512*14*subframe],&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0]);
       for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB; aa++) {
-        memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(mod_sym_t));
+        memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t));
 
         /*
         re_offset = PHY_vars_eNB->lte_frame_parms.first_carrier_offset;
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index 440a5ec5679..4d0de016a28 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -635,8 +635,8 @@ int main(int argc, char **argv)
   UE2eNB->max_Doppler = maxDoppler;
 
   // NN: N_RB_UL has to be defined in ulsim
-  PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(8,max_turbo_iterations,N_RB_DL,0);
-  PHY_vars_UE->ulsch_ue[0]   = new_ue_ulsch(8,N_RB_DL,0);
+  PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(max_turbo_iterations,N_RB_DL,0);
+  PHY_vars_UE->ulsch_ue[0]   = new_ue_ulsch(N_RB_DL,0);
 
   // Create transport channel structures for 2 transport blocks (MIMO)
   for (i=0; i<2; i++) {
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index 80190fe1729..30272346f5f 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -184,6 +184,12 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
 	      size_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
 	      size_bits  = sizeof_DCI1A_1_5MHz_FDD_t;
 	      break;
+	    case 15:/*
+	      ((DCI1A_2_5MHz_FDD_t*)DLSCH_dci)->type = 1;
+	      ((DCI1A_2_5MHz_FDD_t*)DLSCH_dci)->rballoc = 31;
+	      size_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
+	      size_bits  = sizeof_DCI1A_1_5MHz_FDD_t;*/
+	      break;
 	    case 25:
 	      ((DCI1A_5MHz_FDD_t*)DLSCH_dci)->type = 1;
 	      ((DCI1A_5MHz_FDD_t*)DLSCH_dci)->rballoc = 511;
@@ -196,6 +202,12 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
 	      size_bytes = sizeof(DCI1A_10MHz_FDD_t);
 	      size_bits  = sizeof_DCI1A_10MHz_FDD_t;
 		break;
+	    case 75:
+	      /*	      ((DCI1A_15MHz_FDD_t*)DLSCH_dci)->type = 1;
+	      ((DCI1A_15MHz_FDD_t*)DLSCH_dci)->rballoc = 2047;
+	      size_bytes = sizeof(DCI1A_10MHz_FDD_t);
+	      size_bits  = sizeof_DCI1A_10MHz_FDD_t;*/
+		break;
 	    case 100:
 	      ((DCI1A_20MHz_FDD_t*)DLSCH_dci)->type = 1;
 	      ((DCI1A_20MHz_FDD_t*)DLSCH_dci)->rballoc = 8191;
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index d68f26370b0..2973bedd00e 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -183,21 +183,10 @@ void rx_sdu(
         UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f);
 
 	// update buffer info
-	//	old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid];
 	
 	UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid]=BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid]];
 
-	UE_list->UE_template[CC_idP][UE_id].ul_total_buffer+= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid];
-
-	/*
-	if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info)
-	  UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info;
-	else
-	  UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0;
-	*/
-
-	if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= 300000)
-	  UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 300000;
+	UE_list->UE_template[CC_idP][UE_id].ul_total_buffer= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid];
 
 	PHY_vars_eNB_g[enb_mod_idP][CC_idP]->pusch_stats_bsr[UE_id][(frameP*10)+subframeP] = (payload_ptr[0] & 0x3f);
 	if (UE_id == UE_list->head)
@@ -784,7 +773,7 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
 		UE_sched_ctrl->ul_failure_timer);
           // reset the scheduling request
           UE_template->ul_SR = 0;
-          aggregation = process_ue_cqi(module_idP,UE_id); // =2 by default!!
+          aggregation = process_ue_cqi(module_idP,UE_id); 
           status = mac_eNB_get_rrc_status(module_idP,rnti);
 	  if (status < RRC_CONNECTED)
 	    cqi_req = 0;
@@ -838,7 +827,7 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
 	    UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power;
 	    UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=UE_template->pre_assigned_mcs_ul;
             mcs = cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS
-	    if ((cqi_req==1) && (mcs==20)) {
+	    if ((cqi_req==1) && (mcs>19)) {
 		mcs=19;
 	    }
             if (UE_template->pre_allocated_rb_table_index_ul >=0) {
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c
index 4038c33bda3..78e481f3d6c 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.c
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.c
@@ -119,6 +119,7 @@ const char* eurecomVariablesNames[] = {
   "mp_free",
   "ue_inst_cnt_rx",
   "ue_inst_cnt_tx",
+  "dci_info",
   "ue0_BSR",
   "ue0_BO",
   "ue0_scheduled",
@@ -133,6 +134,14 @@ const char* eurecomVariablesNames[] = {
   "ue0_rssi5",
   "ue0_rssi6",
   "ue0_rssi7",
+  "ue0_res0",
+  "ue0_res1",
+  "ue0_res2",
+  "ue0_res3",
+  "ue0_res4",
+  "ue0_res5",
+  "ue0_res6",
+  "ue0_res7",
   "ue0_MCS0",
   "ue0_MCS1",
   "ue0_MCS2",
@@ -157,6 +166,14 @@ const char* eurecomVariablesNames[] = {
   "ue0_ROUND5",
   "ue0_ROUND6",
   "ue0_ROUND7",
+  "ue0_SFN0",
+  "ue0_SFN1",
+  "ue0_SFN2",
+  "ue0_SFN3",
+  "ue0_SFN4",
+  "ue0_SFN5",
+  "ue0_SFN6",
+  "ue0_SFN7",
 };
 
 const char* eurecomFunctionsNames[] = {
@@ -238,6 +255,7 @@ const char* eurecomFunctionsNames[] = {
   "macxface_phy_config_sib2_eNB",
   "macxface_phy_config_dedicated_eNB",
   "phy_ue_compute_prach",
+  "phy_enb_ulsch_msg3",
   "phy_enb_ulsch_decoding0",
   "phy_enb_ulsch_decoding1",
   "phy_enb_ulsch_decoding2",
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h
index 24a0efee279..a9e43393687 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.h
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.h
@@ -91,6 +91,7 @@ typedef enum {
   VCD_SIGNAL_DUMPER_VARIABLE_MP_FREE,
   VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX,
   VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX,
+  VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,
   VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR,
   VCD_SIGNAL_DUMPER_VARIABLES_UE0_BO,
   VCD_SIGNAL_DUMPER_VARIABLES_UE0_SCHEDULED,
@@ -105,6 +106,14 @@ typedef enum {
   VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI5,
   VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI6,
   VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI7,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES0,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES1,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES2,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES3,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES4,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES5,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES6,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES7,
   VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0,
   VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS1,
   VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS2,
@@ -129,6 +138,14 @@ typedef enum {
   VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND5,
   VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND6,
   VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND7,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN0,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN1,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN2,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN3,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN4,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN5,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN6,
+  VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN7,
   VCD_SIGNAL_DUMPER_VARIABLES_LAST,
   VCD_SIGNAL_DUMPER_VARIABLES_END = VCD_SIGNAL_DUMPER_VARIABLES_LAST,
 } vcd_signal_dump_variables;
@@ -212,6 +229,7 @@ typedef enum {
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_SIB2_ENB,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_DEDICATED_ENB,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_COMPUTE_PRACH,
+  VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING1,
   VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING2,
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf
index e083ea0f4ef..7d34889f678 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf
@@ -36,7 +36,7 @@ eNBs =
         nb_antennas_tx          			      = 1;
         nb_antennas_rx          			      = 1;
         tx_gain                                            = 90;
-        rx_gain                                            = 127;
+        rx_gain                                            = 125;
         prach_root              			      = 0;
         prach_config_index      			      = 0;
         prach_high_speed        			      = "DISABLE";
@@ -66,7 +66,7 @@ eNBs =
 
         pusch_p0_Nominal                                   = -90;
         pusch_alpha                                        = "AL1";
-        pucch_p0_Nominal                                   = -108;
+        pucch_p0_Nominal                                   = -100;
         msg3_delta_Preamble                                = 6;
         pucch_deltaF_Format1                               = "deltaF2";
         pucch_deltaF_Format1b                              = "deltaF3";
@@ -140,10 +140,10 @@ eNBs =
     NETWORK_INTERFACES :
     {
         ENB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.12.213/24";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.12.215/24";
 
         ENB_INTERFACE_NAME_FOR_S1U               = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.12.213/24";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.12.215/24";
         ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
     };
 
diff --git a/targets/RT/USER/eNB_usrp.gtkw b/targets/RT/USER/eNB_usrp.gtkw
index b7810896d57..935bf68b2eb 100644
--- a/targets/RT/USER/eNB_usrp.gtkw
+++ b/targets/RT/USER/eNB_usrp.gtkw
@@ -1,15 +1,15 @@
 [*]
 [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI
-[*] Thu Mar 17 23:50:10 2016
+[*] Sun Apr 10 20:34:38 2016
 [*]
 [dumpfile] "/tmp/openair_dump_eNB.vcd"
-[dumpfile_mtime] "Thu Mar 17 23:49:36 2016"
-[dumpfile_size] 236045612
+[dumpfile_mtime] "Sun Apr 10 20:26:57 2016"
+[dumpfile_size] 181182776
 [savefile] "/home/papillon/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw"
-[timestart] 10372000000
+[timestart] 19787100000
 [size] 1535 876
 [pos] -1 -1
-*-29.793451 12619679774 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+*-21.793451 19795882832 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 [sst_width] 284
 [signals_width] 238
 [sst_expanded] 1
@@ -51,82 +51,110 @@ functions.eNB_thread_tx9
 functions.phy_procedures_eNb_tx
 functions.phy_procedures_eNb_rx
 @24
+variables.dci_info[63:0]
 variables.ue0_BO[63:0]
 @420
 variables.ue0_BSR[63:0]
-@421
 variables.ue0_timing_advance[63:0]
 @28
 functions.macxface_initiate_ra_proc
 functions.macxface_terminate_ra_proc
+functions.phy_enb_ulsch_msg3
 functions.macxface_SR_indication
 @420
 variables.ue0_SR_ENERGY[63:0]
 variables.ue0_SR_THRES[63:0]
+@25
+variables.dci_info[63:0]
 @28
 functions.phy_enb_ulsch_decoding0
+@24
+variables.ue0_res0[63:0]
 @420
 variables.ue0_rssi0[63:0]
 variables.ue0_MCS0[63:0]
 variables.ue0_RB0[63:0]
 @24
 variables.ue0_ROUND0[63:0]
+variables.ue0_SFN0[63:0]
 @28
 functions.phy_enb_ulsch_decoding1
+@24
+variables.ue0_res1[63:0]
 @420
 variables.ue0_rssi1[63:0]
 variables.ue0_MCS1[63:0]
 variables.ue0_RB1[63:0]
 @24
 variables.ue0_ROUND1[63:0]
+variables.ue0_SFN1[63:0]
 @28
 functions.phy_enb_ulsch_decoding2
+@24
+variables.ue0_res2[63:0]
 @420
 variables.ue0_rssi2[63:0]
 variables.ue0_MCS2[63:0]
 variables.ue0_RB2[63:0]
 @24
 variables.ue0_ROUND2[63:0]
+variables.ue0_SFN2[63:0]
 @28
 functions.phy_enb_ulsch_decoding3
+@24
+variables.ue0_res3[63:0]
 @420
 variables.ue0_rssi3[63:0]
 variables.ue0_MCS3[63:0]
 variables.ue0_RB3[63:0]
 @24
 variables.ue0_ROUND3[63:0]
+variables.ue0_SFN3[63:0]
 @28
 functions.phy_enb_ulsch_decoding4
 @420
 variables.ue0_rssi4[63:0]
+@24
+variables.ue0_res4[63:0]
+@420
 variables.ue0_MCS4[63:0]
 variables.ue0_RB4[63:0]
 @24
 variables.ue0_ROUND4[63:0]
+variables.ue0_SFN4[63:0]
 @28
 functions.phy_enb_ulsch_decoding5
+@24
+variables.ue0_res5[63:0]
 @420
 variables.ue0_rssi5[63:0]
 variables.ue0_MCS5[63:0]
 variables.ue0_RB5[63:0]
 @24
 variables.ue0_ROUND5[63:0]
+variables.ue0_SFN5[63:0]
 @28
 functions.phy_enb_ulsch_decoding6
+@24
+variables.ue0_res6[63:0]
 @420
 variables.ue0_rssi6[63:0]
 variables.ue0_MCS6[63:0]
 variables.ue0_RB6[63:0]
 @24
 variables.ue0_ROUND6[63:0]
+variables.ue0_SFN6[63:0]
 @28
 functions.phy_enb_ulsch_decoding7
+@24
+variables.ue0_res7[63:0]
 @420
 variables.ue0_rssi7[63:0]
 variables.ue0_MCS7[63:0]
 variables.ue0_RB7[63:0]
 @24
 variables.ue0_ROUND7[63:0]
+variables.ue0_SFN7[63:0]
 @28
 functions.phy_enb_prach_rx
 functions.phy_eNB_dlsch_encoding
-- 
GitLab