From 8b1416b8621c810fe89da0544feba2c72cbe2905 Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Mon, 9 Apr 2018 15:32:49 -0700
Subject: [PATCH] debugging of new directory structure, file renaming, and
 eNB/UE splitting. dlsim/ulsim functional.

---
 cmake_targets/CMakeLists.txt                  |  162 +-
 common/utils/load_module_shlib.c              |    2 +-
 openair1/PHY/CODING/3gpplte.c                 |    2 +-
 openair1/PHY/CODING/3gpplte_sse.c             |    4 +-
 openair1/PHY/CODING/3gpplte_turbo_decoder.c   |    4 +-
 .../CODING/3gpplte_turbo_decoder_avx2_16bit.c |    4 +-
 .../CODING/3gpplte_turbo_decoder_sse_16bit.c  |    4 +-
 .../CODING/3gpplte_turbo_decoder_sse_8bit.c   |    4 +-
 openair1/PHY/CODING/ccoding_byte.c            |    2 +-
 openair1/PHY/CODING/ccoding_byte_lte.c        |    2 +-
 openair1/PHY/CODING/coding_load.c             |    4 +-
 openair1/PHY/CODING/crc_byte.c                |    2 +-
 openair1/PHY/CODING/lte_rate_matching.c       |    3 +-
 openair1/PHY/CODING/lte_segmentation.c        |    5 +-
 openair1/PHY/CODING/viterbi_lte.c             |    4 +-
 openair1/PHY/INIT/{extern.h => init_extern.h} |    0
 openair1/PHY/INIT/init_top.c                  |    6 +-
 openair1/PHY/INIT/{vars.h => init_vars.h}     |    0
 openair1/PHY/INIT/lte_init.c                  |   28 +-
 openair1/PHY/INIT/lte_init_ru.c               |    9 +-
 openair1/PHY/INIT/lte_init_ue.c               |   14 +-
 openair1/PHY/INIT/lte_param_init.c            |    7 +-
 openair1/PHY/INIT/lte_parms.c                 |    2 +-
 openair1/PHY/INIT/{defs.h => phy_init.h}      |    4 +-
 openair1/PHY/LTE_ESTIMATION/adjust_gain.c     |    4 +-
 .../PHY/LTE_ESTIMATION/freq_equalization.c    |    4 +-
 openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c |  128 +-
 .../lte_dl_bf_channel_estimation.c            |    3 +-
 .../lte_dl_channel_estimation.c               |    4 +-
 .../lte_dl_mbsfn_channel_estimation.c         |    3 +-
 .../PHY/LTE_ESTIMATION/lte_eNB_measurements.c |    4 +-
 .../PHY/LTE_ESTIMATION/lte_est_freq_offset.c  |    2 +-
 .../{defs.h => lte_estimation_defs.h}         |    4 +-
 .../{extern.h => lte_estimation_extern.h}     |    0
 .../{vars.h => lte_estimation_vars.h}         |    0
 openair1/PHY/LTE_ESTIMATION/lte_sync_time.c   |   23 +-
 .../PHY/LTE_ESTIMATION/lte_sync_timefreq.c    |    4 +-
 .../PHY/LTE_ESTIMATION/lte_ue_measurements.c  | 1182 +--
 .../lte_ul_channel_estimation.c               |    7 +-
 openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c    |    5 +-
 openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c        |    6 +-
 openair1/PHY/LTE_REFSIG/lte_dl_uespec.c       |    6 +-
 openair1/PHY/LTE_REFSIG/lte_gold.c            |    2 +-
 openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c      |    2 +-
 .../PHY/LTE_REFSIG/{defs.h => lte_refsig.h}   |    3 +-
 openair1/PHY/LTE_REFSIG/lte_ul_ref.c          |    2 +-
 openair1/PHY/LTE_TRANSPORT/dci.c              |  143 +-
 openair1/PHY/LTE_TRANSPORT/dci.h              |    7 +
 openair1/PHY/LTE_TRANSPORT/dci_tools.c        | 7166 +----------------
 .../LTE_TRANSPORT/dci_tools_common_extern.h   |   89 +
 openair1/PHY/LTE_TRANSPORT/dlsch_coding.c     |  195 +-
 openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c |   11 +-
 openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c |   36 +-
 openair1/PHY/LTE_TRANSPORT/edci.c             |   11 +-
 openair1/PHY/LTE_TRANSPORT/group_hopping.c    |    2 +-
 openair1/PHY/LTE_TRANSPORT/if4_tools.c        |    6 +-
 openair1/PHY/LTE_TRANSPORT/if4_tools.h        |    2 +-
 openair1/PHY/LTE_TRANSPORT/if5_tools.c        |    2 +-
 openair1/PHY/LTE_TRANSPORT/if5_tools.h        |    2 +-
 openair1/PHY/LTE_TRANSPORT/lte_mcs.c          |    6 +-
 openair1/PHY/LTE_TRANSPORT/pbch.c             |   35 +-
 openair1/PHY/LTE_TRANSPORT/pcfich.c           |   48 +-
 openair1/PHY/LTE_TRANSPORT/phich.c            |  800 +-
 openair1/PHY/LTE_TRANSPORT/pilots.c           |    3 +-
 openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c     |    4 +-
 openair1/PHY/LTE_TRANSPORT/pmch.c             |  194 +-
 openair1/PHY/LTE_TRANSPORT/power_control.c    |    5 +-
 openair1/PHY/LTE_TRANSPORT/prach.c            |    9 +-
 openair1/PHY/LTE_TRANSPORT/prach_common.c     |   60 +-
 openair1/PHY/LTE_TRANSPORT/pss.c              |   11 +-
 openair1/PHY/LTE_TRANSPORT/pucch.c            |    8 +-
 openair1/PHY/LTE_TRANSPORT/pucch_common.c     |   21 +-
 openair1/PHY/LTE_TRANSPORT/rar_tools.c        |  168 +-
 openair1/PHY/LTE_TRANSPORT/sss.c              |    6 +-
 openair1/PHY/LTE_TRANSPORT/transport_common.h |   10 +
 openair1/PHY/LTE_TRANSPORT/transport_eNB.h    |    2 +-
 .../{extern.h => transport_extern.h}          |    2 +
 openair1/PHY/LTE_TRANSPORT/transport_proto.h  |   11 +-
 .../{vars.h => transport_vars.h}              |    8 +
 openair1/PHY/LTE_TRANSPORT/uci_common.h       |    4 +
 openair1/PHY/LTE_TRANSPORT/uci_tools.c        |    3 +-
 openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c   |   21 +-
 .../PHY/LTE_TRANSPORT/ulsch_demodulation.c    |    7 +-
 openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c  | 3800 +--------
 openair1/PHY/LTE_UE_TRANSPORT/dci_ue.c        |  490 +-
 .../PHY/LTE_UE_TRANSPORT/dlsch_decoding.c     |  190 +-
 .../PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c |   10 +-
 .../LTE_UE_TRANSPORT/dlsch_llr_computation.c  |   11 +-
 .../dlsch_llr_computation_avx2.c              |    9 +-
 .../PHY/LTE_UE_TRANSPORT/drs_modulation.c     |    6 +-
 openair1/PHY/LTE_UE_TRANSPORT/initial_sync.c  |   11 +-
 openair1/PHY/LTE_UE_TRANSPORT/pbch_ue.c       |   10 +-
 openair1/PHY/LTE_UE_TRANSPORT/pcfich_ue.c     |   40 +-
 openair1/PHY/LTE_UE_TRANSPORT/pch_ue.c        |    4 +-
 openair1/PHY/LTE_UE_TRANSPORT/phich_ue.c      |  361 +-
 openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c       |  104 +-
 .../PHY/LTE_UE_TRANSPORT/power_control_ue.c   |  152 -
 openair1/PHY/LTE_UE_TRANSPORT/prach_ue.c      |   11 +-
 openair1/PHY/LTE_UE_TRANSPORT/pucch_ue.c      |   41 +-
 openair1/PHY/LTE_UE_TRANSPORT/rar_tools_ue.c  |  206 +
 .../PHY/LTE_UE_TRANSPORT/srs_modulation.c     |    4 +-
 openair1/PHY/LTE_UE_TRANSPORT/sss_ue.c        |    7 +-
 .../PHY/LTE_UE_TRANSPORT/transport_proto_ue.h | 1667 ++++
 openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h  |    8 +-
 openair1/PHY/LTE_UE_TRANSPORT/uci_tools_ue.c  |    6 +-
 openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c  |   15 +-
 .../PHY/LTE_UE_TRANSPORT/ulsch_modulation.c   |   22 +-
 openair1/PHY/MODULATION/beamforming.c         |   13 +-
 openair1/PHY/MODULATION/compute_bf_weights.c  |    1 +
 openair1/PHY/MODULATION/defs.h                |  134 -
 openair1/PHY/MODULATION/extern.h              |   21 -
 openair1/PHY/MODULATION/modulation_UE.h       |   74 +
 openair1/PHY/MODULATION/modulation_eNB.h      |   66 +
 .../{vars.h => modulation_extern.h}           |   27 +-
 .../MODULATION/modulation_vars.h}             |    8 +-
 openair1/PHY/MODULATION/ofdm_mod.c            |    4 +-
 openair1/PHY/MODULATION/slot_fep.c            |    4 +-
 openair1/PHY/MODULATION/slot_fep_mbsfn.c      |    4 +-
 openair1/PHY/MODULATION/slot_fep_ul.c         |    6 +-
 openair1/PHY/MODULATION/ul_7_5_kHz.c          |  116 +-
 openair1/PHY/TOOLS/cadd_vv.c                  |    3 +-
 openair1/PHY/TOOLS/cdot_prod.c                |    2 +-
 openair1/PHY/TOOLS/cmult_sv.c                 |    2 +-
 openair1/PHY/TOOLS/cmult_vv.c                 |    3 +-
 openair1/PHY/TOOLS/dB_routines.c              |    2 +-
 openair1/PHY/TOOLS/lte_dfts.c                 |    6 +-
 openair1/PHY/TOOLS/lte_phy_scope.h            |    7 +-
 openair1/PHY/TOOLS/signal_energy.c            |    2 +-
 openair1/PHY/TOOLS/tools_defs.h               |    1 -
 openair1/PHY/phy_extern.h                     |   10 +-
 openair1/PHY/phy_vars.h                       |    9 +-
 openair1/SCHED/fapi_l1.h                      |    3 +-
 openair1/SCHED/phy_procedures_lte_common.c    |   11 +-
 openair1/SCHED/phy_procedures_lte_eNb.c       |  149 +-
 openair1/SCHED/prach_procedures.c             |    7 +-
 openair1/SCHED/ru_procedures.c                |   10 +-
 ...hed_eNB_extern.h => sched_common_extern.h} |   11 +-
 openair1/SCHED/sched_common_vars.h            |   28 +
 openair1/SCHED/sched_eNB.h                    |  344 +-
 openair1/SCHED_UE/phy_procedures_lte_ue.c     |   87 +-
 openair1/SCHED_UE/pucch_pc.c                  |    9 +-
 openair1/SCHED_UE/pusch_pc.c                  |   82 +-
 openair1/SCHED_UE/srs_pc.c                    |    6 +-
 openair1/SIMULATION/LTE_PHY/dlsim.c           |   27 +-
 openair1/SIMULATION/LTE_PHY/ulsim.c           |   53 +-
 openair1/SIMULATION/RF/dac.c                  |    4 +-
 openair1/SIMULATION/RF/rf.c                   |    5 +-
 openair1/SIMULATION/RF/{defs.h => rf.h}       |    4 +-
 openair1/SIMULATION/TOOLS/abstraction.c       |    4 +-
 openair1/SIMULATION/TOOLS/multipath_channel.c |    5 +-
 .../SIMULATION/TOOLS/multipath_tv_channel.c   |    4 +-
 openair1/SIMULATION/TOOLS/random_channel.c    |    4 +-
 openair1/SIMULATION/TOOLS/rangen_double.c     |    2 +-
 openair1/SIMULATION/TOOLS/{defs.h => sim.h}   |    2 +-
 openair2/COMMON/phy_messages_types.h          |    6 +-
 openair2/ENB_APP/enb_config.h                 |    4 +-
 openair2/ENB_APP/flexran_agent_common.h       |    1 -
 openair2/ENB_APP/flexran_agent_ran_api.h      |    9 +-
 openair2/LAYER2/MAC/mac_vars.h                |    4 +-
 openair2/PHY_INTERFACE/defs.h                 |  373 -
 openair2/PHY_INTERFACE/phy_interface.h        |   55 +
 openair2/RRC/LTE/rrc_eNB_UE_context.h         |    2 +-
 openair2/RRC/LTE/rrc_extern.h                 |    6 +-
 openair2/UTIL/OCG/OCG.h                       |    2 +-
 targets/RT/USER/lte-softmodem.h               |    2 +-
 165 files changed, 3808 insertions(+), 16021 deletions(-)
 rename openair1/PHY/INIT/{extern.h => init_extern.h} (100%)
 rename openair1/PHY/INIT/{vars.h => init_vars.h} (100%)
 rename openair1/PHY/INIT/{defs.h => phy_init.h} (99%)
 rename openair1/PHY/LTE_ESTIMATION/{defs.h => lte_estimation_defs.h} (99%)
 rename openair1/PHY/LTE_ESTIMATION/{extern.h => lte_estimation_extern.h} (100%)
 rename openair1/PHY/LTE_ESTIMATION/{vars.h => lte_estimation_vars.h} (100%)
 rename openair1/PHY/LTE_REFSIG/{defs.h => lte_refsig.h} (99%)
 create mode 100644 openair1/PHY/LTE_TRANSPORT/dci_tools_common_extern.h
 rename openair1/PHY/LTE_TRANSPORT/{extern.h => transport_extern.h} (98%)
 rename openair1/PHY/LTE_TRANSPORT/{vars.h => transport_vars.h} (89%)
 delete mode 100644 openair1/PHY/LTE_UE_TRANSPORT/power_control_ue.c
 create mode 100644 openair1/PHY/LTE_UE_TRANSPORT/rar_tools_ue.c
 create mode 100644 openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h
 delete mode 100644 openair1/PHY/MODULATION/defs.h
 delete mode 100644 openair1/PHY/MODULATION/extern.h
 create mode 100644 openair1/PHY/MODULATION/modulation_UE.h
 create mode 100644 openair1/PHY/MODULATION/modulation_eNB.h
 rename openair1/PHY/MODULATION/{vars.h => modulation_extern.h} (62%)
 rename openair1/{SCHED/sched_eNB_vars.h => PHY/MODULATION/modulation_vars.h} (80%)
 rename openair1/SCHED/{sched_eNB_extern.h => sched_common_extern.h} (88%)
 create mode 100644 openair1/SCHED/sched_common_vars.h
 rename openair1/SIMULATION/RF/{defs.h => rf.h} (98%)
 rename openair1/SIMULATION/TOOLS/{defs.h => sim.h} (99%)
 delete mode 100644 openair2/PHY_INTERFACE/defs.h
 create mode 100644 openair2/PHY_INTERFACE/phy_interface.h

diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 02841b5e9b..10cb9709ac 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -1049,45 +1049,22 @@ set(PHY_TURBOIF
 )
 
 add_library(coding MODULE ${PHY_TURBOSRC} )
-set(PHY_SRC
+set(PHY_SRC_COMMON
   # depend on code generation from asn1c
   ${RRC_FULL_DIR}/asn1_constants.h
   # actual source
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pss.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots_mbsfn.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_coding.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_modulation.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/power_control.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_scrambling.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools_common.c
   ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pbch.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/edci.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pcfich.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch.c
   ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/group_hopping.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_demodulation.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_decoding.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/rar_tools.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if4_tools.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if5_tools.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich_common.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pcfich_common.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch_common.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/power_control.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach_common.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch_common.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_scrambling.c
   ${OPENAIR1_DIR}/PHY/MODULATION/ofdm_mod.c
-  ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c
-  ${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c
-  ${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c
-  ${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c
-  ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c
   ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_time.c
-  ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync.c
-  ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
-  ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_est_freq_offset.c
-  ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_eNB_measurements.c
   ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_cell_spec.c
   ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_uespec.c
   ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_gold.c
@@ -1097,12 +1074,12 @@ set(PHY_SRC
   ${OPENAIR1_DIR}/PHY/CODING/lte_segmentation.c
   ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c
   ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c
+  ${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c
   ${OPENAIR1_DIR}/PHY/CODING/crc_byte.c
   ${PHY_TURBOIF}
   ${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c
+  ${OPENAIR1_DIR}/PHY/CODING/viterbi.c
   ${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c
-  ${OPENAIR1_DIR}/PHY/INIT/lte_init.c
-  ${OPENAIR1_DIR}/PHY/INIT/lte_init_ru.c
   ${OPENAIR1_DIR}/PHY/INIT/init_top.c
   ${OPENAIR1_DIR}/PHY/INIT/lte_parms.c
   ${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c
@@ -1120,19 +1097,49 @@ set(PHY_SRC
   ${OPENAIR1_DIR}/PHY/TOOLS/lut.c
   )
 
+set(PHY_SRC
+  # actual source
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pss.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots_mbsfn.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_coding.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_modulation.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pbch.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/edci.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pcfich.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_demodulation.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_decoding.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/rar_tools.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if4_tools.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if5_tools.c
+  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/uci_tools.c
+  ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c
+  ${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c
+  ${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c
+  ${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c
+  ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c
+  ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c
+  ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
+  ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_eNB_measurements.c
+  ${OPENAIR1_DIR}/PHY/INIT/lte_init.c
+  ${OPENAIR1_DIR}/PHY/INIT/lte_init_ru.c
+  )
+
 set(PHY_SRC_UE
-  # depend on code generation from asn1c
-  ${RRC_FULL_DIR}/asn1_constants.h
   # actual source
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/sss_ue.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c
-  ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/power_control_ue.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_decoding.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_scrambling.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/uci_tools_ue.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/pbch_ue.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dci_ue.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/phich_ue.c
@@ -1141,20 +1148,15 @@ set(PHY_SRC_UE
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/prach_ue.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/pmch_ue.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/pch_ue.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/group_hopping.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/srs_modulation.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/drs_modulation.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/ulsch_coding.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/rar_tools.c
+  ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/rar_tools_ue.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/initial_sync.c
-  ${OPENAIR1_DIR}/PHY/MODULATION/ofdm_mod.c
   ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep.c
   ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_mbsfn.c
-  ${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c
-  ${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c
-  ${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c
-  ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c
+  ${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz_ue.c
   ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_time.c
   ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_timefreq.c
   ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync.c
@@ -1164,38 +1166,7 @@ set(PHY_SRC_UE
   ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_est_freq_offset.c
   ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ue_measurements.c
   ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/adjust_gain.c
-  ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_cell_spec.c
-  ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_uespec.c
-  ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_gold.c
-  ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_gold_mbsfn.c
-  ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_mbsfn.c
-  ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_ul_ref.c
-  ${OPENAIR1_DIR}/PHY/CODING/lte_segmentation.c
-  ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c
-  ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c
-  ${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c
-  ${OPENAIR1_DIR}/PHY/CODING/crc_byte.c
-  ${PHY_TURBOIF}
-  ${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c
-  ${OPENAIR1_DIR}/PHY/CODING/viterbi.c
-  ${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c
-  ${OPENAIR1_DIR}/PHY/INIT/lte_init_ru.c
   ${OPENAIR1_DIR}/PHY/INIT/lte_init_ue.c
-  ${OPENAIR1_DIR}/PHY/INIT/init_top.c
-  ${OPENAIR1_DIR}/PHY/INIT/lte_parms.c
-  ${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/cmult_sv.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/cmult_vv.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/cdot_prod.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/lut.c
   )
 
 if (${SMBV})
@@ -1206,6 +1177,7 @@ if (${COMPILATION_AVX2} STREQUAL "True")
   set(PHY_SRC_UE ${PHY_SRC_UE} ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c)
 endif ()
 
+add_library(PHY_COMMON ${PHY_SRC_COMMON})
 add_library(PHY ${PHY_SRC})
 add_library(PHY_UE ${PHY_SRC_UE})
 
@@ -1731,8 +1703,8 @@ ${OPENAIR1_DIR}/SIMULATION/TOOLS/random_channel.c
 ${OPENAIR1_DIR}/SIMULATION/TOOLS/rangen_double.c
 ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
 ${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_channel.c
-${OPENAIR1_DIR}/SIMULATION/TOOLS/abstraction.c
 ${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_tv_channel.c
+${OPENAIR1_DIR}/SIMULATION/TOOLS/abstraction.c
 ${OPENAIR1_DIR}/SIMULATION/RF/rf.c
 ${OPENAIR1_DIR}/SIMULATION/RF/dac.c
 ${OPENAIR1_DIR}/SIMULATION/RF/adc.c
@@ -1912,7 +1884,7 @@ add_definitions(-DASN1_MINIMUM_VERSION=924)
 add_executable(lte-softmodem
   ${rrc_h}
   ${s1ap_h}
-  ${OPENAIR_BIN_DIR}/messages_xml.h
+#  ${OPENAIR_BIN_DIR}/messages_xml.h
   ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
   ${OPENAIR_TARGETS}/RT/USER/lte-enb.c
   ${OPENAIR_TARGETS}/RT/USER/lte-ru.c
@@ -1936,7 +1908,7 @@ add_executable(lte-softmodem
 
 target_link_libraries (lte-softmodem
   -Wl,--start-group
-  RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 
+  RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY_COMMON PHY LFDS L2 
   ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
   NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
   -Wl,--end-group z dl)
@@ -1951,7 +1923,7 @@ target_link_libraries (lte-softmodem ${T_LIB})
 add_executable(lte-softmodem-nos1
   ${rrc_h}
   ${s1ap_h}
-  ${OPENAIR_BIN_DIR}/messages_xml.h
+#  ${OPENAIR_BIN_DIR}/messages_xml.h
   ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
   ${OPENAIR_TARGETS}/RT/USER/lte-enb.c
   ${OPENAIR_TARGETS}/RT/USER/lte-ru.c
@@ -1973,7 +1945,7 @@ add_executable(lte-softmodem-nos1
   )
 target_link_libraries (lte-softmodem-nos1
   -Wl,--start-group
-  RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} 
+  RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB PHY_COMMON PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} 
   ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
   NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
   -Wl,--end-group z dl )
@@ -1989,7 +1961,7 @@ target_link_libraries (lte-softmodem-nos1 ${T_LIB})
 add_executable(lte-uesoftmodem
   ${rrc_h}
   ${s1ap_h}
-  ${OPENAIR_BIN_DIR}/messages_xml.h
+#  ${OPENAIR_BIN_DIR}/messages_xml.h
   ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
   ${OPENAIR_TARGETS}/RT/USER/lte-ue.c
   ${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
@@ -2010,7 +1982,7 @@ add_executable(lte-uesoftmodem
 
 target_link_libraries (lte-uesoftmodem
   -Wl,--start-group
-  RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_UE_LIB PHY_UE LFDS L2_UE 
+  RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_UE_LIB PHY_COMMON PHY_UE LFDS L2_UE 
   ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7
   -Wl,--end-group z dl)
 
@@ -2024,7 +1996,7 @@ target_link_libraries (lte-uesoftmodem ${T_LIB})
 add_executable(lte-uesoftmodem-nos1
   ${rrc_h}
   ${s1ap_h}
-  ${OPENAIR_BIN_DIR}/messages_xml.h
+#  ${OPENAIR_BIN_DIR}/messages_xml.h
   ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
   ${OPENAIR_TARGETS}/RT/USER/lte-ue.c
   ${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
@@ -2044,7 +2016,7 @@ add_executable(lte-uesoftmodem-nos1
   )
 target_link_libraries (lte-uesoftmodem-nos1
   -Wl,--start-group
-  RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_UE_LIB PHY_UE LFDS L2_UE ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} 
+  RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_UE_LIB PHY_COMMON PHY_UE LFDS L2_UE ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} 
   ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7
   -Wl,--end-group z dl )
 
@@ -2086,7 +2058,7 @@ add_executable(oaisim
   ${rrc_h}
   ${s1ap_h}
   ${x2ap_h}
-  ${OPENAIR_BIN_DIR}/messages_xml.h
+#  ${OPENAIR_BIN_DIR}/messages_xml.h
   ${OPENAIR_TARGETS}/RT/USER/lte-ue.c
   ${OPENAIR_TARGETS}/RT/USER/lte-ru.c
   ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
@@ -2115,7 +2087,7 @@ add_executable(oaisim
 target_include_directories(oaisim PUBLIC  ${OPENAIR_TARGETS}/SIMU/USER)
 target_link_libraries (oaisim
   -Wl,-ldl,--start-group
-  RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_UE_LIB PHY_UE LFDS L2_UE ${MSC_LIB} LIB_NAS_UE SIMU SECU_OSA ${ITTI_LIB}  ${MIH_LIB}
+  RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_UE_LIB PHY_COMMON PHY_UE LFDS L2_UE ${MSC_LIB} LIB_NAS_UE SIMU SECU_OSA ${ITTI_LIB}  ${MIH_LIB}
   ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
   -Wl,--end-group z dl)
 
@@ -2133,7 +2105,7 @@ add_executable(oaisim_nos1
   ${rrc_h}
   ${s1ap_h}
   ${x2ap_h}
-  ${OPENAIR_BIN_DIR}/messages_xml.h
+#  ${OPENAIR_BIN_DIR}/messages_xml.h
   ${OPENAIR_TARGETS}/RT/USER/lte-ue.c
   ${OPENAIR_TARGETS}/RT/USER/lte-ru.c
   ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
@@ -2158,7 +2130,7 @@ add_executable(oaisim_nos1
 target_include_directories(oaisim_nos1 PUBLIC  ${OPENAIR_TARGETS}/SIMU/USER)
 target_link_libraries (oaisim_nos1
   -Wl,--start-group
-  RRC_LIB X2AP_LIB SECU_CN UTIL HASHTABLE SCHED_UE_LIB PHY_UE LFDS ${MSC_LIB} ${ITTI_LIB} SIMU L2_UE ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7
+  RRC_LIB X2AP_LIB SECU_CN UTIL HASHTABLE SCHED_UE_LIB PHY_COMMON PHY_UE LFDS ${MSC_LIB} ${ITTI_LIB} SIMU L2_UE ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7
   -Wl,--end-group z dl )
 
 target_link_libraries (oaisim_nos1 ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES})
@@ -2177,7 +2149,7 @@ target_link_libraries (oaisim_nos1 ${T_LIB})
 
 #special case for dlim TM4, which uses its own version of phy_scope code
 add_executable(dlsim_tm4
-  ${OPENAIR_BIN_DIR}/messages_xml.h
+#  ${OPENAIR_BIN_DIR}/messages_xml.h
   ${OPENAIR1_DIR}/SIMULATION/LTE_PHY/dlsim_tm4.c
   ${OPENAIR1_DIR}/PHY/TOOLS/lte_phy_scope_tm4.c
   ${T_SOURCE}
@@ -2190,7 +2162,7 @@ target_link_libraries (dlsim_tm4
 foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim)
 
   add_executable(${myExe}
-    ${OPENAIR_BIN_DIR}/messages_xml.h
+#    ${OPENAIR_BIN_DIR}/messages_xml.h
     ${OPENAIR1_DIR}/SIMULATION/LTE_PHY/${myExe}.c
     ${XFORMS_SOURCE}
     ${T_SOURCE}
@@ -2199,7 +2171,7 @@ foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim pr
     )
   target_link_libraries (${myExe}
 
-    -Wl,--start-group SIMU UTIL SCHED_LIB SCHED_UE_LIB PHY LFDS ${ITTI_LIB} LFDS7 -Wl,--end-group
+    -Wl,--start-group SIMU UTIL SCHED_LIB SCHED_UE_LIB PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} LFDS7 -Wl,--end-group
     pthread m rt ${CONFIG_LIBRARIES} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB} dl
     )
 endforeach(myExe)
@@ -2212,7 +2184,7 @@ add_executable(test_epc_generate_scenario
   ${OPENAIR2_DIR}/COMMON/messages_def.h
   ${OPENAIR2_DIR}/COMMON/messages_types.h
   ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h
-  ${OPENAIR_BIN_DIR}/messages_xml.h
+#  ${OPENAIR_BIN_DIR}/messages_xml.h
   )
 target_link_libraries (test_epc_generate_scenario
   -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
@@ -2236,7 +2208,7 @@ add_executable(test_epc_play_scenario
   )
 target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c)
 target_link_libraries (test_epc_play_scenario
-  -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
+  -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
   )
 
 
diff --git a/common/utils/load_module_shlib.c b/common/utils/load_module_shlib.c
index fecdc2a58c..656f6a8852 100644
--- a/common/utils/load_module_shlib.c
+++ b/common/utils/load_module_shlib.c
@@ -37,7 +37,7 @@
 #include <errno.h>
 #include <sys/ioctl.h>
 #include <dlfcn.h>
-#include "openair1/PHY/defs.h"
+#include "openair1/PHY/defs_common.h"
 #define LOAD_MODULE_SHLIB_MAIN
 
 #include "common/config/config_userapi.h"
diff --git a/openair1/PHY/CODING/3gpplte.c b/openair1/PHY/CODING/3gpplte.c
index 61acdb2ad9..ae476a118f 100644
--- a/openair1/PHY/CODING/3gpplte.c
+++ b/openair1/PHY/CODING/3gpplte.c
@@ -29,7 +29,7 @@
 #endif
 #include <stdint.h>
 #include <stdio.h>
-#include "PHY/CODING/defs.h"
+#include "PHY/CODING/coding_defs.h"
 #include "extern_3GPPinterleaver.h"
 
 //#define DEBUG_TURBO_ENCODER 1
diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c
index 8150f02da8..e2eb7eb52a 100644
--- a/openair1/PHY/CODING/3gpplte_sse.c
+++ b/openair1/PHY/CODING/3gpplte_sse.c
@@ -26,10 +26,10 @@
    date: 09.2012
 */
 #ifndef TC_MAIN
-#include "defs.h"
+#include "coding_defs.h"
 #include "extern_3GPPinterleaver.h"
 #else
-#include "vars.h"
+#include "coding_vars.h"
 #include <stdint.h>
 #endif
 #include <stdio.h>
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder.c b/openair1/PHY/CODING/3gpplte_turbo_decoder.c
index c0e4ca12db..572127a5e0 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder.c
@@ -27,8 +27,8 @@
 
 */
 
-#include "PHY/defs.h"
-#include "PHY/CODING/defs.h"
+#include "PHY/defs_common.h"
+#include "PHY/CODING/coding_defs.h"
 #include "PHY/CODING/lte_interleaver_inline.h"
 #include "PHY/sse_intrin.h"
 
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
index ef0ca48df4..9c8e3eff3a 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
@@ -42,8 +42,8 @@
 
 
 #ifndef TEST_DEBUG
-#include "PHY/defs.h"
-#include "PHY/CODING/defs.h"
+#include "PHY/defs_common.h"
+#include "PHY/CODING/coding_defs.h"
 #include "PHY/CODING/lte_interleaver_inline.h"
 #include "extern_3GPPinterleaver.h"
 #else
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
index ae3ce531d0..1b2d565b22 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
@@ -41,8 +41,8 @@
 #include "PHY/sse_intrin.h"
 
 #ifndef TEST_DEBUG
-#include "PHY/defs.h"
-#include "PHY/CODING/defs.h"
+#include "PHY/defs_common.h"
+#include "PHY/CODING/coding_defs.h"
 #include "PHY/CODING/lte_interleaver_inline.h"
 #include "extern_3GPPinterleaver.h"
 #else
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
index 5b7174e989..f22ec21ff0 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
@@ -39,8 +39,8 @@
 #include "PHY/sse_intrin.h"
 
 #ifndef TEST_DEBUG
-#include "PHY/defs.h"
-#include "PHY/CODING/defs.h"
+#include "PHY/defs_common.h"
+#include "PHY/CODING/coding_defs.h"
 #include "PHY/CODING/lte_interleaver_inline.h"
 #include "extern_3GPPinterleaver.h"
 #else
diff --git a/openair1/PHY/CODING/ccoding_byte.c b/openair1/PHY/CODING/ccoding_byte.c
index 8511a5ea0f..db91e68dc8 100644
--- a/openair1/PHY/CODING/ccoding_byte.c
+++ b/openair1/PHY/CODING/ccoding_byte.c
@@ -24,7 +24,7 @@
    author: raymond.knopp@eurecom.fr, based on similar code for 3GPP convolutional code (UMTS) by P. Humblet (2000)
    date: 10.2004
 */
-#include "defs.h"
+#include "coding_defs.h"
 
 
 unsigned short gdot11[] = { 0133, 0171 }; // {A,B}
diff --git a/openair1/PHY/CODING/ccoding_byte_lte.c b/openair1/PHY/CODING/ccoding_byte_lte.c
index 6eb654827b..870e9ba470 100644
--- a/openair1/PHY/CODING/ccoding_byte_lte.c
+++ b/openair1/PHY/CODING/ccoding_byte_lte.c
@@ -24,7 +24,7 @@
    author: raymond.knopp@eurecom.fr
    date: 21.10.2009
 */
-#include "defs.h"
+#include "coding_defs.h"
 
 //#define DEBUG_CCODE 1
 
diff --git a/openair1/PHY/CODING/coding_load.c b/openair1/PHY/CODING/coding_load.c
index 31f71e6b31..76ab04f220 100644
--- a/openair1/PHY/CODING/coding_load.c
+++ b/openair1/PHY/CODING/coding_load.c
@@ -33,8 +33,8 @@
 #include <sys/types.h>
 
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_common.h"
+#include "PHY/phy_extern.h"
 #include "common/utils/load_module_shlib.h" 
 #include "common/utils/telnetsrv/telnetsrv.h" 
 
diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c
index 21427de19b..0e1f0e065f 100644
--- a/openair1/PHY/CODING/crc_byte.c
+++ b/openair1/PHY/CODING/crc_byte.c
@@ -31,7 +31,7 @@
 */
 
 
-#include "defs.h"
+#include "coding_defs.h"
 
 
 /*ref 36-212 v8.6.0 , pp 8-9 */
diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c
index 41c3c5e5a9..c7af202ced 100644
--- a/openair1/PHY/CODING/lte_rate_matching.c
+++ b/openair1/PHY/CODING/lte_rate_matching.c
@@ -28,7 +28,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #endif
-#include "PHY/defs.h"
+#include "PHY/defs_common.h"
+#include "PHY/LTE_TRANSPORT/transport_common.h"
 #include "assertions.h"
 
 //#define cmin(a,b) ((a)<(b) ? (a) : (b))
diff --git a/openair1/PHY/CODING/lte_segmentation.c b/openair1/PHY/CODING/lte_segmentation.c
index 3ae65e2090..2d662a63f2 100644
--- a/openair1/PHY/CODING/lte_segmentation.c
+++ b/openair1/PHY/CODING/lte_segmentation.c
@@ -24,8 +24,9 @@
    author: raymond.knopp@eurecom.fr
    date: 21.10.2009
 */
-#include "PHY/defs.h"
-#include "SCHED/extern.h"
+#include "PHY/defs_common.h"
+#include "PHY/LTE_TRANSPORT/transport_common.h"
+#include "PHY/CODING/coding_defs.h"
 
 //#define DEBUG_SEGMENTATION
 
diff --git a/openair1/PHY/CODING/viterbi_lte.c b/openair1/PHY/CODING/viterbi_lte.c
index 5e11cb3453..553192a4a8 100644
--- a/openair1/PHY/CODING/viterbi_lte.c
+++ b/openair1/PHY/CODING/viterbi_lte.c
@@ -29,8 +29,8 @@
 */
 
 #ifndef TEST_DEBUG
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_common.h"
+#include "PHY/phy_extern.h"
 #else
 #include <stdio.h>
 #include <stdlib.h>
diff --git a/openair1/PHY/INIT/extern.h b/openair1/PHY/INIT/init_extern.h
similarity index 100%
rename from openair1/PHY/INIT/extern.h
rename to openair1/PHY/INIT/init_extern.h
diff --git a/openair1/PHY/INIT/init_top.c b/openair1/PHY/INIT/init_top.c
index 6213520b8c..94f2ebfe9d 100644
--- a/openair1/PHY/INIT/init_top.c
+++ b/openair1/PHY/INIT/init_top.c
@@ -20,9 +20,9 @@
  */
 
 /*!\brief Initilization and reconfiguration routines for LTE PHY */
-#include "defs.h"
-#include "PHY/extern.h"
-#include "PHY/CODING/extern.h"
+#include "phy_init.h"
+#include "PHY/phy_extern.h"
+#include "PHY/CODING/coding_extern.h"
 void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms)
 {
 
diff --git a/openair1/PHY/INIT/vars.h b/openair1/PHY/INIT/init_vars.h
similarity index 100%
rename from openair1/PHY/INIT/vars.h
rename to openair1/PHY/INIT/init_vars.h
diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
index ff36b0a5e2..a7a0662a50 100644
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -19,14 +19,15 @@
  *      contact@openairinterface.org
  */
 
-#include "defs.h"
-#include "SCHED/defs.h"
-#include "PHY/extern.h"
-#include "SIMULATION/TOOLS/defs.h"
+#include "phy_init.h"
+#include "SCHED/sched_eNB.h"
+#include "PHY/phy_extern.h"
+#include "PHY/LTE_TRANSPORT/transport_proto.h"
+#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
+#include "SIMULATION/TOOLS/sim.h"
 #include "RadioResourceConfigCommonSIB.h"
 #include "RadioResourceConfigDedicated.h"
 #include "TDD-Config.h"
-#include "LAYER2/MAC/extern.h"
 #include "MBSFN-SubframeConfigList.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 #include "assertions.h"
@@ -721,23 +722,6 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id,
 
 
 
-void  phy_config_cba_rnti (module_id_t Mod_id,int CC_id,eNB_flag_t eNB_flag, uint8_t index, rnti_t cba_rnti, uint8_t cba_group_id, uint8_t num_active_cba_groups)
-{
-  //   uint8_t i;
-
-  if (eNB_flag == 0 ) {
-    //LOG_D(PHY,"[UE %d] configure cba group %d with rnti %x, num active cba grp %d\n", index, index, cba_rnti, num_active_cba_groups);
-    PHY_vars_UE_g[Mod_id][CC_id]->ulsch[index]->num_active_cba_groups=num_active_cba_groups;
-    PHY_vars_UE_g[Mod_id][CC_id]->ulsch[index]->cba_rnti[cba_group_id]=cba_rnti;
-  } else {
-    //for (i=index; i < NUMBER_OF_UE_MAX; i+=num_active_cba_groups){
-    //  LOG_D(PHY,"[eNB %d] configure cba group %d with rnti %x for UE %d, num active cba grp %d\n",Mod_id, i%num_active_cba_groups, cba_rnti, i, num_active_cba_groups);
-    RC.eNB[Mod_id][CC_id]->ulsch[index]->num_active_cba_groups=num_active_cba_groups;
-    RC.eNB[Mod_id][CC_id]->ulsch[index]->cba_rnti[cba_group_id] = cba_rnti;
-    //}
-  }
-}
-
 int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
                      unsigned char is_secondary_eNB,
                      unsigned char abstraction_flag)
diff --git a/openair1/PHY/INIT/lte_init_ru.c b/openair1/PHY/INIT/lte_init_ru.c
index 9168193074..8c270fe7ba 100644
--- a/openair1/PHY/INIT/lte_init_ru.c
+++ b/openair1/PHY/INIT/lte_init_ru.c
@@ -19,14 +19,13 @@
  *      contact@openairinterface.org
  */
 
-#include "defs.h"
-#include "SCHED/defs.h"
-#include "PHY/extern.h"
-#include "SIMULATION/TOOLS/defs.h"
+#include "phy_init.h"
+#include "SCHED/sched_eNB.h"
+#include "PHY/phy_extern.h"
+#include "SIMULATION/TOOLS/sim.h"
 #include "RadioResourceConfigCommonSIB.h"
 #include "RadioResourceConfigDedicated.h"
 #include "TDD-Config.h"
-#include "LAYER2/MAC/extern.h"
 #include "MBSFN-SubframeConfigList.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 #include "assertions.h"
diff --git a/openair1/PHY/INIT/lte_init_ue.c b/openair1/PHY/INIT/lte_init_ue.c
index 16274d6878..11260274db 100644
--- a/openair1/PHY/INIT/lte_init_ue.c
+++ b/openair1/PHY/INIT/lte_init_ue.c
@@ -19,19 +19,19 @@
  *      contact@openairinterface.org
  */
 
-#include "defs.h"
-#include "SCHED/defs.h"
-#include "PHY/extern.h"
-#include "SIMULATION/TOOLS/defs.h"
+#include "phy_init.h"
+#include "SCHED_UE/sched_UE.h"
+#include "PHY/phy_extern_ue.h"
+#include "SIMULATION/TOOLS/sim.h"
 #include "RadioResourceConfigCommonSIB.h"
 #include "RadioResourceConfigDedicated.h"
 #include "TDD-Config.h"
-#include "LAYER2/MAC/extern.h"
 #include "MBSFN-SubframeConfigList.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 #include "assertions.h"
 #include <math.h>
-
+#include "PHY/LTE_TRANSPORT/transport_common_proto.h"
+#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
 
 uint8_t dmrs1_tab_ue[8] = {0,2,3,4,6,8,9,10};
 
@@ -651,7 +651,7 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
   int th_id;
 
   LOG_D(PHY,"Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,fp->nb_antennas_tx,fp->nb_antennas_rx);
-  LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST);
+
 
 
 
diff --git a/openair1/PHY/INIT/lte_param_init.c b/openair1/PHY/INIT/lte_param_init.c
index 6cf05769e5..a10240490a 100644
--- a/openair1/PHY/INIT/lte_param_init.c
+++ b/openair1/PHY/INIT/lte_param_init.c
@@ -25,10 +25,11 @@
 #include <execinfo.h>
 #include <signal.h>
 
-#include "SIMULATION/TOOLS/defs.h"
+#include "SIMULATION/TOOLS/sim.h"
 #include "PHY/types.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern.h"
 
 extern PHY_VARS_eNB *eNB;
 extern PHY_VARS_UE *UE;
diff --git a/openair1/PHY/INIT/lte_parms.c b/openair1/PHY/INIT/lte_parms.c
index 2f2bd95617..e7c4ced5d3 100644
--- a/openair1/PHY/INIT/lte_parms.c
+++ b/openair1/PHY/INIT/lte_parms.c
@@ -19,7 +19,7 @@
  *      contact@openairinterface.org
  */
 
-#include "defs.h"
+#include "phy_init.h"
 #include "log.h"
 
 uint16_t dl_S_table_normal[10]={3,9,10,11,12,3,9,10,11,6};
diff --git a/openair1/PHY/INIT/defs.h b/openair1/PHY/INIT/phy_init.h
similarity index 99%
rename from openair1/PHY/INIT/defs.h
rename to openair1/PHY/INIT/phy_init.h
index be3e5c160b..652ae6a2d1 100644
--- a/openair1/PHY/INIT/defs.h
+++ b/openair1/PHY/INIT/phy_init.h
@@ -22,8 +22,8 @@
 #ifndef __INIT_DEFS__H__
 #define __INIT_DEFS__H__
 
-#include "PHY/defs.h"
-
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
 
 #include "SystemInformationBlockType2.h"
 //#include "RadioResourceConfigCommonSIB.h"
diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c
index 7272b7247d..27e6c10686 100644
--- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c
+++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c
@@ -20,8 +20,8 @@
  */
 
 #include "PHY/types.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 
 void
 phy_adjust_gain (PHY_VARS_UE *ue, uint32_t rx_power_fil_dB, uint8_t eNB_id)
diff --git a/openair1/PHY/LTE_ESTIMATION/freq_equalization.c b/openair1/PHY/LTE_ESTIMATION/freq_equalization.c
index 2c318d85e4..3fd58a4989 100644
--- a/openair1/PHY/LTE_ESTIMATION/freq_equalization.c
+++ b/openair1/PHY/LTE_ESTIMATION/freq_equalization.c
@@ -19,8 +19,8 @@
  *      contact@openairinterface.org
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
 #include "PHY/sse_intrin.h"
 
 // This is 512/(1:256) in __m128i format
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
index 18444076f3..dc43334b5a 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
@@ -20,10 +20,11 @@
  */
 
 #include "PHY/types.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 
 #include "UTIL/LOG/vcd_signal_dumper.h"
+#include "lte_estimation_defs.h"
 
 #define DEBUG_PHY
 
@@ -136,126 +137,3 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
 }
 
 
-int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
-                           LTE_eNB_SRS *lte_eNB_srs,
-                           unsigned int  *eNB_id,
-                           unsigned char clear,
-                           unsigned char number_of_cards,
-                           short coef)
-
-{
-
-  static int max_pos_fil2 = 0;
-  int temp, i, aa, max_pos = 0,ind;
-  int max_val=0;
-  short Re,Im,ncoef;
-#ifdef DEBUG_PHY
-  char fname[100],vname[100];
-#endif
-
-  ncoef = 32768 - coef;
-
-  for (ind=0; ind<number_of_cards; ind++) {
-
-    if (ind==0)
-      max_val=0;
-
-
-    for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
-      // do ifft of channel estimate
-      switch(frame_parms->N_RB_DL) {
-      case 6:
-	dft128((int16_t*) &lte_eNB_srs->srs_ch_estimates[aa][0],
-	       (int16_t*) lte_eNB_srs->srs_ch_estimates_time[aa],
-	       1);
-	break;
-      case 25:
-	dft512((int16_t*) &lte_eNB_srs->srs_ch_estimates[aa][0],
-	       (int16_t*) lte_eNB_srs->srs_ch_estimates_time[aa],
-	       1);
-	break;
-      case 50:
-	dft1024((int16_t*) &lte_eNB_srs->srs_ch_estimates[aa][0],
-		(int16_t*) lte_eNB_srs->srs_ch_estimates_time[aa],
-		1);
-	break;
-      case 100:
-	dft2048((int16_t*) &lte_eNB_srs->srs_ch_estimates[aa][0],
-	       (int16_t*) lte_eNB_srs->srs_ch_estimates_time[aa],
-	       1);
-	break;
-      }
-#ifdef DEBUG_PHY
-      sprintf(fname,"srs_ch_estimates_time_%d%d.m",ind,aa);
-      sprintf(vname,"srs_time_%d%d",ind,aa);
-      write_output(fname,vname,lte_eNB_srs->srs_ch_estimates_time[aa],frame_parms->ofdm_symbol_size*2,2,1);
-#endif
-    }
-
-    // we only use channel estimates from tx antenna 0 here
-    // remember we fixed the SRS to use only every second subcarriers
-    for (i = 0; i < frame_parms->ofdm_symbol_size/2; i++) {
-      temp = 0;
-
-      for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
-        Re = ((int16_t*)lte_eNB_srs->srs_ch_estimates_time[aa])[(i<<1)];
-        Im = ((int16_t*)lte_eNB_srs->srs_ch_estimates_time[aa])[1+(i<<1)];
-        temp += (Re*Re/2) + (Im*Im/2);
-      }
-
-      if (temp > max_val) {
-        max_pos = i;
-        max_val = temp;
-        *eNB_id = ind;
-      }
-    }
-  }
-
-  // filter position to reduce jitter
-  if (clear == 1)
-    max_pos_fil2 = max_pos;
-  else
-    max_pos_fil2 = ((max_pos_fil2 * coef) + (max_pos * ncoef)) >> 15;
-
-  return(max_pos_fil2);
-}
-
-
-int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id)
-{
-  int temp, i, aa, max_pos=0, max_val=0;
-  short Re,Im;
-
-  LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
-  LTE_eNB_PUSCH *eNB_pusch_vars = eNB->pusch_vars[UE_id];
-  int32_t **ul_ch_estimates_time=  eNB_pusch_vars->drs_ch_estimates_time;
-  uint8_t cyclic_shift = 0;
-  int sync_pos = (frame_parms->ofdm_symbol_size-cyclic_shift*frame_parms->ofdm_symbol_size/12)%(frame_parms->ofdm_symbol_size);
-
-  AssertFatal(frame_parms->ofdm_symbol_size > 127,"frame_parms->ofdm_symbol_size %d<128\n",frame_parms->ofdm_symbol_size);
-  AssertFatal(frame_parms->nb_antennas_rx >0 && frame_parms->nb_antennas_rx<3,"frame_parms->nb_antennas_rx %d not in [0,1]\n",
-	      frame_parms->nb_antennas_rx);
-  for (i = 0; i < frame_parms->ofdm_symbol_size; i++) {
-    temp = 0;
-
-    for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
-      Re = ((int16_t*)ul_ch_estimates_time[aa])[(i<<1)];
-      Im = ((int16_t*)ul_ch_estimates_time[aa])[1+(i<<1)];
-      temp += (Re*Re/2) + (Im*Im/2);
-    }
-
-    if (temp > max_val) {
-      max_pos = i;
-      max_val = temp;
-    }
-  }
-
-  if (max_pos>frame_parms->ofdm_symbol_size/2)
-    max_pos = max_pos-frame_parms->ofdm_symbol_size;
-
-  //#ifdef DEBUG_PHY
-  LOG_D(PHY,"frame %d: max_pos = %d, sync_pos=%d\n",eNB->proc.frame_rx,max_pos,sync_pos);
-  //#endif //DEBUG_PHY
-
-  return max_pos - sync_pos;
-}
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
index 55d2cf6c5c..fe3084cdb2 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c
@@ -20,8 +20,7 @@
  */
 
 #include <string.h>
-#include "defs.h"
-#include "PHY/defs.h"
+#include "PHY/defs_UE.h"
 #include "filt16_32.h"
 //#define DEBUG_BF_CH
 
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
index a4b29bb25e..15dbcd6ed7 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
@@ -20,9 +20,7 @@
  */
 
 #include <string.h>
-#include "defs.h"
-#include "SCHED/defs.h"
-#include "PHY/defs.h"
+#include "PHY/defs_UE.h"
 #include "filt96_32.h"
 #include "T.h"
 //#define DEBUG_CH
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c
index 17d44b22f8..585ed871fa 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c
@@ -20,8 +20,7 @@
  */
 
 #include <string.h>
-#include "defs.h"
-#include "PHY/defs.h"
+#include "PHY/defs_UE.h"
 
 //#define DEBUG_CH
 int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *ue,
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c
index 42409cbaae..b416ff9e79 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c
@@ -19,8 +19,8 @@
  *      contact@openairinterface.org
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
 
 #include "PHY/sse_intrin.h"
 
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c b/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c
index cce1e06df4..ed82aeb09e 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c
@@ -25,7 +25,7 @@
    date: 19.11.2009
 */
 
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
 //#define DEBUG_PHY
 
 #if defined(__x86_64__) || defined(__i386__)
diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/lte_estimation_defs.h
similarity index 99%
rename from openair1/PHY/LTE_ESTIMATION/defs.h
rename to openair1/PHY/LTE_ESTIMATION/lte_estimation_defs.h
index a7b5d14701..4512fc0d9b 100644
--- a/openair1/PHY/LTE_ESTIMATION/defs.h
+++ b/openair1/PHY/LTE_ESTIMATION/lte_estimation_defs.h
@@ -22,7 +22,9 @@
 #ifndef __LTE_ESTIMATION_DEFS__H__
 #define __LTE_ESTIMATION_DEFS__H__
 
-#include "PHY/defs.h"
+
+#include "PHY/defs_UE.h"
+#include "PHY/defs_eNB.h"
 /** @addtogroup _PHY_PARAMETER_ESTIMATION_BLOCKS_
  * @{
  */
diff --git a/openair1/PHY/LTE_ESTIMATION/extern.h b/openair1/PHY/LTE_ESTIMATION/lte_estimation_extern.h
similarity index 100%
rename from openair1/PHY/LTE_ESTIMATION/extern.h
rename to openair1/PHY/LTE_ESTIMATION/lte_estimation_extern.h
diff --git a/openair1/PHY/LTE_ESTIMATION/vars.h b/openair1/PHY/LTE_ESTIMATION/lte_estimation_vars.h
similarity index 100%
rename from openair1/PHY/LTE_ESTIMATION/vars.h
rename to openair1/PHY/LTE_ESTIMATION/lte_estimation_vars.h
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c
index 21e33cf1c0..587dbed6c5 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c
@@ -26,19 +26,15 @@
 */
 
 //#include <string.h>
-#include "defs.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 #include <math.h>
 
-#ifdef OPENAIR2
-#include "LAYER2/MAC/defs.h"
-#include "LAYER2/MAC/extern.h"
-#include "RRC/LITE/extern.h"
-#include "PHY_INTERFACE/extern.h"
-#endif
-//#define DEBUG_PHY
+
+#include "LAYER2/MAC/mac.h"
+#include "RRC/LTE/rrc_extern.h"
+#include "PHY_INTERFACE/phy_interface.h"
+
 
 int* sync_corr_ue0 = NULL;
 int* sync_corr_ue1 = NULL;
@@ -487,8 +483,6 @@ int lte_sync_time(int **rxdata, ///rx data in time domain
 
 }
 
-//#define DEBUG_PHY
-
 int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
                       LTE_DL_FRAME_PARMS *frame_parms,
                       uint32_t length,
@@ -578,3 +572,6 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain
 
 }
 
+
+
+
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c
index d428f8e6e6..fd7b8d601a 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c
@@ -36,8 +36,8 @@
 */
 
 //#include "defs.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 
 #if defined(__x86_64__) || defined(__i386__)
 #include "pss6144.h"
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
index ce6cd86959..199fc2d846 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
@@ -21,10 +21,8 @@
 
 // this function fills the PHY_vars->PHY_measurement structure
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "SCHED/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 #include "log.h"
 #include "PHY/sse_intrin.h"
 
@@ -454,397 +452,339 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
 
 }
 
-void lte_ue_measurements(PHY_VARS_UE *ue,
-                         unsigned int subframe_offset,
-                         unsigned char N0_symbol,
-                         unsigned char abstraction_flag,
-                         unsigned char rank_adaptation,
-                         uint8_t subframe)
+void conjch0_mult_ch1(int *ch0,
+                      int *ch1,
+                      int32_t *ch0conj_ch1,
+                      unsigned short nb_rb,
+                      unsigned char output_shift0)
 {
+  //This function is used to compute multiplications in Hhermitian * H matrix
+  unsigned short rb;
+  __m128i *dl_ch0_128,*dl_ch1_128, *ch0conj_ch1_128, mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3;
 
+  dl_ch0_128 = (__m128i *)ch0;
+  dl_ch1_128 = (__m128i *)ch1;
 
-  int aarx,aatx,eNB_id=0; //,gain_offset=0;
-  //int rx_power[NUMBER_OF_CONNECTED_eNB_MAX];
-  int i;
-  unsigned int limit,subband;
-#if defined(__x86_64__) || defined(__i386__)
-  __m128i *dl_ch0_128,*dl_ch1_128;
-#elif defined(__arm__)
-  int16x8_t *dl_ch0_128, *dl_ch1_128;
-#endif
-  int *dl_ch0,*dl_ch1;
-
-  LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
-  int nb_subbands,subband_size,last_subband_size;
-  int N_RB_DL = frame_parms->N_RB_DL;
+  ch0conj_ch1_128 = (__m128i *)ch0conj_ch1;
 
+  for (rb=0; rb<3*nb_rb; rb++) {
 
-  int rank_tm3_tm4;
+    mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch1_128[0]);
+    mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1));
+    mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+    mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
+    mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch1_128[0]);
+    mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0);
+    mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0);
+    mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+    mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
 
+    ch0conj_ch1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
 
-  ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
+#ifdef DEBUG_RANK_EST
+    printf("\n Computing conjugates \n");
+    print_shorts("ch0:",(int16_t*)&dl_ch0_128[0]);
+    print_shorts("ch1:",(int16_t*)&dl_ch1_128[0]);
+    print_shorts("pack:",(int16_t*)&ch0conj_ch1_128[0]);
+#endif
 
+    dl_ch0_128+=1;
+    dl_ch1_128+=1;
+    ch0conj_ch1_128+=1;
+  }
+  _mm_empty();
+  _m_empty();
+}
 
-  switch (N_RB_DL) {
-  case 6:
-    nb_subbands = 6;
-    subband_size = 12;
-    last_subband_size = 0;
-    break;
+void construct_HhH_elements(int *ch0conj_ch0, //00_00
+                            int *ch1conj_ch1,//01_01
+                            int *ch2conj_ch2,//11_11
+                            int *ch3conj_ch3,//10_10
+                            int *ch0conj_ch1,//00_01
+                            int *ch1conj_ch0,//01_00
+                            int *ch2conj_ch3,//10_11
+                            int *ch3conj_ch2,//11_10
+                            int32_t *after_mf_00,
+                            int32_t *after_mf_01,
+                            int32_t *after_mf_10,
+                            int32_t *after_mf_11,
+                            unsigned short nb_rb)
+{
+  unsigned short rb;
+  __m128i *ch0conj_ch0_128, *ch1conj_ch1_128, *ch2conj_ch2_128, *ch3conj_ch3_128;
+  __m128i *ch0conj_ch1_128, *ch1conj_ch0_128, *ch2conj_ch3_128, *ch3conj_ch2_128;
+  __m128i *after_mf_00_128, *after_mf_01_128, *after_mf_10_128, *after_mf_11_128;
 
-  default:
-  case 25:
-    nb_subbands = 7;
-    subband_size = 4*12;
-    last_subband_size = 12;
-    break;
+  ch0conj_ch0_128 = (__m128i *)ch0conj_ch0;
+  ch1conj_ch1_128 = (__m128i *)ch1conj_ch1;
+  ch2conj_ch2_128 = (__m128i *)ch2conj_ch2;
+  ch3conj_ch3_128 = (__m128i *)ch3conj_ch3;
+  ch0conj_ch1_128 = (__m128i *)ch0conj_ch1;
+  ch1conj_ch0_128 = (__m128i *)ch1conj_ch0;
+  ch2conj_ch3_128 = (__m128i *)ch2conj_ch3;
+  ch3conj_ch2_128 = (__m128i *)ch3conj_ch2;
+  after_mf_00_128 = (__m128i *)after_mf_00;
+  after_mf_01_128 = (__m128i *)after_mf_01;
+  after_mf_10_128 = (__m128i *)after_mf_10;
+  after_mf_11_128 = (__m128i *)after_mf_11;
 
-  case 50:
-    nb_subbands = 9;
-    subband_size = 6*12;
-    last_subband_size = 2*12;
-    break;
+  for (rb=0; rb<3*nb_rb; rb++) {
 
-  case 100:
-    nb_subbands = 13;
-    subband_size = 8*12;
-    last_subband_size = 4*12;
-    break;
-  }
+    after_mf_00_128[0] =_mm_adds_epi16(ch0conj_ch0_128[0],ch3conj_ch3_128[0]);// _mm_adds_epi32(ch0conj_ch0_128[0], ch3conj_ch3_128[0]); //00_00 + 10_10
+    after_mf_11_128[0] =_mm_adds_epi16(ch1conj_ch1_128[0], ch2conj_ch2_128[0]); //01_01 + 11_11
+    after_mf_01_128[0] =_mm_adds_epi16(ch0conj_ch1_128[0], ch2conj_ch3_128[0]);//00_01 + 10_11
+    after_mf_10_128[0] =_mm_adds_epi16(ch1conj_ch0_128[0], ch3conj_ch2_128[0]);//01_00 + 11_10
 
-  // signal measurements
-  for (eNB_id=0; eNB_id<ue->n_connected_eNB; eNB_id++) {
-    for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
-      for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) {
-        ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
-          (signal_energy_nodc(&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0],
-                              (N_RB_DL*12)));
-        //- ue->measurements.n0_power[aarx];
+#ifdef DEBUG_RANK_EST
+    printf(" \n construct_HhH_elements \n");
+    print_shorts("ch0conj_ch0_128:",(int16_t*)&ch0conj_ch0_128[0]);
+    print_shorts("ch1conj_ch1_128:",(int16_t*)&ch1conj_ch1_128[0]);
+    print_shorts("ch2conj_ch2_128:",(int16_t*)&ch2conj_ch2_128[0]);
+    print_shorts("ch3conj_ch3_128:",(int16_t*)&ch3conj_ch3_128[0]);
+    print_shorts("ch0conj_ch1_128:",(int16_t*)&ch0conj_ch1_128[0]);
+    print_shorts("ch1conj_ch0_128:",(int16_t*)&ch1conj_ch0_128[0]);
+    print_shorts("ch2conj_ch3_128:",(int16_t*)&ch2conj_ch3_128[0]);
+    print_shorts("ch3conj_ch2_128:",(int16_t*)&ch3conj_ch2_128[0]);
+    print_shorts("after_mf_00_128:",(int16_t*)&after_mf_00_128[0]);
+    print_shorts("after_mf_01_128:",(int16_t*)&after_mf_01_128[0]);
+    print_shorts("after_mf_10_128:",(int16_t*)&after_mf_10_128[0]);
+    print_shorts("after_mf_11_128:",(int16_t*)&after_mf_11_128[0]);
+#endif
 
-        if (ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]<0)
-          ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] = 0; //ue->measurements.n0_power[aarx];
+    ch0conj_ch0_128+=1;
+    ch1conj_ch1_128+=1;
+    ch2conj_ch2_128+=1;
+    ch3conj_ch3_128+=1;
+    ch0conj_ch1_128+=1;
+    ch1conj_ch0_128+=1;
+    ch2conj_ch3_128+=1;
+    ch3conj_ch2_128+=1;
 
-        ue->measurements.rx_spatial_power_dB[eNB_id][aatx][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]);
+    after_mf_00_128+=1;
+    after_mf_01_128+=1;
+    after_mf_10_128+=1;
+    after_mf_11_128+=1;
+  }
+  _mm_empty();
+  _m_empty();
+}
 
-        if (aatx==0)
-          ue->measurements.rx_power[eNB_id][aarx] = ue->measurements.rx_spatial_power[eNB_id][aatx][aarx];
-        else
-          ue->measurements.rx_power[eNB_id][aarx] += ue->measurements.rx_spatial_power[eNB_id][aatx][aarx];
-      } //aatx
 
-      ue->measurements.rx_power_dB[eNB_id][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_power[eNB_id][aarx]);
+void squared_matrix_element(int32_t *Hh_h_00,
+                            int32_t *Hh_h_00_sq,
+                            unsigned short nb_rb)
+{
+   unsigned short rb;
+  __m128i *Hh_h_00_128,*Hh_h_00_sq_128;
 
-      if (aarx==0)
-        ue->measurements.rx_power_tot[eNB_id] = ue->measurements.rx_power[eNB_id][aarx];
-      else
-        ue->measurements.rx_power_tot[eNB_id] += ue->measurements.rx_power[eNB_id][aarx];
-    } //aarx
+  Hh_h_00_128 = (__m128i *)Hh_h_00;
+  Hh_h_00_sq_128 = (__m128i *)Hh_h_00_sq;
 
-    ue->measurements.rx_power_tot_dB[eNB_id] = (unsigned short) dB_fixed(ue->measurements.rx_power_tot[eNB_id]);
+  for (rb=0; rb<3*nb_rb; rb++) {
 
-  } //eNB_id
+    Hh_h_00_sq_128[0] = _mm_madd_epi16(Hh_h_00_128[0],Hh_h_00_128[0]);
 
-  eNB_id=0;
-  if (ue->transmission_mode[0]==4 || ue->transmission_mode[0]==3){
-    if (rank_adaptation == 1)
-      rank_tm3_tm4 = rank_estimation_tm3_tm4(&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][4],
-                                             &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][4],
-                                             &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][4],
-                                             &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][4],
-                                             N_RB_DL);
-    else
-      rank_tm3_tm4=1;
 #ifdef DEBUG_RANK_EST
-  printf("rank tm3 or tm4 %d\n", rank_tm3_tm4);
+    printf("\n Computing squared_matrix_element \n");
+    print_shorts("Hh_h_00_128:",(int16_t*)&Hh_h_00_128[0]);
+    print_ints("Hh_h_00_sq_128:",(int32_t*)&Hh_h_00_sq_128[0]);
 #endif
+
+    Hh_h_00_sq_128+=1;
+    Hh_h_00_128+=1;
   }
+  _mm_empty();
+  _m_empty();
+}
 
-  if (ue->transmission_mode[eNB_id]!=4 && ue->transmission_mode[eNB_id]!=3)
-    ue->measurements.rank[eNB_id] = 0;
-  else
-    ue->measurements.rank[eNB_id] = rank_tm3_tm4;
-  //  printf ("tx mode %d\n", ue->transmission_mode[eNB_id]);
-  //  printf ("rank %d\n", ue->PHY_measurements.rank[eNB_id]);
 
-  // filter to remove jitter
-  if (ue->init_averaging == 0) {
-    for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++)
-      ue->measurements.rx_power_avg[eNB_id] = (int)
-          (((k1*((long long int)(ue->measurements.rx_power_avg[eNB_id]))) +
-            (k2*((long long int)(ue->measurements.rx_power_tot[eNB_id]))))>>10);
 
-    //LOG_I(PHY,"Noise Power Computation: k1 %d k2 %d n0 avg %d n0 tot %d\n", k1, k2, ue->measurements.n0_power_avg,
-    //    ue->measurements.n0_power_tot);
-    ue->measurements.n0_power_avg = (int)
-        (((k1*((long long int) (ue->measurements.n0_power_avg))) +
-          (k2*((long long int) (ue->measurements.n0_power_tot))))>>10);
-  } else {
-    for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++)
-      ue->measurements.rx_power_avg[eNB_id] = ue->measurements.rx_power_tot[eNB_id];
+void det_HhH(int32_t *after_mf_00,
+             int32_t *after_mf_01,
+             int32_t *after_mf_10,
+             int32_t *after_mf_11,
+             int32_t *det_fin,
+             unsigned short nb_rb)
 
-    ue->measurements.n0_power_avg = ue->measurements.n0_power_tot;
-    ue->init_averaging = 0;
-  }
+{
+  unsigned short rb;
+  __m128i *after_mf_00_128,*after_mf_01_128, *after_mf_10_128, *after_mf_11_128, ad_re_128, bc_re_128;
+  __m128i *det_fin_128, det_128;
 
-  for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) {
-    ue->measurements.rx_power_avg_dB[eNB_id] = dB_fixed( ue->measurements.rx_power_avg[eNB_id]);
-    ue->measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(ue->measurements.rx_power_tot[eNB_id],ue->measurements.n0_power_tot);
-    ue->measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(ue->measurements.rx_power_avg[eNB_id],ue->measurements.n0_power_avg);
-    ue->measurements.rx_rssi_dBm[eNB_id] = ue->measurements.rx_power_avg_dB[eNB_id] - ue->rx_total_gain_dB;
-#ifdef DEBUG_MEAS_UE
-      LOG_I(PHY,"[eNB %d] Subframe %d, RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n",
-            eNB_id,
-            subframe,
-            ue->measurements.rx_rssi_dBm[eNB_id],
-            ue->measurements.rx_power_avg_dB[eNB_id],
-            ue->measurements.wideband_cqi_avg[eNB_id],
-            ue->measurements.rx_power_avg[eNB_id],
-            ue->measurements.n0_power_tot);
-#endif
-  }
+  after_mf_00_128 = (__m128i *)after_mf_00;
+  after_mf_01_128 = (__m128i *)after_mf_01;
+  after_mf_10_128 = (__m128i *)after_mf_10;
+  after_mf_11_128 = (__m128i *)after_mf_11;
 
-  ue->measurements.n0_power_avg_dB = dB_fixed( ue->measurements.n0_power_avg);
+  det_fin_128 = (__m128i *)det_fin;
 
-  for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) {
-    if (frame_parms->nb_antenna_ports_eNB!=1) {
-      // cqi/pmi information
+  for (rb=0; rb<3*nb_rb; rb++) {
 
-      for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
-        dl_ch0    = &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
-        dl_ch1    = &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4];
+    ad_re_128 = _mm_madd_epi16(after_mf_00_128[0],after_mf_11_128[0]);
+    bc_re_128 = _mm_madd_epi16(after_mf_01_128[0],after_mf_01_128[0]);
+    det_128 = _mm_sub_epi32(ad_re_128, bc_re_128);
+    det_fin_128[0] = _mm_abs_epi32(det_128);
 
-        for (subband=0; subband<nb_subbands; subband++) {
+#ifdef DEBUG_RANK_EST
+    printf("\n Computing denominator \n");
+    print_shorts("after_mf_00_128:",(int16_t*)&after_mf_00_128[0]);
+    print_shorts("after_mf_01_128:",(int16_t*)&after_mf_01_128[0]);
+    print_shorts("after_mf_10_128:",(int16_t*)&after_mf_10_128[0]);
+    print_shorts("after_mf_11_128:",(int16_t*)&after_mf_11_128[0]);
+    print_ints("ad_re_128:",(int32_t*)&ad_re_128);
+    print_ints("bc_re_128:",(int32_t*)&bc_re_128);
+    print_ints("det_fin_128:",(int32_t*)&det_fin_128[0]);
+#endif
 
-          // cqi
-          if (aarx==0)
-            ue->measurements.subband_cqi_tot[eNB_id][subband]=0;
+    det_fin_128+=1;
+    after_mf_00_128+=1;
+    after_mf_01_128+=1;
+    after_mf_10_128+=1;
+    after_mf_11_128+=1;
+  }
+  _mm_empty();
+  _m_empty();
+}
 
-          if ((subband<(nb_subbands-1))||(N_RB_DL==6)) {
-            /*for (i=0;i<48;i++)
-            msg("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
-            */
-            ue->measurements.subband_cqi[eNB_id][aarx][subband] =
-              (signal_energy_nodc(dl_ch0,subband_size) + signal_energy_nodc(dl_ch1,subband_size));
+void numer(int32_t *Hh_h_00_sq,
+           int32_t *Hh_h_01_sq,
+           int32_t *Hh_h_10_sq,
+           int32_t *Hh_h_11_sq,
+           int32_t *num_fin,
+           unsigned short nb_rb)
 
-            if ( ue->measurements.subband_cqi[eNB_id][aarx][subband] < 0)
-              ue->measurements.subband_cqi[eNB_id][aarx][subband]=0;
+{
+  unsigned short rb;
+  __m128i *h_h_00_sq_128, *h_h_01_sq_128, *h_h_10_sq_128, *h_h_11_sq_128;
+  __m128i *num_fin_128, sq_a_plus_sq_d_128, sq_b_plus_sq_c_128;
 
-            /*
-            else
-            ue->measurements.subband_cqi[eNB_id][aarx][subband]-=ue->measurements.n0_power[aarx];
-            */
+  h_h_00_sq_128 = (__m128i *)Hh_h_00_sq;
+  h_h_01_sq_128 = (__m128i *)Hh_h_01_sq;
+  h_h_10_sq_128 = (__m128i *)Hh_h_10_sq;
+  h_h_11_sq_128 = (__m128i *)Hh_h_11_sq;
 
-            ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
-            ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
-                ue->measurements.n0_power[aarx]);
-          } else { // this is for the last subband which is smaller in size
-            //      for (i=0;i<12;i++)
-            //        printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
-            ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,last_subband_size) +
-                signal_energy_nodc(dl_ch1,last_subband_size)); // - ue->measurements.n0_power[aarx];
-            ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
-            ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
-                ue->measurements.n0_power[aarx]);
-          }
+  num_fin_128 = (__m128i *)num_fin;
 
-          dl_ch1+=subband_size;
-          dl_ch0+=subband_size;
-          //    msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,ue->measurements.subband_cqi[eNB_id][aarx][subband],ue->measurements.subband_cqi_dB[eNB_id][aarx][subband]);
-        }
+  for (rb=0; rb<3*nb_rb; rb++) {
 
-      }
+    sq_a_plus_sq_d_128 = _mm_add_epi32(h_h_00_sq_128[0],h_h_11_sq_128[0]);
+    sq_b_plus_sq_c_128 = _mm_add_epi32(h_h_01_sq_128[0],h_h_10_sq_128[0]);
+    num_fin_128[0] = _mm_add_epi32(sq_a_plus_sq_d_128, sq_b_plus_sq_c_128);
 
-      for (subband=0; subband<nb_subbands; subband++) {
-        ue->measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(ue->measurements.subband_cqi_tot[eNB_id][subband],ue->measurements.n0_power_tot);
-        //    msg("subband_cqi_tot[%d][%d] => %d dB (n0 %d)\n",eNB_id,subband,ue->measurements.subband_cqi_tot_dB[eNB_id][subband],ue->measurements.n0_power_tot);
-      }
+#ifdef DEBUG_RANK_EST
+    printf("\n Computing numerator \n");
+    print_ints("h_h_00_sq_128:",(int32_t*)&h_h_00_sq_128[0]);
+    print_ints("h_h_01_sq_128:",(int32_t*)&h_h_01_sq_128[0]);
+    print_ints("h_h_10_sq_128:",(int32_t*)&h_h_10_sq_128[0]);
+    print_ints("h_h_11_sq_128:",(int32_t*)&h_h_11_sq_128[0]);
+    print_shorts("sq_a_plus_sq_d_128:",(int16_t*)&sq_a_plus_sq_d_128);
+    print_shorts("sq_b_plus_sq_c_128:",(int16_t*)&sq_b_plus_sq_c_128);
+    print_shorts("num_fin_128:",(int16_t*)&num_fin_128[0]);
+#endif
 
-      for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
-        //printf("aarx=%d", aarx);
-        // skip the first 4 RE due to interpolation filter length of 5 (not possible to skip 5 due to 128i alignment, must be multiple of 128bit)
+    num_fin_128+=1;
+    h_h_00_sq_128+=1;
+    h_h_01_sq_128+=1;
+    h_h_10_sq_128+=1;
+    h_h_11_sq_128+=1;
+  }
+  _mm_empty();
+  _m_empty();
+}
 
-#if defined(__x86_64__) || defined(__i386__)
-       __m128i pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1 /* ,mmtmpPMI2,mmtmpPMI3 */ ;
+void dlsch_channel_level_TM34_meas(int *ch00,
+                                   int *ch01,
+                                   int *ch10,
+                                   int *ch11,
+                                   int *avg_0,
+                                   int *avg_1,
+                                   unsigned short nb_rb)
+{
 
-        dl_ch0_128    = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
-        dl_ch1_128    = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4];
-#elif defined(__arm__)
-        int32x4_t pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1,mmtmpPMI0b,mmtmpPMI1b;
+#if defined(__x86_64__)||defined(__i386__)
 
-        dl_ch0_128    = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
-        dl_ch1_128    = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4];
+  short rb;
+  unsigned char nre=12;
+  __m128i *ch00_128, *ch01_128, *ch10_128, *ch11_128;
+  __m128i avg_0_row0_128D, avg_1_row0_128D, avg_0_row1_128D, avg_1_row1_128D;
+  __m128i ch00_128_tmp, ch01_128_tmp, ch10_128_tmp, ch11_128_tmp;
 
-#endif
-        for (subband=0; subband<nb_subbands; subband++) {
+  avg_0[0] = 0;
+  avg_0[1] = 0;
+  avg_1[0] = 0;
+  avg_1[1] = 0;
 
+  ch00_128 = (__m128i *)ch00;
+  ch01_128 = (__m128i *)ch01;
+  ch10_128 = (__m128i *)ch10;
+  ch11_128 = (__m128i *)ch11;
 
-          // pmi
-#if defined(__x86_64__) || defined(__i386__)
+  avg_0_row0_128D = _mm_setzero_si128();
+  avg_1_row0_128D = _mm_setzero_si128();
+  avg_0_row1_128D = _mm_setzero_si128();
+  avg_1_row1_128D = _mm_setzero_si128();
 
-          pmi128_re = _mm_xor_si128(pmi128_re,pmi128_re);
-          pmi128_im = _mm_xor_si128(pmi128_im,pmi128_im);
-#elif defined(__arm__)
+  for (rb=0; rb<3*nb_rb; rb++) {
+    ch00_128_tmp = _mm_load_si128(&ch00_128[0]);
+    ch01_128_tmp = _mm_load_si128(&ch01_128[0]);
+    ch10_128_tmp = _mm_load_si128(&ch10_128[0]);
+    ch11_128_tmp = _mm_load_si128(&ch11_128[0]);
 
-          pmi128_re = vdupq_n_s32(0);
-          pmi128_im = vdupq_n_s32(0);
-#endif
-          // limit is the number of groups of 4 REs in a subband (12 = 4 RBs, 3 = 1 RB)
-          // for 5 MHz channelization, there are 7 subbands, 6 of size 4 RBs and 1 of size 1 RB
-          if ((N_RB_DL==6) || (subband<(nb_subbands-1)))
-            limit = subband_size>>2;
-          else
-            limit = last_subband_size>>2;
+    avg_0_row0_128D = _mm_add_epi32(avg_0_row0_128D,_mm_madd_epi16(ch00_128_tmp,ch00_128_tmp));
+    avg_1_row0_128D = _mm_add_epi32(avg_1_row0_128D,_mm_madd_epi16(ch01_128_tmp,ch01_128_tmp));
+    avg_0_row1_128D = _mm_add_epi32(avg_0_row1_128D,_mm_madd_epi16(ch10_128_tmp,ch10_128_tmp));
+    avg_1_row1_128D = _mm_add_epi32(avg_1_row1_128D,_mm_madd_epi16(ch11_128_tmp,ch11_128_tmp));
 
-          for (i=0; i<limit; i++) {
+    ch00_128+=1;
+    ch01_128+=1;
+    ch10_128+=1;
+    ch11_128+=1;
+  }
 
-#if defined(__x86_64__) || defined(__i386__)
-              mmtmpPMI0 = _mm_xor_si128(mmtmpPMI0,mmtmpPMI0);
-              mmtmpPMI1 = _mm_xor_si128(mmtmpPMI1,mmtmpPMI1);
+  avg_0[0] = (((int*)&avg_0_row0_128D)[0])/(nb_rb*nre) +
+           (((int*)&avg_0_row0_128D)[1])/(nb_rb*nre) +
+           (((int*)&avg_0_row0_128D)[2])/(nb_rb*nre) +
+           (((int*)&avg_0_row0_128D)[3])/(nb_rb*nre);
 
-            // For each RE in subband perform ch0 * conj(ch1)
-            // multiply by conjugated channel
-                //  print_ints("ch0",&dl_ch0_128[0]);
-                //  print_ints("ch1",&dl_ch1_128[0]);
+  avg_1[0] = (((int*)&avg_1_row0_128D)[0])/(nb_rb*nre) +
+           (((int*)&avg_1_row0_128D)[1])/(nb_rb*nre) +
+           (((int*)&avg_1_row0_128D)[2])/(nb_rb*nre) +
+           (((int*)&avg_1_row0_128D)[3])/(nb_rb*nre);
 
-            mmtmpPMI0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch1_128[0]);
-                 //  print_ints("re",&mmtmpPMI0);
-            mmtmpPMI1 = _mm_shufflelo_epi16(dl_ch1_128[0],_MM_SHUFFLE(2,3,0,1));
-              //  print_ints("_mm_shufflelo_epi16",&mmtmpPMI1);
-            mmtmpPMI1 = _mm_shufflehi_epi16(mmtmpPMI1,_MM_SHUFFLE(2,3,0,1));
-                //  print_ints("_mm_shufflehi_epi16",&mmtmpPMI1);
-            mmtmpPMI1 = _mm_sign_epi16(mmtmpPMI1,*(__m128i*)&conjugate[0]);
-               //  print_ints("_mm_sign_epi16",&mmtmpPMI1);
-            mmtmpPMI1 = _mm_madd_epi16(mmtmpPMI1,dl_ch0_128[0]);
-               //   print_ints("mm_madd_epi16",&mmtmpPMI1);
-            // mmtmpPMI1 contains imag part of 4 consecutive outputs (32-bit)
-            pmi128_re = _mm_add_epi32(pmi128_re,mmtmpPMI0);
-             //   print_ints(" pmi128_re 0",&pmi128_re);
-            pmi128_im = _mm_add_epi32(pmi128_im,mmtmpPMI1);
-               //   print_ints(" pmi128_im 0 ",&pmi128_im);
+  avg_0[1] = (((int*)&avg_0_row1_128D)[0])/(nb_rb*nre) +
+           (((int*)&avg_0_row1_128D)[1])/(nb_rb*nre) +
+           (((int*)&avg_0_row1_128D)[2])/(nb_rb*nre) +
+           (((int*)&avg_0_row1_128D)[3])/(nb_rb*nre);
 
-          /*  mmtmpPMI0 = _mm_xor_si128(mmtmpPMI0,mmtmpPMI0);
-            mmtmpPMI1 = _mm_xor_si128(mmtmpPMI1,mmtmpPMI1);
+  avg_1[1] = (((int*)&avg_1_row1_128D)[0])/(nb_rb*nre) +
+           (((int*)&avg_1_row1_128D)[1])/(nb_rb*nre) +
+           (((int*)&avg_1_row1_128D)[2])/(nb_rb*nre) +
+           (((int*)&avg_1_row1_128D)[3])/(nb_rb*nre);
 
-            mmtmpPMI0 = _mm_madd_epi16(dl_ch0_128[1],dl_ch1_128[1]);
-                 //  print_ints("re",&mmtmpPMI0);
-            mmtmpPMI1 = _mm_shufflelo_epi16(dl_ch1_128[1],_MM_SHUFFLE(2,3,0,1));
-              //  print_ints("_mm_shufflelo_epi16",&mmtmpPMI1);
-            mmtmpPMI1 = _mm_shufflehi_epi16(mmtmpPMI1,_MM_SHUFFLE(2,3,0,1));
-                //  print_ints("_mm_shufflehi_epi16",&mmtmpPMI1);
-            mmtmpPMI1 = _mm_sign_epi16(mmtmpPMI1,*(__m128i*)&conjugate);
-               //  print_ints("_mm_sign_epi16",&mmtmpPMI1);
-            mmtmpPMI1 = _mm_madd_epi16(mmtmpPMI1,dl_ch0_128[1]);
-               //   print_ints("mm_madd_epi16",&mmtmpPMI1);
-            // mmtmpPMI1 contains imag part of 4 consecutive outputs (32-bit)
-            pmi128_re = _mm_add_epi32(pmi128_re,mmtmpPMI0);
-                //  print_ints(" pmi128_re 1",&pmi128_re);
-            pmi128_im = _mm_add_epi32(pmi128_im,mmtmpPMI1);
-            //print_ints(" pmi128_im 1 ",&pmi128_im);*/
+  avg_0[0] = avg_0[0] + avg_0[1];
+  avg_1[0] = avg_1[0] + avg_1[1];
+  avg_0[0] = min (avg_0[0], avg_1[0]);
+  avg_1[0] = avg_0[0];
+
+  _mm_empty();
+  _m_empty();
 
 #elif defined(__arm__)
 
-            mmtmpPMI0 = vmull_s16(((int16x4_t*)dl_ch0_128)[0], ((int16x4_t*)dl_ch1_128)[0]);
-            mmtmpPMI1 = vmull_s16(((int16x4_t*)dl_ch0_128)[1], ((int16x4_t*)dl_ch1_128)[1]);
-            pmi128_re = vqaddq_s32(pmi128_re,vcombine_s32(vpadd_s32(vget_low_s32(mmtmpPMI0),vget_high_s32(mmtmpPMI0)),vpadd_s32(vget_low_s32(mmtmpPMI1),vget_high_s32(mmtmpPMI1))));
+#endif
+}
 
-            mmtmpPMI0b = vmull_s16(vrev32_s16(vmul_s16(((int16x4_t*)dl_ch0_128)[0],*(int16x4_t*)conjugate)), ((int16x4_t*)dl_ch1_128)[0]);
-            mmtmpPMI1b = vmull_s16(vrev32_s16(vmul_s16(((int16x4_t*)dl_ch0_128)[1],*(int16x4_t*)conjugate)), ((int16x4_t*)dl_ch1_128)[1]);
-            pmi128_im = vqaddq_s32(pmi128_im,vcombine_s32(vpadd_s32(vget_low_s32(mmtmpPMI0b),vget_high_s32(mmtmpPMI0b)),vpadd_s32(vget_low_s32(mmtmpPMI1b),vget_high_s32(mmtmpPMI1b))));
+uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the order of channel estimates
+                                 int *dl_ch_estimates_01,
+                                 int *dl_ch_estimates_10,
+                                 int *dl_ch_estimates_11,
+                                 unsigned short nb_rb)
+{
 
-#endif
-            dl_ch0_128++;
-            dl_ch1_128++;
-          }
-
-          ue->measurements.subband_pmi_re[eNB_id][subband][aarx] = (((int *)&pmi128_re)[0] + ((int *)&pmi128_re)[1] + ((int *)&pmi128_re)[2] + ((int *)&pmi128_re)[3])>>2;
-          ue->measurements.subband_pmi_im[eNB_id][subband][aarx] = (((int *)&pmi128_im)[0] + ((int *)&pmi128_im)[1] + ((int *)&pmi128_im)[2] + ((int *)&pmi128_im)[3])>>2;
-          ue->measurements.wideband_pmi_re[eNB_id][aarx] += ue->measurements.subband_pmi_re[eNB_id][subband][aarx];
-          ue->measurements.wideband_pmi_im[eNB_id][aarx] += ue->measurements.subband_pmi_im[eNB_id][subband][aarx];
-        } // subband loop
-      } // rx antenna loop
-    }  // if frame_parms->mode1_flag == 0
-    else {
-      // cqi information only for mode 1
-      for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
-        dl_ch0    = &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
-
-        for (subband=0; subband<7; subband++) {
-
-          // cqi
-          if (aarx==0)
-            ue->measurements.subband_cqi_tot[eNB_id][subband]=0;
-
-          if (subband<6) {
-            //      for (i=0;i<48;i++)
-            //        printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
-            ue->measurements.subband_cqi[eNB_id][aarx][subband] =
-              (signal_energy_nodc(dl_ch0,48) ) - ue->measurements.n0_power[aarx];
-
-            ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
-            ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
-                ue->measurements.n0_power[aarx]);
-          } else {
-            //      for (i=0;i<12;i++)
-            //        printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
-            ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) ) - ue->measurements.n0_power[aarx];
-            ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
-            ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
-                ue->measurements.n0_power[aarx]);
-          }
-
-          dl_ch1+=48;
-          //    msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,ue->measurements.subband_cqi[eNB_id][aarx][subband],ue->measurements.subband_cqi_dB[eNB_id][aarx][subband]);
-        }
-      }
-
-      for (subband=0; subband<nb_subbands; subband++) {
-        ue->measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(ue->measurements.subband_cqi_tot[eNB_id][subband],ue->measurements.n0_power_tot);
-      }
-    }
-
-    //ue->measurements.rank[eNB_id] = 0;
-
-    for (i=0; i<nb_subbands; i++) {
-      ue->measurements.selected_rx_antennas[eNB_id][i] = 0;
-
-      if (frame_parms->nb_antennas_rx>1) {
-        if (ue->measurements.subband_cqi_dB[eNB_id][0][i] >= ue->measurements.subband_cqi_dB[eNB_id][1][i])
-          ue->measurements.selected_rx_antennas[eNB_id][i] = 0;
-        else
-          ue->measurements.selected_rx_antennas[eNB_id][i] = 1;
-      } else
-        ue->measurements.selected_rx_antennas[eNB_id][i] = 0;
-    }
-
-    // if(eNB_id==0)
-    // printf("in lte_ue_measurements: selected rx_antenna[eNB_id==0]:%u\n", ue->measurements.selected_rx_antennas[eNB_id][i]);
-  }  // eNB_id loop
-
-#if defined(__x86_64__) || defined(__i386__)
-  _mm_empty();
-  _m_empty();
-#endif
-}
-
-
-void lte_ue_measurements_emul(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id)
-{
-
-  LOG_D(PHY,"EMUL UE lte_ue_measurements_emul subframe %d, eNB_id %d\n",subframe,eNB_id);
-}
-
-
-uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the order of channel estimates
-                                 int *dl_ch_estimates_01,
-                                 int *dl_ch_estimates_10,
-                                 int *dl_ch_estimates_11,
-                                 unsigned short nb_rb)
-{
-
-  int i=0;
-  int rank=0;
-  int N_RB=nb_rb;
-  int *ch00_rank, *ch01_rank, *ch10_rank, *ch11_rank;
+  int i=0;
+  int rank=0;
+  int N_RB=nb_rb;
+  int *ch00_rank, *ch01_rank, *ch10_rank, *ch11_rank;
 
   int32_t shift;
   int avg_0[2];
@@ -1058,328 +998,390 @@ uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the
    return(rank);
 }
 
-void conjch0_mult_ch1(int *ch0,
-                      int *ch1,
-                      int32_t *ch0conj_ch1,
-                      unsigned short nb_rb,
-                      unsigned char output_shift0)
-{
-  //This function is used to compute multiplications in Hhermitian * H matrix
-  unsigned short rb;
-  __m128i *dl_ch0_128,*dl_ch1_128, *ch0conj_ch1_128, mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3;
 
-  dl_ch0_128 = (__m128i *)ch0;
-  dl_ch1_128 = (__m128i *)ch1;
 
-  ch0conj_ch1_128 = (__m128i *)ch0conj_ch1;
 
-  for (rb=0; rb<3*nb_rb; rb++) {
 
-    mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch1_128[0]);
-    mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1));
-    mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
-    mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
-    mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch1_128[0]);
-    mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0);
-    mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0);
-    mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
-    mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
 
-    ch0conj_ch1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
 
-#ifdef DEBUG_RANK_EST
-    printf("\n Computing conjugates \n");
-    print_shorts("ch0:",(int16_t*)&dl_ch0_128[0]);
-    print_shorts("ch1:",(int16_t*)&dl_ch1_128[0]);
-    print_shorts("pack:",(int16_t*)&ch0conj_ch1_128[0]);
+void lte_ue_measurements(PHY_VARS_UE *ue,
+                         unsigned int subframe_offset,
+                         unsigned char N0_symbol,
+                         unsigned char abstraction_flag,
+                         unsigned char rank_adaptation,
+                         uint8_t subframe)
+{
+
+
+  int aarx,aatx,eNB_id=0; //,gain_offset=0;
+  //int rx_power[NUMBER_OF_CONNECTED_eNB_MAX];
+  int i;
+  unsigned int limit,subband;
+#if defined(__x86_64__) || defined(__i386__)
+  __m128i *dl_ch0_128,*dl_ch1_128;
+#elif defined(__arm__)
+  int16x8_t *dl_ch0_128, *dl_ch1_128;
 #endif
+  int *dl_ch0,*dl_ch1;
 
-    dl_ch0_128+=1;
-    dl_ch1_128+=1;
-    ch0conj_ch1_128+=1;
-  }
-  _mm_empty();
-  _m_empty();
-}
+  LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+  int nb_subbands,subband_size,last_subband_size;
+  int N_RB_DL = frame_parms->N_RB_DL;
 
-void construct_HhH_elements(int *ch0conj_ch0, //00_00
-                            int *ch1conj_ch1,//01_01
-                            int *ch2conj_ch2,//11_11
-                            int *ch3conj_ch3,//10_10
-                            int *ch0conj_ch1,//00_01
-                            int *ch1conj_ch0,//01_00
-                            int *ch2conj_ch3,//10_11
-                            int *ch3conj_ch2,//11_10
-                            int32_t *after_mf_00,
-                            int32_t *after_mf_01,
-                            int32_t *after_mf_10,
-                            int32_t *after_mf_11,
-                            unsigned short nb_rb)
-{
-  unsigned short rb;
-  __m128i *ch0conj_ch0_128, *ch1conj_ch1_128, *ch2conj_ch2_128, *ch3conj_ch3_128;
-  __m128i *ch0conj_ch1_128, *ch1conj_ch0_128, *ch2conj_ch3_128, *ch3conj_ch2_128;
-  __m128i *after_mf_00_128, *after_mf_01_128, *after_mf_10_128, *after_mf_11_128;
 
-  ch0conj_ch0_128 = (__m128i *)ch0conj_ch0;
-  ch1conj_ch1_128 = (__m128i *)ch1conj_ch1;
-  ch2conj_ch2_128 = (__m128i *)ch2conj_ch2;
-  ch3conj_ch3_128 = (__m128i *)ch3conj_ch3;
-  ch0conj_ch1_128 = (__m128i *)ch0conj_ch1;
-  ch1conj_ch0_128 = (__m128i *)ch1conj_ch0;
-  ch2conj_ch3_128 = (__m128i *)ch2conj_ch3;
-  ch3conj_ch2_128 = (__m128i *)ch3conj_ch2;
-  after_mf_00_128 = (__m128i *)after_mf_00;
-  after_mf_01_128 = (__m128i *)after_mf_01;
-  after_mf_10_128 = (__m128i *)after_mf_10;
-  after_mf_11_128 = (__m128i *)after_mf_11;
+  int rank_tm3_tm4;
 
-  for (rb=0; rb<3*nb_rb; rb++) {
 
-    after_mf_00_128[0] =_mm_adds_epi16(ch0conj_ch0_128[0],ch3conj_ch3_128[0]);// _mm_adds_epi32(ch0conj_ch0_128[0], ch3conj_ch3_128[0]); //00_00 + 10_10
-    after_mf_11_128[0] =_mm_adds_epi16(ch1conj_ch1_128[0], ch2conj_ch2_128[0]); //01_01 + 11_11
-    after_mf_01_128[0] =_mm_adds_epi16(ch0conj_ch1_128[0], ch2conj_ch3_128[0]);//00_01 + 10_11
-    after_mf_10_128[0] =_mm_adds_epi16(ch1conj_ch0_128[0], ch3conj_ch2_128[0]);//01_00 + 11_10
+  ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
 
-#ifdef DEBUG_RANK_EST
-    printf(" \n construct_HhH_elements \n");
-    print_shorts("ch0conj_ch0_128:",(int16_t*)&ch0conj_ch0_128[0]);
-    print_shorts("ch1conj_ch1_128:",(int16_t*)&ch1conj_ch1_128[0]);
-    print_shorts("ch2conj_ch2_128:",(int16_t*)&ch2conj_ch2_128[0]);
-    print_shorts("ch3conj_ch3_128:",(int16_t*)&ch3conj_ch3_128[0]);
-    print_shorts("ch0conj_ch1_128:",(int16_t*)&ch0conj_ch1_128[0]);
-    print_shorts("ch1conj_ch0_128:",(int16_t*)&ch1conj_ch0_128[0]);
-    print_shorts("ch2conj_ch3_128:",(int16_t*)&ch2conj_ch3_128[0]);
-    print_shorts("ch3conj_ch2_128:",(int16_t*)&ch3conj_ch2_128[0]);
-    print_shorts("after_mf_00_128:",(int16_t*)&after_mf_00_128[0]);
-    print_shorts("after_mf_01_128:",(int16_t*)&after_mf_01_128[0]);
-    print_shorts("after_mf_10_128:",(int16_t*)&after_mf_10_128[0]);
-    print_shorts("after_mf_11_128:",(int16_t*)&after_mf_11_128[0]);
-#endif
 
-    ch0conj_ch0_128+=1;
-    ch1conj_ch1_128+=1;
-    ch2conj_ch2_128+=1;
-    ch3conj_ch3_128+=1;
-    ch0conj_ch1_128+=1;
-    ch1conj_ch0_128+=1;
-    ch2conj_ch3_128+=1;
-    ch3conj_ch2_128+=1;
+  switch (N_RB_DL) {
+  case 6:
+    nb_subbands = 6;
+    subband_size = 12;
+    last_subband_size = 0;
+    break;
 
-    after_mf_00_128+=1;
-    after_mf_01_128+=1;
-    after_mf_10_128+=1;
-    after_mf_11_128+=1;
+  default:
+  case 25:
+    nb_subbands = 7;
+    subband_size = 4*12;
+    last_subband_size = 12;
+    break;
+
+  case 50:
+    nb_subbands = 9;
+    subband_size = 6*12;
+    last_subband_size = 2*12;
+    break;
+
+  case 100:
+    nb_subbands = 13;
+    subband_size = 8*12;
+    last_subband_size = 4*12;
+    break;
   }
-  _mm_empty();
-  _m_empty();
-}
 
+  // signal measurements
+  for (eNB_id=0; eNB_id<ue->n_connected_eNB; eNB_id++) {
+    for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
+      for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) {
+        ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
+          (signal_energy_nodc(&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0],
+                              (N_RB_DL*12)));
+        //- ue->measurements.n0_power[aarx];
 
-void squared_matrix_element(int32_t *Hh_h_00,
-                            int32_t *Hh_h_00_sq,
-                            unsigned short nb_rb)
-{
-   unsigned short rb;
-  __m128i *Hh_h_00_128,*Hh_h_00_sq_128;
+        if (ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]<0)
+          ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] = 0; //ue->measurements.n0_power[aarx];
 
-  Hh_h_00_128 = (__m128i *)Hh_h_00;
-  Hh_h_00_sq_128 = (__m128i *)Hh_h_00_sq;
+        ue->measurements.rx_spatial_power_dB[eNB_id][aatx][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]);
 
-  for (rb=0; rb<3*nb_rb; rb++) {
+        if (aatx==0)
+          ue->measurements.rx_power[eNB_id][aarx] = ue->measurements.rx_spatial_power[eNB_id][aatx][aarx];
+        else
+          ue->measurements.rx_power[eNB_id][aarx] += ue->measurements.rx_spatial_power[eNB_id][aatx][aarx];
+      } //aatx
 
-    Hh_h_00_sq_128[0] = _mm_madd_epi16(Hh_h_00_128[0],Hh_h_00_128[0]);
+      ue->measurements.rx_power_dB[eNB_id][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_power[eNB_id][aarx]);
+
+      if (aarx==0)
+        ue->measurements.rx_power_tot[eNB_id] = ue->measurements.rx_power[eNB_id][aarx];
+      else
+        ue->measurements.rx_power_tot[eNB_id] += ue->measurements.rx_power[eNB_id][aarx];
+    } //aarx
+
+    ue->measurements.rx_power_tot_dB[eNB_id] = (unsigned short) dB_fixed(ue->measurements.rx_power_tot[eNB_id]);
 
+  } //eNB_id
+
+  eNB_id=0;
+  if (ue->transmission_mode[0]==4 || ue->transmission_mode[0]==3){
+    if (rank_adaptation == 1)
+      rank_tm3_tm4 = rank_estimation_tm3_tm4(&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][4],
+                                             &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][4],
+                                             &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][4],
+                                             &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][4],
+                                             N_RB_DL);
+    else
+      rank_tm3_tm4=1;
 #ifdef DEBUG_RANK_EST
-    printf("\n Computing squared_matrix_element \n");
-    print_shorts("Hh_h_00_128:",(int16_t*)&Hh_h_00_128[0]);
-    print_ints("Hh_h_00_sq_128:",(int32_t*)&Hh_h_00_sq_128[0]);
+  printf("rank tm3 or tm4 %d\n", rank_tm3_tm4);
 #endif
+  }
 
-    Hh_h_00_sq_128+=1;
-    Hh_h_00_128+=1;
+  if (ue->transmission_mode[eNB_id]!=4 && ue->transmission_mode[eNB_id]!=3)
+    ue->measurements.rank[eNB_id] = 0;
+  else
+    ue->measurements.rank[eNB_id] = rank_tm3_tm4;
+  //  printf ("tx mode %d\n", ue->transmission_mode[eNB_id]);
+  //  printf ("rank %d\n", ue->PHY_measurements.rank[eNB_id]);
+
+  // filter to remove jitter
+  if (ue->init_averaging == 0) {
+    for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++)
+      ue->measurements.rx_power_avg[eNB_id] = (int)
+          (((k1*((long long int)(ue->measurements.rx_power_avg[eNB_id]))) +
+            (k2*((long long int)(ue->measurements.rx_power_tot[eNB_id]))))>>10);
+
+    //LOG_I(PHY,"Noise Power Computation: k1 %d k2 %d n0 avg %d n0 tot %d\n", k1, k2, ue->measurements.n0_power_avg,
+    //    ue->measurements.n0_power_tot);
+    ue->measurements.n0_power_avg = (int)
+        (((k1*((long long int) (ue->measurements.n0_power_avg))) +
+          (k2*((long long int) (ue->measurements.n0_power_tot))))>>10);
+  } else {
+    for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++)
+      ue->measurements.rx_power_avg[eNB_id] = ue->measurements.rx_power_tot[eNB_id];
+
+    ue->measurements.n0_power_avg = ue->measurements.n0_power_tot;
+    ue->init_averaging = 0;
   }
-  _mm_empty();
-  _m_empty();
-}
 
+  for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) {
+    ue->measurements.rx_power_avg_dB[eNB_id] = dB_fixed( ue->measurements.rx_power_avg[eNB_id]);
+    ue->measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(ue->measurements.rx_power_tot[eNB_id],ue->measurements.n0_power_tot);
+    ue->measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(ue->measurements.rx_power_avg[eNB_id],ue->measurements.n0_power_avg);
+    ue->measurements.rx_rssi_dBm[eNB_id] = ue->measurements.rx_power_avg_dB[eNB_id] - ue->rx_total_gain_dB;
+#ifdef DEBUG_MEAS_UE
+      LOG_I(PHY,"[eNB %d] Subframe %d, RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n",
+            eNB_id,
+            subframe,
+            ue->measurements.rx_rssi_dBm[eNB_id],
+            ue->measurements.rx_power_avg_dB[eNB_id],
+            ue->measurements.wideband_cqi_avg[eNB_id],
+            ue->measurements.rx_power_avg[eNB_id],
+            ue->measurements.n0_power_tot);
+#endif
+  }
 
+  ue->measurements.n0_power_avg_dB = dB_fixed( ue->measurements.n0_power_avg);
 
-void det_HhH(int32_t *after_mf_00,
-             int32_t *after_mf_01,
-             int32_t *after_mf_10,
-             int32_t *after_mf_11,
-             int32_t *det_fin,
-             unsigned short nb_rb)
+  for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) {
+    if (frame_parms->nb_antenna_ports_eNB!=1) {
+      // cqi/pmi information
 
-{
-  unsigned short rb;
-  __m128i *after_mf_00_128,*after_mf_01_128, *after_mf_10_128, *after_mf_11_128, ad_re_128, bc_re_128;
-  __m128i *det_fin_128, det_128;
+      for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
+        dl_ch0    = &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
+        dl_ch1    = &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4];
 
-  after_mf_00_128 = (__m128i *)after_mf_00;
-  after_mf_01_128 = (__m128i *)after_mf_01;
-  after_mf_10_128 = (__m128i *)after_mf_10;
-  after_mf_11_128 = (__m128i *)after_mf_11;
+        for (subband=0; subband<nb_subbands; subband++) {
 
-  det_fin_128 = (__m128i *)det_fin;
+          // cqi
+          if (aarx==0)
+            ue->measurements.subband_cqi_tot[eNB_id][subband]=0;
 
-  for (rb=0; rb<3*nb_rb; rb++) {
+          if ((subband<(nb_subbands-1))||(N_RB_DL==6)) {
+            /*for (i=0;i<48;i++)
+            msg("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
+            */
+            ue->measurements.subband_cqi[eNB_id][aarx][subband] =
+              (signal_energy_nodc(dl_ch0,subband_size) + signal_energy_nodc(dl_ch1,subband_size));
 
-    ad_re_128 = _mm_madd_epi16(after_mf_00_128[0],after_mf_11_128[0]);
-    bc_re_128 = _mm_madd_epi16(after_mf_01_128[0],after_mf_01_128[0]);
-    det_128 = _mm_sub_epi32(ad_re_128, bc_re_128);
-    det_fin_128[0] = _mm_abs_epi32(det_128);
+            if ( ue->measurements.subband_cqi[eNB_id][aarx][subband] < 0)
+              ue->measurements.subband_cqi[eNB_id][aarx][subband]=0;
 
-#ifdef DEBUG_RANK_EST
-    printf("\n Computing denominator \n");
-    print_shorts("after_mf_00_128:",(int16_t*)&after_mf_00_128[0]);
-    print_shorts("after_mf_01_128:",(int16_t*)&after_mf_01_128[0]);
-    print_shorts("after_mf_10_128:",(int16_t*)&after_mf_10_128[0]);
-    print_shorts("after_mf_11_128:",(int16_t*)&after_mf_11_128[0]);
-    print_ints("ad_re_128:",(int32_t*)&ad_re_128);
-    print_ints("bc_re_128:",(int32_t*)&bc_re_128);
-    print_ints("det_fin_128:",(int32_t*)&det_fin_128[0]);
-#endif
+            /*
+            else
+            ue->measurements.subband_cqi[eNB_id][aarx][subband]-=ue->measurements.n0_power[aarx];
+            */
+
+            ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
+            ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
+                ue->measurements.n0_power[aarx]);
+          } else { // this is for the last subband which is smaller in size
+            //      for (i=0;i<12;i++)
+            //        printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
+            ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,last_subband_size) +
+                signal_energy_nodc(dl_ch1,last_subband_size)); // - ue->measurements.n0_power[aarx];
+            ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
+            ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
+                ue->measurements.n0_power[aarx]);
+          }
+
+          dl_ch1+=subband_size;
+          dl_ch0+=subband_size;
+          //    msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,ue->measurements.subband_cqi[eNB_id][aarx][subband],ue->measurements.subband_cqi_dB[eNB_id][aarx][subband]);
+        }
+
+      }
 
-    det_fin_128+=1;
-    after_mf_00_128+=1;
-    after_mf_01_128+=1;
-    after_mf_10_128+=1;
-    after_mf_11_128+=1;
-  }
-  _mm_empty();
-  _m_empty();
-}
+      for (subband=0; subband<nb_subbands; subband++) {
+        ue->measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(ue->measurements.subband_cqi_tot[eNB_id][subband],ue->measurements.n0_power_tot);
+        //    msg("subband_cqi_tot[%d][%d] => %d dB (n0 %d)\n",eNB_id,subband,ue->measurements.subband_cqi_tot_dB[eNB_id][subband],ue->measurements.n0_power_tot);
+      }
 
-void numer(int32_t *Hh_h_00_sq,
-           int32_t *Hh_h_01_sq,
-           int32_t *Hh_h_10_sq,
-           int32_t *Hh_h_11_sq,
-           int32_t *num_fin,
-           unsigned short nb_rb)
+      for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
+        //printf("aarx=%d", aarx);
+        // skip the first 4 RE due to interpolation filter length of 5 (not possible to skip 5 due to 128i alignment, must be multiple of 128bit)
 
-{
-  unsigned short rb;
-  __m128i *h_h_00_sq_128, *h_h_01_sq_128, *h_h_10_sq_128, *h_h_11_sq_128;
-  __m128i *num_fin_128, sq_a_plus_sq_d_128, sq_b_plus_sq_c_128;
+#if defined(__x86_64__) || defined(__i386__)
+       __m128i pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1 /* ,mmtmpPMI2,mmtmpPMI3 */ ;
 
-  h_h_00_sq_128 = (__m128i *)Hh_h_00_sq;
-  h_h_01_sq_128 = (__m128i *)Hh_h_01_sq;
-  h_h_10_sq_128 = (__m128i *)Hh_h_10_sq;
-  h_h_11_sq_128 = (__m128i *)Hh_h_11_sq;
+        dl_ch0_128    = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
+        dl_ch1_128    = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4];
+#elif defined(__arm__)
+        int32x4_t pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1,mmtmpPMI0b,mmtmpPMI1b;
 
-  num_fin_128 = (__m128i *)num_fin;
+        dl_ch0_128    = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
+        dl_ch1_128    = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4];
 
-  for (rb=0; rb<3*nb_rb; rb++) {
+#endif
+        for (subband=0; subband<nb_subbands; subband++) {
 
-    sq_a_plus_sq_d_128 = _mm_add_epi32(h_h_00_sq_128[0],h_h_11_sq_128[0]);
-    sq_b_plus_sq_c_128 = _mm_add_epi32(h_h_01_sq_128[0],h_h_10_sq_128[0]);
-    num_fin_128[0] = _mm_add_epi32(sq_a_plus_sq_d_128, sq_b_plus_sq_c_128);
 
-#ifdef DEBUG_RANK_EST
-    printf("\n Computing numerator \n");
-    print_ints("h_h_00_sq_128:",(int32_t*)&h_h_00_sq_128[0]);
-    print_ints("h_h_01_sq_128:",(int32_t*)&h_h_01_sq_128[0]);
-    print_ints("h_h_10_sq_128:",(int32_t*)&h_h_10_sq_128[0]);
-    print_ints("h_h_11_sq_128:",(int32_t*)&h_h_11_sq_128[0]);
-    print_shorts("sq_a_plus_sq_d_128:",(int16_t*)&sq_a_plus_sq_d_128);
-    print_shorts("sq_b_plus_sq_c_128:",(int16_t*)&sq_b_plus_sq_c_128);
-    print_shorts("num_fin_128:",(int16_t*)&num_fin_128[0]);
+          // pmi
+#if defined(__x86_64__) || defined(__i386__)
+
+          pmi128_re = _mm_xor_si128(pmi128_re,pmi128_re);
+          pmi128_im = _mm_xor_si128(pmi128_im,pmi128_im);
+#elif defined(__arm__)
+
+          pmi128_re = vdupq_n_s32(0);
+          pmi128_im = vdupq_n_s32(0);
 #endif
+          // limit is the number of groups of 4 REs in a subband (12 = 4 RBs, 3 = 1 RB)
+          // for 5 MHz channelization, there are 7 subbands, 6 of size 4 RBs and 1 of size 1 RB
+          if ((N_RB_DL==6) || (subband<(nb_subbands-1)))
+            limit = subband_size>>2;
+          else
+            limit = last_subband_size>>2;
 
-    num_fin_128+=1;
-    h_h_00_sq_128+=1;
-    h_h_01_sq_128+=1;
-    h_h_10_sq_128+=1;
-    h_h_11_sq_128+=1;
-  }
-  _mm_empty();
-  _m_empty();
-}
+          for (i=0; i<limit; i++) {
 
+#if defined(__x86_64__) || defined(__i386__)
+              mmtmpPMI0 = _mm_xor_si128(mmtmpPMI0,mmtmpPMI0);
+              mmtmpPMI1 = _mm_xor_si128(mmtmpPMI1,mmtmpPMI1);
 
+            // For each RE in subband perform ch0 * conj(ch1)
+            // multiply by conjugated channel
+                //  print_ints("ch0",&dl_ch0_128[0]);
+                //  print_ints("ch1",&dl_ch1_128[0]);
 
+            mmtmpPMI0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch1_128[0]);
+                 //  print_ints("re",&mmtmpPMI0);
+            mmtmpPMI1 = _mm_shufflelo_epi16(dl_ch1_128[0],_MM_SHUFFLE(2,3,0,1));
+              //  print_ints("_mm_shufflelo_epi16",&mmtmpPMI1);
+            mmtmpPMI1 = _mm_shufflehi_epi16(mmtmpPMI1,_MM_SHUFFLE(2,3,0,1));
+                //  print_ints("_mm_shufflehi_epi16",&mmtmpPMI1);
+            mmtmpPMI1 = _mm_sign_epi16(mmtmpPMI1,*(__m128i*)&conjugate[0]);
+               //  print_ints("_mm_sign_epi16",&mmtmpPMI1);
+            mmtmpPMI1 = _mm_madd_epi16(mmtmpPMI1,dl_ch0_128[0]);
+               //   print_ints("mm_madd_epi16",&mmtmpPMI1);
+            // mmtmpPMI1 contains imag part of 4 consecutive outputs (32-bit)
+            pmi128_re = _mm_add_epi32(pmi128_re,mmtmpPMI0);
+             //   print_ints(" pmi128_re 0",&pmi128_re);
+            pmi128_im = _mm_add_epi32(pmi128_im,mmtmpPMI1);
+               //   print_ints(" pmi128_im 0 ",&pmi128_im);
 
+          /*  mmtmpPMI0 = _mm_xor_si128(mmtmpPMI0,mmtmpPMI0);
+            mmtmpPMI1 = _mm_xor_si128(mmtmpPMI1,mmtmpPMI1);
 
-void dlsch_channel_level_TM34_meas(int *ch00,
-                                   int *ch01,
-                                   int *ch10,
-                                   int *ch11,
-                                   int *avg_0,
-                                   int *avg_1,
-                                   unsigned short nb_rb)
-{
+            mmtmpPMI0 = _mm_madd_epi16(dl_ch0_128[1],dl_ch1_128[1]);
+                 //  print_ints("re",&mmtmpPMI0);
+            mmtmpPMI1 = _mm_shufflelo_epi16(dl_ch1_128[1],_MM_SHUFFLE(2,3,0,1));
+              //  print_ints("_mm_shufflelo_epi16",&mmtmpPMI1);
+            mmtmpPMI1 = _mm_shufflehi_epi16(mmtmpPMI1,_MM_SHUFFLE(2,3,0,1));
+                //  print_ints("_mm_shufflehi_epi16",&mmtmpPMI1);
+            mmtmpPMI1 = _mm_sign_epi16(mmtmpPMI1,*(__m128i*)&conjugate);
+               //  print_ints("_mm_sign_epi16",&mmtmpPMI1);
+            mmtmpPMI1 = _mm_madd_epi16(mmtmpPMI1,dl_ch0_128[1]);
+               //   print_ints("mm_madd_epi16",&mmtmpPMI1);
+            // mmtmpPMI1 contains imag part of 4 consecutive outputs (32-bit)
+            pmi128_re = _mm_add_epi32(pmi128_re,mmtmpPMI0);
+                //  print_ints(" pmi128_re 1",&pmi128_re);
+            pmi128_im = _mm_add_epi32(pmi128_im,mmtmpPMI1);
+            //print_ints(" pmi128_im 1 ",&pmi128_im);*/
 
-#if defined(__x86_64__)||defined(__i386__)
+#elif defined(__arm__)
 
-  short rb;
-  unsigned char nre=12;
-  __m128i *ch00_128, *ch01_128, *ch10_128, *ch11_128;
-  __m128i avg_0_row0_128D, avg_1_row0_128D, avg_0_row1_128D, avg_1_row1_128D;
-  __m128i ch00_128_tmp, ch01_128_tmp, ch10_128_tmp, ch11_128_tmp;
+            mmtmpPMI0 = vmull_s16(((int16x4_t*)dl_ch0_128)[0], ((int16x4_t*)dl_ch1_128)[0]);
+            mmtmpPMI1 = vmull_s16(((int16x4_t*)dl_ch0_128)[1], ((int16x4_t*)dl_ch1_128)[1]);
+            pmi128_re = vqaddq_s32(pmi128_re,vcombine_s32(vpadd_s32(vget_low_s32(mmtmpPMI0),vget_high_s32(mmtmpPMI0)),vpadd_s32(vget_low_s32(mmtmpPMI1),vget_high_s32(mmtmpPMI1))));
 
-  avg_0[0] = 0;
-  avg_0[1] = 0;
-  avg_1[0] = 0;
-  avg_1[1] = 0;
+            mmtmpPMI0b = vmull_s16(vrev32_s16(vmul_s16(((int16x4_t*)dl_ch0_128)[0],*(int16x4_t*)conjugate)), ((int16x4_t*)dl_ch1_128)[0]);
+            mmtmpPMI1b = vmull_s16(vrev32_s16(vmul_s16(((int16x4_t*)dl_ch0_128)[1],*(int16x4_t*)conjugate)), ((int16x4_t*)dl_ch1_128)[1]);
+            pmi128_im = vqaddq_s32(pmi128_im,vcombine_s32(vpadd_s32(vget_low_s32(mmtmpPMI0b),vget_high_s32(mmtmpPMI0b)),vpadd_s32(vget_low_s32(mmtmpPMI1b),vget_high_s32(mmtmpPMI1b))));
 
-  ch00_128 = (__m128i *)ch00;
-  ch01_128 = (__m128i *)ch01;
-  ch10_128 = (__m128i *)ch10;
-  ch11_128 = (__m128i *)ch11;
+#endif
+            dl_ch0_128++;
+            dl_ch1_128++;
+          }
 
-  avg_0_row0_128D = _mm_setzero_si128();
-  avg_1_row0_128D = _mm_setzero_si128();
-  avg_0_row1_128D = _mm_setzero_si128();
-  avg_1_row1_128D = _mm_setzero_si128();
+          ue->measurements.subband_pmi_re[eNB_id][subband][aarx] = (((int *)&pmi128_re)[0] + ((int *)&pmi128_re)[1] + ((int *)&pmi128_re)[2] + ((int *)&pmi128_re)[3])>>2;
+          ue->measurements.subband_pmi_im[eNB_id][subband][aarx] = (((int *)&pmi128_im)[0] + ((int *)&pmi128_im)[1] + ((int *)&pmi128_im)[2] + ((int *)&pmi128_im)[3])>>2;
+          ue->measurements.wideband_pmi_re[eNB_id][aarx] += ue->measurements.subband_pmi_re[eNB_id][subband][aarx];
+          ue->measurements.wideband_pmi_im[eNB_id][aarx] += ue->measurements.subband_pmi_im[eNB_id][subband][aarx];
+        } // subband loop
+      } // rx antenna loop
+    }  // if frame_parms->mode1_flag == 0
+    else {
+      // cqi information only for mode 1
+      for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
+        dl_ch0    = &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4];
 
-  for (rb=0; rb<3*nb_rb; rb++) {
-    ch00_128_tmp = _mm_load_si128(&ch00_128[0]);
-    ch01_128_tmp = _mm_load_si128(&ch01_128[0]);
-    ch10_128_tmp = _mm_load_si128(&ch10_128[0]);
-    ch11_128_tmp = _mm_load_si128(&ch11_128[0]);
+        for (subband=0; subband<7; subband++) {
 
-    avg_0_row0_128D = _mm_add_epi32(avg_0_row0_128D,_mm_madd_epi16(ch00_128_tmp,ch00_128_tmp));
-    avg_1_row0_128D = _mm_add_epi32(avg_1_row0_128D,_mm_madd_epi16(ch01_128_tmp,ch01_128_tmp));
-    avg_0_row1_128D = _mm_add_epi32(avg_0_row1_128D,_mm_madd_epi16(ch10_128_tmp,ch10_128_tmp));
-    avg_1_row1_128D = _mm_add_epi32(avg_1_row1_128D,_mm_madd_epi16(ch11_128_tmp,ch11_128_tmp));
+          // cqi
+          if (aarx==0)
+            ue->measurements.subband_cqi_tot[eNB_id][subband]=0;
 
-    ch00_128+=1;
-    ch01_128+=1;
-    ch10_128+=1;
-    ch11_128+=1;
-  }
+          if (subband<6) {
+            //      for (i=0;i<48;i++)
+            //        printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
+            ue->measurements.subband_cqi[eNB_id][aarx][subband] =
+              (signal_energy_nodc(dl_ch0,48) ) - ue->measurements.n0_power[aarx];
 
-  avg_0[0] = (((int*)&avg_0_row0_128D)[0])/(nb_rb*nre) +
-           (((int*)&avg_0_row0_128D)[1])/(nb_rb*nre) +
-           (((int*)&avg_0_row0_128D)[2])/(nb_rb*nre) +
-           (((int*)&avg_0_row0_128D)[3])/(nb_rb*nre);
+            ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
+            ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
+                ue->measurements.n0_power[aarx]);
+          } else {
+            //      for (i=0;i<12;i++)
+            //        printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
+            ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) ) - ue->measurements.n0_power[aarx];
+            ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband];
+            ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband],
+                ue->measurements.n0_power[aarx]);
+          }
 
-  avg_1[0] = (((int*)&avg_1_row0_128D)[0])/(nb_rb*nre) +
-           (((int*)&avg_1_row0_128D)[1])/(nb_rb*nre) +
-           (((int*)&avg_1_row0_128D)[2])/(nb_rb*nre) +
-           (((int*)&avg_1_row0_128D)[3])/(nb_rb*nre);
+          dl_ch1+=48;
+          //    msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,ue->measurements.subband_cqi[eNB_id][aarx][subband],ue->measurements.subband_cqi_dB[eNB_id][aarx][subband]);
+        }
+      }
 
-  avg_0[1] = (((int*)&avg_0_row1_128D)[0])/(nb_rb*nre) +
-           (((int*)&avg_0_row1_128D)[1])/(nb_rb*nre) +
-           (((int*)&avg_0_row1_128D)[2])/(nb_rb*nre) +
-           (((int*)&avg_0_row1_128D)[3])/(nb_rb*nre);
+      for (subband=0; subband<nb_subbands; subband++) {
+        ue->measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(ue->measurements.subband_cqi_tot[eNB_id][subband],ue->measurements.n0_power_tot);
+      }
+    }
 
-  avg_1[1] = (((int*)&avg_1_row1_128D)[0])/(nb_rb*nre) +
-           (((int*)&avg_1_row1_128D)[1])/(nb_rb*nre) +
-           (((int*)&avg_1_row1_128D)[2])/(nb_rb*nre) +
-           (((int*)&avg_1_row1_128D)[3])/(nb_rb*nre);
+    //ue->measurements.rank[eNB_id] = 0;
 
-  avg_0[0] = avg_0[0] + avg_0[1];
-  avg_1[0] = avg_1[0] + avg_1[1];
-  avg_0[0] = min (avg_0[0], avg_1[0]);
-  avg_1[0] = avg_0[0];
+    for (i=0; i<nb_subbands; i++) {
+      ue->measurements.selected_rx_antennas[eNB_id][i] = 0;
+
+      if (frame_parms->nb_antennas_rx>1) {
+        if (ue->measurements.subband_cqi_dB[eNB_id][0][i] >= ue->measurements.subband_cqi_dB[eNB_id][1][i])
+          ue->measurements.selected_rx_antennas[eNB_id][i] = 0;
+        else
+          ue->measurements.selected_rx_antennas[eNB_id][i] = 1;
+      } else
+        ue->measurements.selected_rx_antennas[eNB_id][i] = 0;
+    }
 
+    // if(eNB_id==0)
+    // printf("in lte_ue_measurements: selected rx_antenna[eNB_id==0]:%u\n", ue->measurements.selected_rx_antennas[eNB_id][i]);
+  }  // eNB_id loop
+
+#if defined(__x86_64__) || defined(__i386__)
   _mm_empty();
   _m_empty();
+#endif
+}
 
-#elif defined(__arm__)
 
-#endif
+void lte_ue_measurements_emul(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id)
+{
+
+  LOG_D(PHY,"EMUL UE lte_ue_measurements_emul subframe %d, eNB_id %d\n",subframe,eNB_id);
 }
+
+
+
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
index 9ef23f23d0..3c5d3c78ef 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
@@ -19,13 +19,14 @@
  *      contact@openairinterface.org
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
 #include "PHY/sse_intrin.h"
 //#define DEBUG_CH
 #include "UTIL/LOG/log.h"
-
+#include "PHY/LTE_TRANSPORT/transport_common_proto.h"
 #include "T.h"
+#include "lte_estimation_defs.h"
 
 // round(exp(sqrt(-1)*(pi/2)*[0:1:N-1]/N)*pow2(15))
 static int16_t ru_90[2*128] = {32767, 0,32766, 402,32758, 804,32746, 1206,32729, 1608,32706, 2009,32679, 2411,32647, 2811,32610, 3212,32568, 3612,32522, 4011,32470, 4410,32413, 4808,32352, 5205,32286, 5602,32214, 5998,32138, 6393,32058, 6787,31972, 7180,31881, 7571,31786, 7962,31686, 8351,31581, 8740,31471, 9127,31357, 9512,31238, 9896,31114, 10279,30986, 10660,30853, 11039,30715, 11417,30572, 11793,30425, 12167,30274, 12540,30118, 12910,29957, 13279,29792, 13646,29622, 14010,29448, 14373,29269, 14733,29086, 15091,28899, 15447,28707, 15800,28511, 16151,28311, 16500,28106, 16846,27897, 17190,27684, 17531,27467, 17869,27246, 18205,27020, 18538,26791, 18868,26557, 19195,26320, 19520,26078, 19841,25833, 20160,25583, 20475,25330, 20788,25073, 21097,24812, 21403,24548, 21706,24279, 22006,24008, 22302,23732, 22595,23453, 22884,23170, 23170,22884, 23453,22595, 23732,22302, 24008,22006, 24279,21706, 24548,21403, 24812,21097, 25073,20788, 25330,20475, 25583,20160, 25833,19841, 26078,19520, 26320,19195, 26557,18868, 26791,18538, 27020,18205, 27246,17869, 27467,17531, 27684,17190, 27897,16846, 28106,16500, 28311,16151, 28511,15800, 28707,15447, 28899,15091, 29086,14733, 29269,14373, 29448,14010, 29622,13646, 29792,13279, 29957,12910, 30118,12540, 30274,12167, 30425,11793, 30572,11417, 30715,11039, 30853,10660, 30986,10279, 31114,9896, 31238,9512, 31357,9127, 31471,8740, 31581,8351, 31686,7962, 31786,7571, 31881,7180, 31972,6787, 32058,6393, 32138,5998, 32214,5602, 32286,5205, 32352,4808, 32413,4410, 32470,4011, 32522,3612, 32568,3212, 32610,2811, 32647,2411, 32679,2009, 32706,1608, 32729,1206, 32746,804, 32758,402, 32766};
diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c
index 5bf69578d1..56d8aaf1df 100644
--- a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c
+++ b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c
@@ -22,8 +22,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "defs.h"
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
+#include "PHY/impl_defs_top.h"
 
 //extern unsigned int lte_gold_table[3][20][2][14];
 //#define DEBUG_DL_CELL_SPEC
diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c
index 35e5fe6aff..54f52ef40b 100644
--- a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c
+++ b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c
@@ -24,8 +24,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "defs.h"
-#include "PHY/defs.h"
+#include "lte_refsig.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
+#include "PHY/impl_defs_top.h"
 
 //extern unsigned int lte_gold_table[10][3][42];
 //#define DEBUG_DL_MBSFN
diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c
index a7db8fd5aa..fc03299f2b 100644
--- a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c
+++ b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c
@@ -33,9 +33,11 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "defs.h"
-#include "PHY/defs.h"
+#include "lte_refsig.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
 #include "log.h"
+#include "PHY/impl_defs_top.h"
 
 //extern unsigned int lte_gold_table[3][20][2][14];
 //#define DEBUG_DL_CELL_SPEC
diff --git a/openair1/PHY/LTE_REFSIG/lte_gold.c b/openair1/PHY/LTE_REFSIG/lte_gold.c
index c3a3f42456..78fae8b8f3 100644
--- a/openair1/PHY/LTE_REFSIG/lte_gold.c
+++ b/openair1/PHY/LTE_REFSIG/lte_gold.c
@@ -19,7 +19,7 @@
  *      contact@openairinterface.org
  */
 
-#include "defs.h"
+#include "lte_refsig.h"
 
 
 /* c(n) = x1(n+Nc) + x2(n+Nc) mod 2
diff --git a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c
index 66d7fa8fb2..14def309b7 100644
--- a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c
+++ b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c
@@ -42,7 +42,7 @@
    //unsigned int lte_gold_table[10][3][42];  // need 165 bytes for sequence
    //slot index x pilot within slot x sequence*/
 
-#include "defs.h"
+#include "lte_refsig.h"
 
 void lte_gold_mbsfn(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_mbsfn_table[10][3][42],uint16_t Nid_mbsfn)
 {
diff --git a/openair1/PHY/LTE_REFSIG/defs.h b/openair1/PHY/LTE_REFSIG/lte_refsig.h
similarity index 99%
rename from openair1/PHY/LTE_REFSIG/defs.h
rename to openair1/PHY/LTE_REFSIG/lte_refsig.h
index 838406b444..27788e5e1a 100644
--- a/openair1/PHY/LTE_REFSIG/defs.h
+++ b/openair1/PHY/LTE_REFSIG/lte_refsig.h
@@ -23,7 +23,8 @@
 /* Author R. Knopp / EURECOM / OpenAirInterface.org */
 #ifndef __LTE_REFSIG_DEFS__H__
 #define __LTE_REFSIG_DEFS__H__
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
 
 /** @ingroup _PHY_REF_SIG
  * @{
diff --git a/openair1/PHY/LTE_REFSIG/lte_ul_ref.c b/openair1/PHY/LTE_REFSIG/lte_ul_ref.c
index 93ca7646e6..a0251e4dd3 100644
--- a/openair1/PHY/LTE_REFSIG/lte_ul_ref.c
+++ b/openair1/PHY/LTE_REFSIG/lte_ul_ref.c
@@ -24,7 +24,7 @@
 #include <stdlib.h>
 #include <math.h>
 #endif
-#include "defs.h"
+#include "lte_refsig.h"
 
 uint16_t dftsizes[33] = {12,24,36,48,60,72,96,108,120,144,180,192,216,240,288,300,324,360,384,432,480,540,576,600,648,720,864,900,960,972,1080,1152,1200};
 
diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c
index 0c39ad6cc4..8c2496430e 100755
--- a/openair1/PHY/LTE_TRANSPORT/dci.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci.c
@@ -32,16 +32,18 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "SIMULATION/TOOLS/defs.h" // for taus
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "SCHED/sched_eNB.h"
+#include "SIMULATION/TOOLS/sim.h" // for taus
 #include "PHY/sse_intrin.h"
-
+#include "transport_proto.h"
+#include "transport_common_proto.h"
 #include "assertions.h"
 #include "T.h"
 #include "UTIL/LOG/log.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
+#include "PHY/LTE_TRANSPORT/transport_extern.h"
 
 //#define DEBUG_DCI_ENCODING 1
 //#define DEBUG_DCI_DECODING 1
@@ -52,65 +54,7 @@
 //extern uint16_t phich_reg[MAX_NUM_PHICH_GROUPS][3];
 //extern uint16_t pcfich_reg[4];
 
-uint32_t check_phich_reg(LTE_DL_FRAME_PARMS *frame_parms,uint32_t kprime,uint8_t lprime,uint8_t mi)
-{
-
-  uint16_t i;
-  uint16_t Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
-  uint16_t mprime;
-  uint16_t *pcfich_reg = frame_parms->pcfich_reg;
-
-  if ((lprime>0) && (frame_parms->Ncp==0) )
-    return(0);
-
-  //  printf("check_phich_reg : mi %d\n",mi);
-
-  // compute REG based on symbol
-  if ((lprime == 0)||
-      ((lprime==1)&&(frame_parms->nb_antenna_ports_eNB == 4)))
-    mprime = kprime/6;
-  else
-    mprime = kprime>>2;
-
-  // check if PCFICH uses mprime
-  if ((lprime==0) &&
-      ((mprime == pcfich_reg[0]) ||
-       (mprime == pcfich_reg[1]) ||
-       (mprime == pcfich_reg[2]) ||
-       (mprime == pcfich_reg[3]))) {
-#ifdef DEBUG_DCI_ENCODING
-    printf("[PHY] REG %d allocated to PCFICH\n",mprime);
-#endif
-    return(1);
-  }
-
-  // handle Special subframe case for TDD !!!
-
-  //  printf("Checking phich_reg %d\n",mprime);
-  if (mi > 0) {
-    if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
-      Ngroup_PHICH++;
 
-    if (frame_parms->Ncp == 1) {
-      Ngroup_PHICH<<=1;
-    }
-
-
-
-    for (i=0; i<Ngroup_PHICH; i++) {
-      if ((mprime == frame_parms->phich_reg[i][0]) ||
-          (mprime == frame_parms->phich_reg[i][1]) ||
-          (mprime == frame_parms->phich_reg[i][2]))  {
-#ifdef DEBUG_DCI_ENCODING
-        printf("[PHY] REG %d (lprime %d) allocated to PHICH\n",mprime,lprime);
-#endif
-        return(1);
-      }
-    }
-  }
-
-  return(0);
-}
 
 static uint8_t d[3*(MAX_DCI_SIZE_BITS + 16) + 96];
 static uint8_t w[3*3*(MAX_DCI_SIZE_BITS+16)];
@@ -226,15 +170,10 @@ uint8_t *generate_dci0(uint8_t *dci,
 
 uint32_t Y;
 
-#define CCEBITS 72
-#define CCEPERSYMBOL 33  // This is for 1200 RE
-#define CCEPERSYMBOL0 22  // This is for 1200 RE
-#define DCI_BITS_MAX ((2*CCEPERSYMBOL+CCEPERSYMBOL0)*CCEBITS)
-#define Msymb (DCI_BITS_MAX/2)
-//#define Mquad (Msymb/4)
 
-static uint32_t bitrev_cc_dci[32] = {1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31,0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30};
-static int32_t wtemp[2][Msymb];
+
+
+
 
 void pdcch_interleaving(LTE_DL_FRAME_PARMS *frame_parms,int32_t **z, int32_t **wbar,uint8_t n_symbols_pdcch,uint8_t mi)
 {
@@ -247,6 +186,8 @@ void pdcch_interleaving(LTE_DL_FRAME_PARMS *frame_parms,int32_t **z, int32_t **w
 #ifdef RM_DEBUG
   int32_t nulled=0;
 #endif
+  uint32_t Msymb=(DCI_BITS_MAX/2);
+  int32_t wtemp[2][Msymb];
 
   //  printf("[PHY] PDCCH Interleaving Mquad %d (Nsymb %d)\n",Mquad,n_symbols_pdcch);
   if ((Mquad&0x1f) > 0)
@@ -347,8 +288,9 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols,
   uint32_t gain_lin_QPSK,kprime,kprime_mod12,mprime,nsymb,symbol_offset,tti_offset;
   int16_t re_offset;
   uint8_t mi = get_mi(frame_parms,subframe);
-  static uint8_t e[DCI_BITS_MAX];
-  static int32_t yseq0[Msymb],yseq1[Msymb],wbar0[Msymb],wbar1[Msymb];
+  uint8_t e[DCI_BITS_MAX];
+  uint32_t Msymb=(DCI_BITS_MAX/2);
+  int32_t yseq0[Msymb],yseq1[Msymb],wbar0[Msymb],wbar1[Msymb];
 
   int32_t *y[2];
   int32_t *wbar[2];
@@ -676,58 +618,3 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols,
 }
 
 
-uint16_t get_nCCE(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi)
-{
-  return(get_nquad(num_pdcch_symbols,frame_parms,mi)/9);
-}
-
-uint16_t get_nquad(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi)
-{
-
-  uint16_t Nreg=0;
-  uint8_t Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
-
-  if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
-    Ngroup_PHICH++;
-
-  if (frame_parms->Ncp == 1) {
-    Ngroup_PHICH<<=1;
-  }
-
-  Ngroup_PHICH*=mi;
-
-  if ((num_pdcch_symbols>0) && (num_pdcch_symbols<4))
-    switch (frame_parms->N_RB_DL) {
-    case 6:
-      Nreg=12+(num_pdcch_symbols-1)*18;
-      break;
-
-    case 25:
-      Nreg=50+(num_pdcch_symbols-1)*75;
-      break;
-
-    case 50:
-      Nreg=100+(num_pdcch_symbols-1)*150;
-      break;
-
-    case 100:
-      Nreg=200+(num_pdcch_symbols-1)*300;
-      break;
-
-    default:
-      return(0);
-    }
-
-  //   printf("Nreg %d (%d)\n",Nreg,Nreg - 4 - (3*Ngroup_PHICH));
-  return(Nreg - 4 - (3*Ngroup_PHICH));
-}
-
-uint16_t get_nCCE_mac(uint8_t Mod_id,uint8_t CC_id,int num_pdcch_symbols,int subframe)
-{
-
-  // check for eNB only !
-  return(get_nCCE(num_pdcch_symbols,
-		  &RC.eNB[Mod_id][CC_id]->frame_parms,
-		  get_mi(&RC.eNB[Mod_id][CC_id]->frame_parms,subframe)));
-}
-
diff --git a/openair1/PHY/LTE_TRANSPORT/dci.h b/openair1/PHY/LTE_TRANSPORT/dci.h
index d7dd907e77..c5654aa742 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci.h
+++ b/openair1/PHY/LTE_TRANSPORT/dci.h
@@ -35,6 +35,13 @@
 
 #include <stdint.h>
 
+#define CCEBITS 72
+#define CCEPERSYMBOL 33  // This is for 1200 RE
+#define CCEPERSYMBOL0 22  // This is for 1200 RE
+#define DCI_BITS_MAX ((2*CCEPERSYMBOL+CCEPERSYMBOL0)*CCEBITS)
+
+//#define Mquad (Msymb/4)
+
 ///  DCI Format Type 0 (5 MHz,TDD0, 27 bits)
 struct DCI0_5MHz_TDD0 {
   /// type = 0 => DCI Format 0, type = 1 => DCI Format 1A
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index 4b73de6fcc..3f51b97904 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -30,775 +30,22 @@
  * \warning
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "SCHED/sched_eNB.h"
 #ifdef DEBUG_DCI_TOOLS
-#include "PHY/vars.h"
+#include "PHY/phy_vars.h"
 #endif
 #include "assertions.h"
 #include "nfapi_interface.h"
 
 //#define DEBUG_HARQ
 
-#include "LAYER2/MAC/extern.h"
-#include "LAYER2/MAC/defs.h"
 
-//#define DEBUG_DCI
-
-uint32_t localRIV2alloc_LUT6[32];
-uint32_t distRIV2alloc_even_LUT6[32];
-uint32_t distRIV2alloc_odd_LUT6[32];
-uint16_t RIV2nb_rb_LUT6[32];
-uint16_t RIV2first_rb_LUT6[32];
-uint16_t RIV_max6=0;
-
-uint32_t localRIV2alloc_LUT25[512];
-uint32_t distRIV2alloc_even_LUT25[512];
-uint32_t distRIV2alloc_odd_LUT25[512];
-uint16_t RIV2nb_rb_LUT25[512];
-uint16_t RIV2first_rb_LUT25[512];
-uint16_t RIV_max25=0;
-
-
-uint32_t localRIV2alloc_LUT50_0[1600];
-uint32_t localRIV2alloc_LUT50_1[1600];
-uint32_t distRIV2alloc_gap0_even_LUT50_0[1600];
-uint32_t distRIV2alloc_gap0_odd_LUT50_0[1600];
-uint32_t distRIV2alloc_gap0_even_LUT50_1[1600];
-uint32_t distRIV2alloc_gap0_odd_LUT50_1[1600];
-uint32_t distRIV2alloc_gap1_even_LUT50_0[1600];
-uint32_t distRIV2alloc_gap1_odd_LUT50_0[1600];
-uint32_t distRIV2alloc_gap1_even_LUT50_1[1600];
-uint32_t distRIV2alloc_gap1_odd_LUT50_1[1600];
-uint16_t RIV2nb_rb_LUT50[1600];
-uint16_t RIV2first_rb_LUT50[1600];
-uint16_t RIV_max50=0;
-
-uint32_t localRIV2alloc_LUT100_0[6000];
-uint32_t localRIV2alloc_LUT100_1[6000];
-uint32_t localRIV2alloc_LUT100_2[6000];
-uint32_t localRIV2alloc_LUT100_3[6000];
-uint32_t distRIV2alloc_gap0_even_LUT100_0[6000];
-uint32_t distRIV2alloc_gap0_odd_LUT100_0[6000];
-uint32_t distRIV2alloc_gap0_even_LUT100_1[6000];
-uint32_t distRIV2alloc_gap0_odd_LUT100_1[6000];
-uint32_t distRIV2alloc_gap0_even_LUT100_2[6000];
-uint32_t distRIV2alloc_gap0_odd_LUT100_2[6000];
-uint32_t distRIV2alloc_gap0_even_LUT100_3[6000];
-uint32_t distRIV2alloc_gap0_odd_LUT100_3[6000];
-uint32_t distRIV2alloc_gap1_even_LUT100_0[6000];
-uint32_t distRIV2alloc_gap1_odd_LUT100_0[6000];
-uint32_t distRIV2alloc_gap1_even_LUT100_1[6000];
-uint32_t distRIV2alloc_gap1_odd_LUT100_1[6000];
-uint32_t distRIV2alloc_gap1_even_LUT100_2[6000];
-uint32_t distRIV2alloc_gap1_odd_LUT100_2[6000];
-uint32_t distRIV2alloc_gap1_even_LUT100_3[6000];
-uint32_t distRIV2alloc_gap1_odd_LUT100_3[6000];
-uint16_t RIV2nb_rb_LUT100[6000];
-uint16_t RIV2first_rb_LUT100[6000];
-uint16_t RIV_max100=0;
-
-
-extern uint32_t current_dlsch_cqi;
-
-// Table 8.6.3-3 36.213
-uint16_t beta_cqi[16] = {0,   //reserved
-                         0,   //reserved
-                         9,   //1.125
-                         10,  //1.250
-                         11,  //1.375
-                         13,  //1.625
-                         14,  //1.750
-                         16,  //2.000
-                         18,  //2.250
-                         20,  //2.500
-                         23,  //2.875
-                         25,  //3.125
-                         28,  //3.500
-                         32,  //4.000
-                         40,  //5.000
-                         50
-                        }; //6.250
-
-// Table 8.6.3-2 36.213
-uint16_t beta_ri[16] = {10,   //1.250
-                        13,   //1.625
-                        16,   //2.000
-                        20,   //2.500
-                        25,   //3.125
-                        32,   //4.000
-                        40,   //5.000
-                        50,   //6.250
-                        64,   //8.000
-                        80,   //10.000
-                        101,  //12.625
-                        127,  //15.875
-                        160,  //20.000
-                        0,    //reserved
-                        0,    //reserved
-                        0
-                       };   //reserved
-
-// Table 8.6.3-2 36.213
-uint16_t beta_ack[16] = {16,  //2.000
-                         20,  //2.500
-                         25,  //3.125
-                         32,  //4.000
-                         40,  //5.000
-                         50,  //6.250
-                         64,  //8.000
-                         80,  //10.000
-                         101, //12.625
-                         127, //15.875
-                         160, //20.000
-                         248, //31.000
-                         400, //50.000
-                         640, //80.000
-                         808
-                        };//126.00
-
-int8_t delta_PUSCH_abs[4] = {-4,-1,1,4};
-int8_t delta_PUSCH_acc[4] = {-1,0,1,3};
-
-int8_t *delta_PUCCH_lut = delta_PUSCH_acc;
-
-void conv_eMTC_rballoc(uint16_t resource_block_coding,
-		       uint32_t N_RB_DL,
-		       uint32_t *rb_alloc) {
-
-   
-  int narrowband = resource_block_coding>>5;
-  int RIV        = resource_block_coding&31;
-  int N_NB_DL    = N_RB_DL/6;
-  int i0         = (N_RB_DL>>1) - (3*N_NB_DL);
-  int first_rb   = (6*narrowband)+i0;
-  int alloc      = localRIV2alloc_LUT6[RIV];
-  int ind        = first_rb>>5;
-  int ind_mod    = first_rb&31;
-
-  if (((N_RB_DL&1) > 0) && (narrowband>=(N_NB_DL>>1))) first_rb++;
-  rb_alloc[0]                        = 0;
-  rb_alloc[1]                        = 0;
-  rb_alloc[2]                        = 0;
-  rb_alloc[3]                        = 0;
-  rb_alloc[ind]                      = alloc<<ind_mod;
-  if (ind_mod > 26)  rb_alloc[ind+1] = alloc>>(6-(ind_mod-26)); 
-}
-
-void conv_rballoc(uint8_t ra_header,uint32_t rb_alloc,uint32_t N_RB_DL,uint32_t *rb_alloc2)
-{
-
-  uint32_t i,shift,subset;
-  rb_alloc2[0] = 0;
-  rb_alloc2[1] = 0;
-  rb_alloc2[2] = 0;
-  rb_alloc2[3] = 0;
-
-  //  printf("N_RB_DL %d, ra_header %d, rb_alloc %x\n",N_RB_DL,ra_header,rb_alloc);
-
-  switch (N_RB_DL) {
-
-  case 6:
-    rb_alloc2[0] = rb_alloc&0x3f;
-    break;
-
-  case 25:
-    if (ra_header == 0) {// Type 0 Allocation
-
-      for (i=12; i>0; i--) {
-        if ((rb_alloc&(1<<i)) != 0)
-          rb_alloc2[0] |= (3<<((2*(12-i))));
-
-        //      printf("rb_alloc2 (type 0) %x\n",rb_alloc2);
-      }
-
-      if ((rb_alloc&1) != 0)
-        rb_alloc2[0] |= (1<<24);
-    } else {
-      subset = rb_alloc&1;
-      shift  = (rb_alloc>>1)&1;
-
-      for (i=0; i<11; i++) {
-        if ((rb_alloc&(1<<(i+2))) != 0)
-          rb_alloc2[0] |= (1<<(2*i));
-
-        //printf("rb_alloc2 (type 1) %x\n",rb_alloc2);
-      }
-
-      if ((shift == 0) && (subset == 1))
-        rb_alloc2[0]<<=1;
-      else if ((shift == 1) && (subset == 0))
-        rb_alloc2[0]<<=4;
-      else if ((shift == 1) && (subset == 1))
-        rb_alloc2[0]<<=3;
-    }
-
-    break;
-
-  case 50:
-    AssertFatal(ra_header==0,"resource type 1 not supported for  N_RB_DL=50\n");
-
-    for (i=16; i>0; i--) {
-      if ((rb_alloc&(1<<i)) != 0)
-	rb_alloc2[(3*(16-i))>>5] |= (7<<((3*(16-i))%32));
-    }
-
-    // bit mask across
-    if ((rb_alloc2[0]>>31)==1)
-      rb_alloc2[1] |= 1;
-    
-    if ((rb_alloc&1) != 0)
-      rb_alloc2[1] |= (3<<16);
-    break;
-
-  case 100:
-    AssertFatal(ra_header==0,"resource type 1 not supported for  N_RB_DL=100\n");
-    for (i=0; i<25; i++) {
-      if ((rb_alloc&(1<<(24-i))) != 0)
-	rb_alloc2[(4*i)>>5] |= (0xf<<((4*i)%32));
-      
-      //  printf("rb_alloc2[%d] (type 0) %x (%d)\n",(4*i)>>5,rb_alloc2[(4*i)>>5],rb_alloc&(1<<i));
-    }
-
-    break;
-
-  default:
-    LOG_E(PHY,"Invalid N_RB_DL %d\n", N_RB_DL);
-    DevParam (N_RB_DL, 0, 0);
-    break;
-  }
-
-}
-
-
-
-uint32_t conv_nprb(uint8_t ra_header,uint32_t rb_alloc,int N_RB_DL)
-{
-
-  uint32_t nprb=0,i;
-
-  switch (N_RB_DL) {
-  case 6:
-    for (i=0; i<6; i++) {
-      if ((rb_alloc&(1<<i)) != 0)
-        nprb += 1;
-    }
-
-    break;
-
-  case 25:
-    if (ra_header == 0) {// Type 0 Allocation
-
-      for (i=12; i>0; i--) {
-        if ((rb_alloc&(1<<i)) != 0)
-          nprb += 2;
-      }
-
-      if ((rb_alloc&1) != 0)
-        nprb += 1;
-    } else {
-      for (i=0; i<11; i++) {
-        if ((rb_alloc&(1<<(i+2))) != 0)
-          nprb += 1;
-      }
-    }
-
-    break;
-
-  case 50:
-    if (ra_header == 0) {// Type 0 Allocation
-
-      for (i=0; i<16; i++) {
-        if ((rb_alloc&(1<<(16-i))) != 0)
-          nprb += 3;
-      }
-
-      if ((rb_alloc&1) != 0)
-        nprb += 2;
-
-    } else {
-      for (i=0; i<17; i++) {
-        if ((rb_alloc&(1<<(i+2))) != 0)
-          nprb += 1;
-      }
-    }
-
-    break;
-
-  case 100:
-    if (ra_header == 0) {// Type 0 Allocation
-
-      for (i=0; i<25; i++) {
-        if ((rb_alloc&(1<<(24-i))) != 0)
-          nprb += 4;
-      }
-    } else {
-      for (i=0; i<25; i++) {
-        if ((rb_alloc&(1<<(i+2))) != 0)
-          nprb += 1;
-      }
-    }
-
-    break;
-
-  default:
-    LOG_E(PHY,"Invalide N_RB_DL %d\n", N_RB_DL);
-    DevParam (N_RB_DL, 0, 0);
-    break;
-  }
-
-  return(nprb);
-}
-
-uint16_t computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs)
-{
-
-  uint16_t RIV;
-
-  if (Lcrbs<=(1+(N_RB_DL>>1)))
-    RIV = (N_RB_DL*(Lcrbs-1)) + RBstart;
-  else
-    RIV = (N_RB_DL*(N_RB_DL+1-Lcrbs)) + (N_RB_DL-1-RBstart);
-
-  return(RIV);
-}
-
-// Convert a DCI Format 1C RIV to a Format 1A RIV
-// This extracts the start and length in PRBs from the 1C rballoc and
-// recomputes the RIV as if it were the 1A rballoc
-
-uint32_t conv_1C_RIV(int32_t rballoc,uint32_t N_RB_DL) {
-
-  int NpDLVRB,N_RB_step,LpCRBsm1,RBpstart;
-
-  switch (N_RB_DL) {
-
-  case 6: // N_RB_step = 2, NDLVRB = 6, NpDLVRB = 3
-    NpDLVRB   = 3;
-    N_RB_step = 2;
-    break;
-  case 25: // N_RB_step = 2, NDLVRB = 24, NpDLVRB = 12
-    NpDLVRB   = 12;
-    N_RB_step = 2;
-    break;
-  case 50: // N_RB_step = 4, NDLVRB = 46, NpDLVRB = 11
-    NpDLVRB   = 11;
-    N_RB_step = 4;
-    break;
-  case 100: // N_RB_step = 4, NDLVRB = 96, NpDLVRB = 24
-    NpDLVRB   = 24;
-    N_RB_step = 4;
-    break;
-  default:
-    NpDLVRB   = 24;
-    N_RB_step = 4;
-    break;
-  }
-
-  // This is the 1C part from 7.1.6.3 in 36.213
-  LpCRBsm1 = rballoc/NpDLVRB;
-  //  printf("LpCRBs = %d\n",LpCRBsm1+1);
-
-  if (LpCRBsm1 <= (NpDLVRB/2)) {
-    RBpstart = rballoc % NpDLVRB;
-  }
-  else {
-    LpCRBsm1 = NpDLVRB-LpCRBsm1;
-    RBpstart = NpDLVRB-(rballoc%NpDLVRB);
-  }
-  //  printf("RBpstart %d\n",RBpstart);
-  return(computeRIV(N_RB_DL,N_RB_step*RBpstart,N_RB_step*(LpCRBsm1+1)));
-
-}
-
-uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
-
-  int offset;
-
-  switch (N_RB_DL) {
-
-  case 6:
-  // N_RB_DL = tildeN_RB_DL = 6
-  // Ngap = 4 , P=1, Nrow = 2, Nnull = 2
-
-    switch (vrb) {
-    case 0:  // even: 0->0, 1->2, odd: 0->3, 1->5
-    case 1:
-      return ((3*odd_slot) + 2*(vrb&3))%6;
-      break;
-    case 2:  // even: 2->3, 3->5, odd: 2->0, 3->2
-    case 3:
-      return ((3*odd_slot) + 2*(vrb&3) + 5)%6;
-      break;
-    case 4:  // even: 4->1, odd: 4->4
-      return ((3*odd_slot) + 1)%6;
-    case 5:  // even: 5->4, odd: 5->1
-      return ((3*odd_slot) + 4)%6;
-      break;
-    }
-    break;
-
-  case 15:
-    if (vrb<12) {
-      if ((vrb&3) < 2)     // even: 0->0, 1->4, 4->1, 5->5, 8->2, 9->6 odd: 0->7, 1->11
-  return(((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14);
-      else if (vrb < 12) // even: 2->7, 3->11, 6->8, 7->12, 10->9, 11->13
-  return (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14);
-    }
-    if (vrb==12)
-      return (3+(7*odd_slot)) % 14;
-    if (vrb==13)
-      return (10+(7*odd_slot)) % 14;
-    return 14;
-    break;
+#include "LAYER2/MAC/mac.h"
 
-  case 25:
-    return (((12*odd_slot) + 6*(vrb&3) + (vrb>>2))%24) + 24*(vrb/24);
-    break;
-
-  case 50: // P=3
-    if (Ngap==0) {
-      // Nrow=12,Nnull=2,NVRBDL=46,Ngap1= 27
-      if (vrb>=23)
-  offset=4;
-      else
-  offset=0;
-      if (vrb<44) {
-  if ((vrb&3)>=2)
-    return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46;
-  else
-    return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46;
-      }
-      if (vrb==44)  // even: 44->11, odd: 45->34
-  return offset+((23*odd_slot) + 22-12+1);
-      if (vrb==45)  // even: 45->10, odd: 45->33
-  return offset+((23*odd_slot) + 22+12);
-      if (vrb==46)
-  return offset+46+((23*odd_slot) + 23-12+1) % 46;
-      if (vrb==47)
-  return offset+46+((23*odd_slot) + 23+12) % 46;
-      if (vrb==48)
-  return offset+46+((23*odd_slot) + 23-12+1) % 46;
-      if (vrb==49)
-  return offset+46+((23*odd_slot) + 23+12) % 46;
-    }
-    else {
-      // Nrow=6,Nnull=6,NVRBDL=18,Ngap1= 27
-      if (vrb>=9)
-  offset=18;
-      else
-  offset=0;
-
-      if (vrb<12) {
-  if ((vrb&3)>=2)
-    return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18;
-  else
-    return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18;
-      }
-      else {
-  return offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18);
-      }
-    }
-    break;
-  case 75:
-    // Ngap1 = 32, NVRBRL=64, P=4, Nrow= 16, Nnull=0
-    if (Ngap ==0) {
-      return ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64);
-    } else {
-      // Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
-      return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
-    }
-    break;
-  case 100:
-    // Ngap1 = 48, NVRBDL=96, Nrow=24, Nnull=0
-    if (Ngap ==0) {
-      return ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96);
-    } else {
-      // Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
-      return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
-    }
-    break;
-  default:
-    LOG_E(PHY,"Unknown N_RB_DL %d\n",N_RB_DL);
-    return 0;
-  }
-  return 0;
-
-}
-
-
-void generate_RIV_tables()
-{
-
-  // 6RBs localized RIV
-  uint8_t Lcrbs,RBstart;
-  uint16_t RIV;
-  uint32_t alloc0,allocdist0_0_even,allocdist0_0_odd,allocdist0_1_even,allocdist0_1_odd;
-  uint32_t alloc1,allocdist1_0_even,allocdist1_0_odd,allocdist1_1_even,allocdist1_1_odd;
-  uint32_t alloc2,allocdist2_0_even,allocdist2_0_odd,allocdist2_1_even,allocdist2_1_odd;
-  uint32_t alloc3,allocdist3_0_even,allocdist3_0_odd,allocdist3_1_even,allocdist3_1_odd;
-  uint32_t nVRB,nVRB_even_dist,nVRB_odd_dist;
-
-  for (RBstart=0; RBstart<6; RBstart++) {
-    alloc0 = 0;
-    allocdist0_0_even = 0;
-    allocdist0_0_odd  = 0;
-    for (Lcrbs=1; Lcrbs<=(6-RBstart); Lcrbs++) {
-      //printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
-      nVRB             = Lcrbs-1+RBstart;
-      alloc0          |= (1<<nVRB);
-      allocdist0_0_even |= (1<<get_prb(6,0,nVRB,0));
-      allocdist0_0_odd  |= (1<<get_prb(6,1,nVRB,0));
-      RIV=computeRIV(6,RBstart,Lcrbs);
-
-      if (RIV>RIV_max6)
-        RIV_max6 = RIV;
-
-      //      printf("RIV %d (%d) : first_rb %d NBRB %d\n",RIV,localRIV2alloc_LUT25[RIV],RBstart,Lcrbs);
-      localRIV2alloc_LUT6[RIV] = alloc0;
-      distRIV2alloc_even_LUT6[RIV]  = allocdist0_0_even;
-      distRIV2alloc_odd_LUT6[RIV]  = allocdist0_0_odd;
-      RIV2nb_rb_LUT6[RIV]      = Lcrbs;
-      RIV2first_rb_LUT6[RIV]   = RBstart;
-    }
-  }
-
-
-  for (RBstart=0; RBstart<25; RBstart++) {
-    alloc0 = 0;
-    allocdist0_0_even = 0;
-    allocdist0_0_odd  = 0;
-    for (Lcrbs=1; Lcrbs<=(25-RBstart); Lcrbs++) {
-      nVRB = Lcrbs-1+RBstart;
-      //printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
-      alloc0     |= (1<<nVRB);
-      allocdist0_0_even |= (1<<get_prb(25,0,nVRB,0));
-      allocdist0_0_odd  |= (1<<get_prb(25,1,nVRB,0));
-
-      //printf("alloc 0 %x, allocdist0_even %x, allocdist0_odd %x\n",alloc0,allocdist0_0_even,allocdist0_0_odd);
-      RIV=computeRIV(25,RBstart,Lcrbs);
-
-      if (RIV>RIV_max25)
-        RIV_max25 = RIV;;
-
-
-      localRIV2alloc_LUT25[RIV]      = alloc0;
-      distRIV2alloc_even_LUT25[RIV]  = allocdist0_0_even;
-      distRIV2alloc_odd_LUT25[RIV]   = allocdist0_0_odd;
-      RIV2nb_rb_LUT25[RIV]           = Lcrbs;
-      RIV2first_rb_LUT25[RIV]        = RBstart;
-    }
-  }
-
-
-  for (RBstart=0; RBstart<50; RBstart++) {
-    alloc0 = 0;
-    alloc1 = 0;
-    allocdist0_0_even=0;
-    allocdist1_0_even=0;
-    allocdist0_0_odd=0;
-    allocdist1_0_odd=0;
-    allocdist0_1_even=0;
-    allocdist1_1_even=0;
-    allocdist0_1_odd=0;
-    allocdist1_1_odd=0;
-
-    for (Lcrbs=1; Lcrbs<=(50-RBstart); Lcrbs++) {
-
-      nVRB = Lcrbs-1+RBstart;
-
-
-      if (nVRB<32)
-        alloc0 |= (1<<nVRB);
-      else
-        alloc1 |= (1<<(nVRB-32));
-
-      // Distributed Gap1, even slot
-      nVRB_even_dist = get_prb(50,0,nVRB,0);
-      if (nVRB_even_dist<32)
-        allocdist0_0_even |= (1<<nVRB_even_dist);
-      else
-        allocdist1_0_even |= (1<<(nVRB_even_dist-32));
-
-      // Distributed Gap1, odd slot
-      nVRB_odd_dist = get_prb(50,1,nVRB,0);
-      if (nVRB_odd_dist<32)
-        allocdist0_0_odd |= (1<<nVRB_odd_dist);
-      else
-        allocdist1_0_odd |= (1<<(nVRB_odd_dist-32));
-
-      // Distributed Gap2, even slot
-      nVRB_even_dist = get_prb(50,0,nVRB,1);
-      if (nVRB_even_dist<32)
-        allocdist0_1_even |= (1<<nVRB_even_dist);
-      else
-        allocdist1_1_even |= (1<<(nVRB_even_dist-32));
-
-      // Distributed Gap2, odd slot
-      nVRB_odd_dist = get_prb(50,1,nVRB,1);
-      if (nVRB_odd_dist<32)
-        allocdist0_1_odd |= (1<<nVRB_odd_dist);
-      else
-        allocdist1_1_odd |= (1<<(nVRB_odd_dist-32));
-
-      RIV=computeRIV(50,RBstart,Lcrbs);
-
-      if (RIV>RIV_max50)
-        RIV_max50 = RIV;
-
-      //      printf("RIV %d : first_rb %d NBRB %d\n",RIV,RBstart,Lcrbs);
-      localRIV2alloc_LUT50_0[RIV]      = alloc0;
-      localRIV2alloc_LUT50_1[RIV]      = alloc1;
-      distRIV2alloc_gap0_even_LUT50_0[RIV]  = allocdist0_0_even;
-      distRIV2alloc_gap0_even_LUT50_1[RIV]  = allocdist1_0_even;
-      distRIV2alloc_gap0_odd_LUT50_0[RIV]   = allocdist0_0_odd;
-      distRIV2alloc_gap0_odd_LUT50_1[RIV]   = allocdist1_0_odd;
-      distRIV2alloc_gap1_even_LUT50_0[RIV]  = allocdist0_1_even;
-      distRIV2alloc_gap1_even_LUT50_1[RIV]  = allocdist1_1_even;
-      distRIV2alloc_gap1_odd_LUT50_0[RIV]   = allocdist0_1_odd;
-      distRIV2alloc_gap1_odd_LUT50_1[RIV]   = allocdist1_1_odd;
-      RIV2nb_rb_LUT50[RIV]        = Lcrbs;
-      RIV2first_rb_LUT50[RIV]     = RBstart;
-    }
-  }
-
-
-  for (RBstart=0; RBstart<100; RBstart++) {
-    alloc0 = 0;
-    alloc1 = 0;
-    alloc2 = 0;
-    alloc3 = 0;
-    allocdist0_0_even=0;
-    allocdist1_0_even=0;
-    allocdist2_0_even=0;
-    allocdist3_0_even=0;
-    allocdist0_0_odd=0;
-    allocdist1_0_odd=0;
-    allocdist2_0_odd=0;
-    allocdist3_0_odd=0;
-    allocdist0_1_even=0;
-    allocdist1_1_even=0;
-    allocdist2_1_even=0;
-    allocdist3_1_even=0;
-    allocdist0_1_odd=0;
-    allocdist1_1_odd=0;
-    allocdist2_1_odd=0;
-    allocdist3_1_odd=0;
-
-    for (Lcrbs=1; Lcrbs<=(100-RBstart); Lcrbs++) {
-
-      nVRB = Lcrbs-1+RBstart;
-
-      if (nVRB<32)
-        alloc0 |= (1<<nVRB);
-      else if (nVRB<64)
-        alloc1 |= (1<<(nVRB-32));
-      else if (nVRB<96)
-        alloc2 |= (1<<(nVRB-64));
-      else
-        alloc3 |= (1<<(nVRB-96));
-
-      // Distributed Gap1, even slot
-      nVRB_even_dist = get_prb(100,0,nVRB,0);
-
-//      if ((RBstart==0) && (Lcrbs<=8))
-//  printf("nVRB %d => nVRB_even_dist %d\n",nVRB,nVRB_even_dist);
-
-
-      if (nVRB_even_dist<32)
-        allocdist0_0_even |= (1<<nVRB_even_dist);
-      else if (nVRB_even_dist<64)
-        allocdist1_0_even |= (1<<(nVRB_even_dist-32));
-      else if (nVRB_even_dist<96)
-  allocdist2_0_even |= (1<<(nVRB_even_dist-64));
-      else
-  allocdist3_0_even |= (1<<(nVRB_even_dist-96));
-/*      if ((RBstart==0) && (Lcrbs<=8))
-  printf("rballoc =>(%08x.%08x.%08x.%08x)\n",
-         allocdist0_0_even,
-         allocdist1_0_even,
-         allocdist2_0_even,
-         allocdist3_0_even
-         );
-*/
-      // Distributed Gap1, odd slot
-      nVRB_odd_dist = get_prb(100,1,nVRB,0);
-      if (nVRB_odd_dist<32)
-        allocdist0_0_odd |= (1<<nVRB_odd_dist);
-      else if (nVRB_odd_dist<64)
-        allocdist1_0_odd |= (1<<(nVRB_odd_dist-32));
-      else if (nVRB_odd_dist<96)
-  allocdist2_0_odd |= (1<<(nVRB_odd_dist-64));
-      else
-  allocdist3_0_odd |= (1<<(nVRB_odd_dist-96));
-
-
-      // Distributed Gap2, even slot
-      nVRB_even_dist = get_prb(100,0,nVRB,1);
-      if (nVRB_even_dist<32)
-        allocdist0_1_even |= (1<<nVRB_even_dist);
-      else if (nVRB_even_dist<64)
-        allocdist1_1_even |= (1<<(nVRB_even_dist-32));
-      else if (nVRB_even_dist<96)
-  allocdist2_1_even |= (1<<(nVRB_even_dist-64));
-      else
-  allocdist3_1_even |= (1<<(nVRB_even_dist-96));
-
-
-      // Distributed Gap2, odd slot
-      nVRB_odd_dist = get_prb(100,1,nVRB,1);
-      if (nVRB_odd_dist<32)
-        allocdist0_1_odd |= (1<<nVRB_odd_dist);
-      else if (nVRB_odd_dist<64)
-        allocdist1_1_odd |= (1<<(nVRB_odd_dist-32));
-      else if (nVRB_odd_dist<96)
-  allocdist2_1_odd |= (1<<(nVRB_odd_dist-64));
-      else
-  allocdist3_1_odd |= (1<<(nVRB_odd_dist-96));
-
-
-      RIV=computeRIV(100,RBstart,Lcrbs);
-
-      if (RIV>RIV_max100)
-        RIV_max100 = RIV;
-
-      //      printf("RIV %d : first_rb %d NBRB %d\n",RIV,RBstart,Lcrbs);
-      localRIV2alloc_LUT100_0[RIV] = alloc0;
-      localRIV2alloc_LUT100_1[RIV] = alloc1;
-      localRIV2alloc_LUT100_2[RIV] = alloc2;
-      localRIV2alloc_LUT100_3[RIV] = alloc3;
-      distRIV2alloc_gap0_even_LUT100_0[RIV]  = allocdist0_0_even;
-      distRIV2alloc_gap0_even_LUT100_1[RIV]  = allocdist1_0_even;
-      distRIV2alloc_gap0_even_LUT100_2[RIV]  = allocdist2_0_even;
-      distRIV2alloc_gap0_even_LUT100_3[RIV]  = allocdist3_0_even;
-      distRIV2alloc_gap0_odd_LUT100_0[RIV]   = allocdist0_0_odd;
-      distRIV2alloc_gap0_odd_LUT100_1[RIV]   = allocdist1_0_odd;
-      distRIV2alloc_gap0_odd_LUT100_2[RIV]   = allocdist2_0_odd;
-      distRIV2alloc_gap0_odd_LUT100_3[RIV]   = allocdist3_0_odd;
-      distRIV2alloc_gap1_even_LUT100_0[RIV]  = allocdist0_1_even;
-      distRIV2alloc_gap1_even_LUT100_1[RIV]  = allocdist1_1_even;
-      distRIV2alloc_gap1_even_LUT100_2[RIV]  = allocdist2_1_even;
-      distRIV2alloc_gap1_even_LUT100_3[RIV]  = allocdist3_1_even;
-      distRIV2alloc_gap1_odd_LUT100_0[RIV]   = allocdist0_1_odd;
-      distRIV2alloc_gap1_odd_LUT100_1[RIV]   = allocdist1_1_odd;
-      distRIV2alloc_gap1_odd_LUT100_2[RIV]   = allocdist2_1_odd;
-      distRIV2alloc_gap1_odd_LUT100_3[RIV]   = allocdist3_1_odd;
-
-      RIV2nb_rb_LUT100[RIV]      = Lcrbs;
-      RIV2first_rb_LUT100[RIV]   = RBstart;
-    }
-  }
-}
-
-// Ngap = 3, N_VRB_DL=6, P=1, N_row=2, N_null=4*2-6=2
-// permutation for even slots :
-//    n_PRB'(0,2,4) = (0,1,2), n_PRB'(1,3,5) = (4,5,6)
-//    n_PRB''(0,1,2,3) = (0,2,4,6)
-//    => n_tilde_PRB(5) = (4)
-//       n_tilde_PRB(4) = (1)
-//       n_tilde_PRB(2,3) = (3,5)
-//       n_tilde_PRB(0,1) = (0,2)
+//#define DEBUG_DCI
+#include "dci_tools_common_extern.h"
 
 
 int8_t find_dlsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type)
@@ -840,25 +87,8 @@ int8_t find_ulsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type)
 }
 
 
-uint32_t get_rballoc(vrb_t vrb_type,uint16_t rb_alloc_dci)
-{
-
-  return(localRIV2alloc_LUT25[rb_alloc_dci]);
-
-}
-
-/*
-uint8_t get_transmission_mode(module_id_t Mod_id, uint8_t CC_id, rnti_t rnti)
-{
-  unsigned char UE_id;
 
-  // find the UE_index corresponding to rnti
-  UE_id = find_ue(rnti,RC.eNB[Mod_id][CC_id]);
-  DevAssert( UE_id != (unsigned char)-1 );
 
-  return(RC.eNB[Mod_id][CC_id]->transmission_mode[UE_id]);
-}
-*/
 
 void fill_pdcch_order(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_dl_config_dci_dl_pdu *pdu)
 {
@@ -2709,6385 +1939,3 @@ void fill_ulsch(PHY_VARS_eNB *eNB,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame
 	ulsch->harq_processes[harq_pid]->round);  
 }
 
-int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
-{
-  switch (dci->format) {
-
-  case format0:   // This is an UL SCH allocation so nothing here, inform MAC
-    if ((frame_parms->frame_type == TDD) &&
-        (frame_parms->tdd_config>0))
-      switch(frame_parms->N_RB_DL) {
-      case 6:
-        LOG_D(PHY,"DCI format0 (TDD, 1.5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      case 25:
-        LOG_D(PHY,"DCI format0 (TDD1-6, 5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      case 50:
-        LOG_D(PHY,"DCI format0 (TDD1-6, 10MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      case 100:
-        LOG_D(PHY,"DCI format0 (TDD1-6, 20MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      default:
-        LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-      }
-    else if (frame_parms->frame_type == FDD)
-      switch(frame_parms->N_RB_DL) {
-      case 6:
-        LOG_D(PHY,"DCI format0 (FDD, 1.5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      case 25:
-        LOG_D(PHY,"DCI format0 (FDD, 5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      case 50:
-        LOG_D(PHY,"DCI format0 (FDD, 10MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      case 100:
-        LOG_D(PHY,"DCI format0 (FDD, 20MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      default:
-        LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-      }
-    else
-      LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
-
-    break;
-
-  case format1:
-    if ((frame_parms->frame_type == TDD) &&
-        (frame_parms->tdd_config>0))
-
-      switch(frame_parms->N_RB_DL) {
-      case 6:
-        LOG_D(PHY,"DCI format1 (TDD 1.5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      case 25:
-        LOG_D(PHY,"DCI format1 (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      case 50:
-        LOG_D(PHY,"DCI format1 (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      case 100:
-        LOG_D(PHY,"DCI format1 (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      default:
-        LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-      }
-    else if (frame_parms->frame_type == FDD) {
-      switch(frame_parms->N_RB_DL) {
-      case 6:
-        LOG_D(PHY,"DCI format1 (FDD, 1.5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      case 25:
-        LOG_D(PHY,"DCI format1 (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      case 50:
-        LOG_D(PHY,"DCI format1 (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      case 100:
-        LOG_D(PHY,"DCI format1 (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      default:
-        LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-      }
-    }
-
-    else
-      LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
-
-    break;
-
-  case format1A:  // This is DLSCH allocation for control traffic
-    if ((frame_parms->frame_type == TDD) &&
-        (frame_parms->tdd_config>0)) {
-      switch (frame_parms->N_RB_DL) {
-      case 6:
-        LOG_D(PHY,"DCI format1A (TDD1-6, 1_5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
-        LOG_D(PHY,"DAI %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      case 25:
-        LOG_D(PHY,"DCI format1A (TDD1-6, 5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %d (NB_RB %d)\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
-        LOG_D(PHY,"DAI %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      case 50:
-        LOG_D(PHY,"DCI format1A (TDD1-6, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
-        LOG_D(PHY,"DAI %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      case 100:
-        LOG_D(PHY,"DCI format1A (TDD1-6, 20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT100[((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
-        LOG_D(PHY,"DAI %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      default:
-        LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-      }
-
-    } else if (frame_parms->frame_type == FDD) {
-      switch (frame_parms->N_RB_DL) {
-      case 6:
-        LOG_D(PHY,"DCI format1A(FDD, 1.5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      case 25:
-        LOG_D(PHY,"DCI format1A(FDD, 5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      case 50:
-        LOG_D(PHY,"DCI format1A(FDD, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      case 100:
-        LOG_D(PHY,"DCI format1A(FDD, 20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT100[((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      default:
-        LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-      }
-    }
-
-    break;
-
-  case format1C:  // This is DLSCH allocation for control traffic
-    switch (frame_parms->N_RB_DL) {
-    case 6:
-      LOG_D(PHY,"DCI format1C (1.5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-      LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",
-      ((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT6[conv_1C_RIV(((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,6)]);
-      LOG_D(PHY,"MCS %d\n",((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->mcs);
-      break;
-
-    case 25:
-      LOG_D(PHY,"DCI format1C (5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-      LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[conv_1C_RIV(((DCI1C_5MHz_t *)&dci->dci_pdu[0])->rballoc,25)]);
-      LOG_D(PHY,"MCS %d\n",((DCI1C_5MHz_t *)&dci->dci_pdu[0])->mcs);
-      break;
-
-    case 50:
-      LOG_D(PHY,"DCI format1C (10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-      LOG_D(PHY,"Ngap %d\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->Ngap);
-      LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[conv_1C_RIV(((DCI1C_10MHz_t *)&dci->dci_pdu[0])->rballoc,50)]);
-      LOG_D(PHY,"MCS %d\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->mcs);
-      break;
-
-    case 100:
-      LOG_D(PHY,"DCI format1C (20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-      LOG_D(PHY,"Ngap %d\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->Ngap);
-      LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[conv_1C_RIV(((DCI1C_20MHz_t *)&dci->dci_pdu[0])->rballoc,100)]);
-      LOG_D(PHY,"MCS %d\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->mcs);
-      break;
-
-
-    default:
-      LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-    }
-
-
-    break;
-
-  case format2:
-
-    if ((frame_parms->frame_type == TDD) &&
-        (frame_parms->tdd_config>0)) {
-      if (frame_parms->nb_antenna_ports_eNB == 2) {
-        switch(frame_parms->N_RB_DL) {
-        case 6:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tpmi
-               );
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      } else if (frame_parms->nb_antenna_ports_eNB == 4) {
-        switch(frame_parms->N_RB_DL) {
-        case 6:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi
-               );
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      }
-    } else if (frame_parms->frame_type == FDD) {
-      if (frame_parms->nb_antenna_ports_eNB == 2) {
-        switch(frame_parms->N_RB_DL) {
-        case 6:
-          LOG_D(PHY,"DCI format2 2 antennas (FDD, 1.5 MHz), rnti %x (%x):  rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 25:
-
-          LOG_D(PHY,"DCI format2 2 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, swap %d, TPMI %d, TPC %d\n",
-
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2 2 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2 2 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      } else if (frame_parms->nb_antenna_ports_eNB == 4) {
-        switch(frame_parms->N_RB_DL) {
-
-        case 6:
-          LOG_D(PHY,"DCI format2 4 antennas (FDD, 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2 4 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2 4 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2 4 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      }
-    }
-
-    else
-      LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
-
-    break;
-
-  case format2A:
-
-    if ((frame_parms->frame_type == TDD) &&
-        (frame_parms->tdd_config>0)) {
-      if (frame_parms->nb_antenna_ports_eNB == 2) {
-        switch(frame_parms->N_RB_DL) {
-        case 6:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap
-               );
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      } else if (frame_parms->nb_antenna_ports_eNB == 4) {
-        switch(frame_parms->N_RB_DL) {
-        case 6:
-          LOG_D(PHY,"DCI format2A 4 antennas (TDD 1.5 MHz), rnti %x (%"PRIu64"): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi
-               );
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2A 4 antennas (TDD 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2A 4 antennas (TDD 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2A 4 antennas (TDD 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      }
-    } else if (frame_parms->frame_type == FDD) {
-      if (frame_parms->nb_antenna_ports_eNB == 2) {
-        switch(frame_parms->N_RB_DL) {
-        case 6:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD, 1.5 MHz), rnti %x (%x):  rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD, 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD, 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      } else if (frame_parms->nb_antenna_ports_eNB == 4) {
-        switch(frame_parms->N_RB_DL) {
-
-        case 6:
-          LOG_D(PHY,"DCI format2A 4 antennas (FDD, 1.5 MHz), rnti %x (%"PRIu64"): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      }
-    }
-
-    else
-      LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
-
-    break;
-
-  case format1E_2A_M10PRB:
-
-    LOG_D(PHY,"DCI format1E_2A_M10PRB, rnti %x (%8x): harq_pid %d, rah %d, rb_alloc %x, mcs %d, rv %d, tpmi %d, ndi %d, dl_power_offset %d\n",
-          dci->rnti,
-          ((uint32_t *)&dci->dci_pdu)[0],
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-          //((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->rah,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->rballoc,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->mcs,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->rv,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->tpmi,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->ndi,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->dl_power_off
-         );
-
-    break;
-
-  default:
-    LOG_E(PHY,"dci_tools.c: dump_dci, unknown format %d\n",dci->format);
-    return(-1);
-  }
-
-  return(0);
-}
-
-void extract_dci1A_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
-{
-    uint8_t harq_pid=0;
-    uint32_t rballoc=0;
-    uint8_t vrb_type=0;
-    uint8_t mcs=0;
-    uint8_t rv=0;
-    uint8_t ndi=0;
-    uint8_t TPC=0;
-
-    uint8_t dai=0;
-
-    switch (N_RB_DL) {
-    case 6:
-        if (frame_type == TDD) {
-            vrb_type = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type;
-            mcs      = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs;
-            rballoc  = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc;
-            rv       = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rv;
-            ndi      = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi;
-            TPC      = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC;
-            harq_pid = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid;
-            dai      = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->dai;
-            //  printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC);
-        } else {
-            vrb_type = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->vrb_type;
-            mcs      = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->mcs;
-            rballoc  = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rballoc;
-            rv       = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rv;
-            ndi      = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->ndi;
-            TPC      = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->TPC;
-            harq_pid  = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->harq_pid;
-            //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC);
-        }
-        break;
-
-    case 25:
-
-        if (frame_type == TDD) {
-            vrb_type = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type;
-            mcs      = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->mcs;
-            rballoc  = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rballoc;
-            rv       = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rv;
-            ndi      = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->ndi;
-            TPC      = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->TPC;
-            harq_pid = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid;
-            dai      = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->dai;
-            //printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC);
-        } else {
-            vrb_type = ((DCI1A_5MHz_FDD_t *)dci_pdu)->vrb_type;
-            mcs      = ((DCI1A_5MHz_FDD_t *)dci_pdu)->mcs;
-            rballoc  = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rballoc;
-            rv       = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rv;
-            ndi      = ((DCI1A_5MHz_FDD_t *)dci_pdu)->ndi;
-            TPC      = ((DCI1A_5MHz_FDD_t *)dci_pdu)->TPC;
-            harq_pid  = ((DCI1A_5MHz_FDD_t *)dci_pdu)->harq_pid;
-            //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC);
-        }
-
-        break;
-
-    case 50:
-        if (frame_type == TDD) {
-            vrb_type = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->vrb_type;
-            mcs      = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->mcs;
-            rballoc  = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rballoc;
-            rv       = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rv;
-            ndi      = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->ndi;
-            TPC      = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->TPC;
-            harq_pid = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->harq_pid;
-            dai      = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->dai;
-            //  printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC);
-        } else {
-            vrb_type = ((DCI1A_10MHz_FDD_t *)dci_pdu)->vrb_type;
-            mcs      = ((DCI1A_10MHz_FDD_t *)dci_pdu)->mcs;
-            rballoc  = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rballoc;
-            rv       = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rv;
-            ndi      = ((DCI1A_10MHz_FDD_t *)dci_pdu)->ndi;
-            TPC      = ((DCI1A_10MHz_FDD_t *)dci_pdu)->TPC;
-            harq_pid  = ((DCI1A_10MHz_FDD_t *)dci_pdu)->harq_pid;
-            //printf("FDD 1A: mcs %d, vrb_type %d, rballoc %x,ndi %d, rv %d, TPC %d\n",mcs,vrb_type,rballoc,ndi,rv,TPC);
-        }
-        break;
-
-    case 100:
-        if (frame_type == TDD) {
-            vrb_type = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->vrb_type;
-            mcs      = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->mcs;
-            rballoc  = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rballoc;
-            rv       = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rv;
-            ndi      = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->ndi;
-            TPC      = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->TPC;
-            harq_pid = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid;
-            dai      = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->dai;
-            //  printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC);
-        } else {
-            vrb_type = ((DCI1A_20MHz_FDD_t *)dci_pdu)->vrb_type;
-            mcs      = ((DCI1A_20MHz_FDD_t *)dci_pdu)->mcs;
-            rballoc  = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rballoc;
-            rv       = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rv;
-            ndi      = ((DCI1A_20MHz_FDD_t *)dci_pdu)->ndi;
-            TPC      = ((DCI1A_20MHz_FDD_t *)dci_pdu)->TPC;
-            harq_pid = ((DCI1A_20MHz_FDD_t *)dci_pdu)->harq_pid;
-            //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC);
-        }
-        break;
-    }
-
-    pdci_info_extarcted->vrb_type = vrb_type;
-    pdci_info_extarcted->mcs1     = mcs;
-    pdci_info_extarcted->rballoc  = rballoc;
-    pdci_info_extarcted->rv1      = rv;
-    pdci_info_extarcted->ndi1     = ndi;
-    pdci_info_extarcted->TPC      = TPC;
-    pdci_info_extarcted->harq_pid = harq_pid;
-    pdci_info_extarcted->dai      = dai;
-}
-
-void extract_dci1C_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
-{
-
-    uint32_t rballoc=0;
-    uint8_t mcs=0;
-
-    switch (N_RB_DL) {
-        case 6:
-          mcs             = ((DCI1C_5MHz_t *)dci_pdu)->mcs;
-          rballoc         = conv_1C_RIV(((DCI1C_5MHz_t *)dci_pdu)->rballoc,6);
-
-          break;
-
-        case 25:
-            mcs             = ((DCI1C_5MHz_t *)dci_pdu)->mcs;
-            rballoc         = conv_1C_RIV(((DCI1C_5MHz_t *)dci_pdu)->rballoc,6);
-
-          break;
-
-        case 50:
-            mcs             = ((DCI1C_10MHz_t *)dci_pdu)->mcs;
-            rballoc         = conv_1C_RIV(((DCI1C_10MHz_t *)dci_pdu)->rballoc,6);
-
-          break;
-
-        case 100:
-            mcs             = ((DCI1C_20MHz_t *)dci_pdu)->mcs;
-            rballoc         = conv_1C_RIV(((DCI1C_20MHz_t *)dci_pdu)->rballoc,6);
-          break;
-
-        default:
-          AssertFatal(0,"Format 1C: Unknown N_RB_DL %d\n",N_RB_DL);
-          break;
-        }
-
-    pdci_info_extarcted->mcs1     = mcs;
-    pdci_info_extarcted->rballoc  = rballoc;
-}
-
-void extract_dci1_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
-{
-
-    uint32_t rballoc=0;
-    uint8_t mcs=0;
-    uint8_t rah=0;
-    uint8_t rv=0;
-    uint8_t TPC=0;
-    uint8_t ndi=0;
-    uint8_t harq_pid=0;
-
-    switch (N_RB_DL) {
-    case 6:
-        if (frame_type == TDD) {
-            mcs       = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->mcs;
-            rballoc   = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rballoc;
-            rah       = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rah;
-            rv        = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rv;
-            TPC       = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->TPC;
-            ndi       = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->ndi;
-            harq_pid  = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->harq_pid;
-        } else {
-            mcs      = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->mcs;
-            rah      = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rah;
-            rballoc  = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rballoc;
-            rv       = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rv;
-            TPC       = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->TPC;
-            ndi      = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->ndi;
-            harq_pid = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->harq_pid;
-        }
-
-        break;
-
-    case 25:
-        if (frame_type == TDD) {
-            mcs       = ((DCI1_5MHz_TDD_t *)dci_pdu)->mcs;
-            rballoc   = ((DCI1_5MHz_TDD_t *)dci_pdu)->rballoc;
-            rah       = ((DCI1_5MHz_TDD_t *)dci_pdu)->rah;
-            rv        = ((DCI1_5MHz_TDD_t *)dci_pdu)->rv;
-            TPC       = ((DCI1_5MHz_TDD_t *)dci_pdu)->TPC;
-            ndi       = ((DCI1_5MHz_TDD_t *)dci_pdu)->ndi;
-            harq_pid  = ((DCI1_5MHz_TDD_t *)dci_pdu)->harq_pid;
-        } else {
-            mcs      = ((DCI1_5MHz_FDD_t *)dci_pdu)->mcs;
-            rah      = ((DCI1_5MHz_FDD_t *)dci_pdu)->rah;
-            rballoc  = ((DCI1_5MHz_FDD_t *)dci_pdu)->rballoc;
-            rv       = ((DCI1_5MHz_FDD_t *)dci_pdu)->rv;
-            TPC      = ((DCI1_5MHz_FDD_t *)dci_pdu)->TPC;
-            ndi      = ((DCI1_5MHz_FDD_t *)dci_pdu)->ndi;
-            harq_pid = ((DCI1_5MHz_FDD_t *)dci_pdu)->harq_pid;
-        }
-
-        break;
-
-    case 50:
-        if (frame_type == TDD) {
-            mcs       = ((DCI1_10MHz_TDD_t *)dci_pdu)->mcs;
-            rballoc   = ((DCI1_10MHz_TDD_t *)dci_pdu)->rballoc;
-            rah       = ((DCI1_10MHz_TDD_t *)dci_pdu)->rah;
-            rv        = ((DCI1_10MHz_TDD_t *)dci_pdu)->rv;
-            TPC       = ((DCI1_10MHz_TDD_t *)dci_pdu)->TPC;
-            ndi       = ((DCI1_10MHz_TDD_t *)dci_pdu)->ndi;
-            harq_pid  = ((DCI1_10MHz_TDD_t *)dci_pdu)->harq_pid;
-        } else {
-            mcs      = ((DCI1_10MHz_FDD_t *)dci_pdu)->mcs;
-            rah      = ((DCI1_10MHz_FDD_t *)dci_pdu)->rah;
-            rballoc  = ((DCI1_10MHz_FDD_t *)dci_pdu)->rballoc;
-            rv       = ((DCI1_10MHz_FDD_t *)dci_pdu)->rv;
-            TPC      = ((DCI1_10MHz_FDD_t *)dci_pdu)->TPC;
-            ndi      = ((DCI1_10MHz_FDD_t *)dci_pdu)->ndi;
-            harq_pid = ((DCI1_10MHz_FDD_t *)dci_pdu)->harq_pid;
-        }
-
-        break;
-
-    case 100:
-        if (frame_type == TDD) {
-            mcs       = ((DCI1_20MHz_TDD_t *)dci_pdu)->mcs;
-            rballoc   = ((DCI1_20MHz_TDD_t *)dci_pdu)->rballoc;
-            rah       = ((DCI1_20MHz_TDD_t *)dci_pdu)->rah;
-            rv        = ((DCI1_20MHz_TDD_t *)dci_pdu)->rv;
-            TPC        = ((DCI1_20MHz_TDD_t *)dci_pdu)->TPC;
-            ndi       = ((DCI1_20MHz_TDD_t *)dci_pdu)->ndi;
-            harq_pid  = ((DCI1_20MHz_TDD_t *)dci_pdu)->harq_pid;
-        } else {
-            mcs      = ((DCI1_20MHz_FDD_t *)dci_pdu)->mcs;
-            rah      = ((DCI1_20MHz_FDD_t *)dci_pdu)->rah;
-            rballoc  = ((DCI1_20MHz_FDD_t *)dci_pdu)->rballoc;
-            rv       = ((DCI1_20MHz_FDD_t *)dci_pdu)->rv;
-            TPC      = ((DCI1_20MHz_FDD_t *)dci_pdu)->TPC;
-            ndi      = ((DCI1_20MHz_FDD_t *)dci_pdu)->ndi;
-            harq_pid = ((DCI1_20MHz_FDD_t *)dci_pdu)->harq_pid;
-        }
-
-        break;
-    }
-
-    pdci_info_extarcted->mcs1     = mcs;
-    pdci_info_extarcted->rah      = rah;
-    pdci_info_extarcted->rballoc  = rballoc;
-    pdci_info_extarcted->rv1      = rv;
-    pdci_info_extarcted->TPC      = TPC;
-    pdci_info_extarcted->ndi1     = ndi;
-    pdci_info_extarcted->harq_pid = harq_pid;
-
-}
-
-void extract_dci2_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, uint8_t nb_antenna_ports_eNB, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
-{
-
-    uint32_t rballoc=0;
-    uint8_t rah=0;
-    uint8_t mcs1=0;
-    uint8_t mcs2=0;
-    uint8_t rv1=0;
-    uint8_t rv2=0;
-    uint8_t ndi1=0;
-    uint8_t ndi2=0;
-    uint8_t tbswap=0;
-    uint8_t tpmi=0;
-    uint8_t harq_pid=0;
-    uint8_t TPC=0;
-
-    switch (N_RB_DL) {
-
-    case 6:
-        if (nb_antenna_ports_eNB == 2) {
-            if (frame_type == TDD) {
-                rah       = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi2;
-            } else {
-                rah       = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi2;
-            }
-        } else if (nb_antenna_ports_eNB == 4) {
-            if (frame_type == TDD) {
-                rah       = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->ndi2;
-            } else {
-                rah       = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->ndi2;
-            }
-        } else {
-            LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",nb_antenna_ports_eNB);
-        }
-
-        break;
-
-    case 25:
-        if (nb_antenna_ports_eNB == 2) {
-            if (frame_type == TDD) {
-                rah       = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi2;
-            } else {
-                rah       = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi2;
-            }
-        } else if (nb_antenna_ports_eNB == 4) {
-            if (frame_type == TDD) {
-                rah       = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi2;
-            } else {
-                rah       = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->ndi2;
-            }
-        } else {
-            LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",nb_antenna_ports_eNB);
-        }
-
-        break;
-
-    case 50:
-        if (nb_antenna_ports_eNB == 2) {
-            if (frame_type == TDD) {
-                rah       = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->ndi2;
-            } else {
-                rah       = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->ndi2;
-            }
-        } else if (nb_antenna_ports_eNB == 4) {
-            if (frame_type == TDD) {
-                rah       = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->ndi2;
-            } else {
-                rah       = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->ndi2;
-            }
-        } else {
-            LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",nb_antenna_ports_eNB);
-        }
-
-        break;
-
-    case 100:
-        if (nb_antenna_ports_eNB == 2) {
-            if (frame_type == TDD) {
-                rah       = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->ndi2;
-            } else {
-                rah       = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->ndi2;
-            }
-        } else if (nb_antenna_ports_eNB == 4) {
-            if (frame_type == TDD) {
-                rah       = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->ndi2;
-            } else {
-                rah       = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rah;
-                mcs1      = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs1;
-                mcs2      = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs2;
-                rballoc   = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rballoc;
-                rv1       = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv1;
-                rv2       = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv2;
-                harq_pid  = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->harq_pid;
-                tbswap    = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tb_swap;
-                tpmi      = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tpmi;
-                TPC       = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->TPC;
-                ndi1      = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->ndi1;
-                ndi2      = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->ndi2;
-            }
-        } else {
-            LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",nb_antenna_ports_eNB);
-        }
-
-        break;
-    }
-
-    pdci_info_extarcted->rah      = rah;
-    pdci_info_extarcted->mcs1     = mcs1;
-    pdci_info_extarcted->mcs2     = mcs2;
-    pdci_info_extarcted->rv1      = rv1;
-    pdci_info_extarcted->rv2      = rv2;
-    pdci_info_extarcted->harq_pid = harq_pid;
-    pdci_info_extarcted->rballoc  = rballoc;
-    pdci_info_extarcted->tb_swap  = tbswap;
-    pdci_info_extarcted->tpmi     = tpmi;
-    pdci_info_extarcted->TPC      = TPC;
-    pdci_info_extarcted->ndi1     = ndi1;
-    pdci_info_extarcted->ndi2     = ndi2;
-
-}
-
-void extract_dci2A_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, uint8_t nb_antenna_ports_eNB, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
-{
-
-    uint32_t rballoc=0;
-    uint8_t rah=0;
-    uint8_t mcs1=0;
-    uint8_t mcs2=0;
-    uint8_t rv1=0;
-    uint8_t rv2=0;
-    uint8_t ndi1=0;
-    uint8_t ndi2=0;
-    uint8_t tbswap=0;
-    uint8_t tpmi=0;
-    uint8_t harq_pid=0;
-    uint8_t TPC=0;
-
-    AssertFatal( (nb_antenna_ports_eNB == 2) || (nb_antenna_ports_eNB == 4), "unsupported nb_antenna_ports_eNB %d\n", nb_antenna_ports_eNB);
-    switch (N_RB_DL) {
-
-    case 6:
-      if (nb_antenna_ports_eNB == 2) {
-        if (frame_type == TDD) {
-          mcs1      = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
-          rv1       = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
-          TPC       = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->TPC;
-        } else {
-          mcs1      = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
-          rv1       = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
-          TPC       = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->TPC;
-        }
-      } else if (nb_antenna_ports_eNB == 4) {
-        if (frame_type == TDD) {
-          mcs1      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
-          rv1       = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
-          tpmi      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
-          TPC       = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->TPC;
-        } else {
-          mcs1      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
-          rv1       = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
-          tpmi      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
-          TPC       = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->TPC;
-        }
-      }
-
-      break;
-
-    case 25:
-      if (nb_antenna_ports_eNB == 2) {
-        if (frame_type == TDD) {
-          mcs1      = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
-          rah       = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rah;
-          rv1       = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
-          TPC       = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->TPC;
-        } else {
-          mcs1      = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
-          rah       = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rah;
-          rv1       = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
-          TPC       = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->TPC;
-        }
-      } else if (nb_antenna_ports_eNB == 4) {
-        if (frame_type == TDD) {
-          mcs1      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
-          rah       = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rah;
-          rv1       = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
-          tpmi      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
-          TPC       = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->TPC;
-        } else {
-          mcs1      = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
-          rah       = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rah;
-          rv1       = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
-          tpmi      = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
-          TPC       = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->TPC;
-        }
-      }
-      break;
-
-    case 50:
-      if (nb_antenna_ports_eNB == 2) {
-        if (frame_type == TDD) {
-          mcs1      = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rballoc;
-          rah       = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rah;
-          rv1       = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->tb_swap;
-          TPC       = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->TPC;
-        } else {
-          mcs1      = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rballoc;
-          rah       = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rah;
-          rv1       = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->tb_swap;
-          TPC       = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->TPC;
-        }
-      } else if (nb_antenna_ports_eNB == 4) {
-        if (frame_type == TDD) {
-          mcs1      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rballoc;
-          rah       = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rah;
-          rv1       = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tb_swap;
-          tpmi      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tpmi;
-          TPC       = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->TPC;
-        } else {
-          mcs1      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rballoc;
-          rah       = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rah;
-          rv1       = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tb_swap;
-          tpmi      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tpmi;
-          TPC       = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->TPC;
-        }
-      }
-
-      break;
-
-    case 100:
-      if (nb_antenna_ports_eNB == 2) {
-        if (frame_type == TDD) {
-          mcs1      = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rballoc;
-          rah       = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rah;
-          rv1       = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->tb_swap;
-          TPC       = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->TPC;
-        } else {
-          mcs1      = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rballoc;
-          rah       = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rah;
-          rv1       = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->tb_swap;
-          TPC       = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->TPC;
-        }
-      } else if (nb_antenna_ports_eNB == 4) {
-        if (frame_type == TDD) {
-          mcs1      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rballoc;
-          rah       = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rah;
-          rv1       = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tb_swap;
-          tpmi      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tpmi;
-          TPC       = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->TPC;
-        } else {
-          mcs1      = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs1;
-          mcs2      = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs2;
-          rballoc   = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rballoc;
-          rah       = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rah;
-          rv1       = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv1;
-          rv2       = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv2;
-          ndi1      = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->ndi1;
-          ndi2      = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->ndi2;
-          harq_pid  = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->harq_pid;
-          tbswap    = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tb_swap;
-          tpmi    = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tpmi;
-          TPC     = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->TPC;
-        }
-      }
-
-      break;
-    }
-
-    pdci_info_extarcted->mcs1     = mcs1;
-    pdci_info_extarcted->mcs2     = mcs2;
-    pdci_info_extarcted->rballoc  = rballoc;
-    pdci_info_extarcted->rah      = rah;
-    pdci_info_extarcted->rv1      = rv1;
-    pdci_info_extarcted->rv2      = rv2;
-    pdci_info_extarcted->ndi1     = ndi1;
-    pdci_info_extarcted->ndi2     = ndi2;
-    pdci_info_extarcted->harq_pid = harq_pid;
-    pdci_info_extarcted->tb_swap  = tbswap;
-    pdci_info_extarcted->TPC      = TPC;
-    pdci_info_extarcted->tpmi     = tpmi;
-}
-
-int check_dci_format1_1a_coherency(DCI_format_t dci_format,
-        uint8_t N_RB_DL,
-        uint16_t rnti,
-        uint16_t tc_rnti,
-        uint16_t si_rnti,
-        uint16_t ra_rnti,
-        uint16_t p_rnti,
-        uint32_t frame,
-        uint8_t  subframe,
-        DCI_INFO_EXTRACTED_t *pdci_info_extarcted,
-        LTE_DL_UE_HARQ_t *pdlsch0_harq)
-{
-    uint8_t  harq_pid  = pdci_info_extarcted->harq_pid;
-    uint32_t rballoc   = pdci_info_extarcted->rballoc;
-    uint8_t  mcs1      = pdci_info_extarcted->mcs1;
-    uint8_t  TPC       = pdci_info_extarcted->TPC;
-    uint8_t  rah       = pdci_info_extarcted->rah;
-#ifdef DEBUG_DCI
-    uint8_t  rv1       = pdci_info_extarcted->rv1;
-    uint8_t  ndi1      = pdci_info_extarcted->ndi1;
-#endif
-
-    uint8_t  NPRB    = 0;
-    long long int RIV_max = 0;
-
-#ifdef DEBUG_DCI
-    LOG_I(PHY,"[DCI-FORMAT-1-1A] AbsSubframe %d.%d dci_format %d\n", frame, subframe, dci_format);
-    LOG_I(PHY,"[DCI-FORMAT-1-1A] rnti       %x\n",  rnti);
-    LOG_I(PHY,"[DCI-FORMAT-1-1A] harq_pid   %d\n", harq_pid);
-    LOG_I(PHY,"[DCI-FORMAT-1-1A] rah        %d\n", rah);
-    LOG_I(PHY,"[DCI-FORMAT-1-1A] rballoc    %x\n", rballoc);
-    LOG_I(PHY,"[DCI-FORMAT-1-1A] mcs1       %d\n", mcs1);
-    LOG_I(PHY,"[DCI-FORMAT-1-1A] rv1        %d\n", rv1);
-    LOG_I(PHY,"[DCI-FORMAT-1-1A] ndi1       %d\n", ndi1);
-    LOG_I(PHY,"[DCI-FORMAT-1-1A] TPC        %d\n", TPC);
-#endif
-
-
-    // I- check dci content minimum coherency
-    if( ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) && harq_pid > 0)
-    {
-        return(0);
-    }
-
-    if(harq_pid>=8)
-    {
-      //        LOG_I(PHY,"bad harq id \n");
-        return(0);
-    }
-
-    if(dci_format == format1 && ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) )
-    {
-      //        LOG_I(PHY,"bad dci format \n");
-        return(0);
-    }
-
-
-    if( mcs1 > 28)
-    {
-        if(pdlsch0_harq->round == 0)
-        {
-	  //            LOG_I(PHY,"bad dci mcs + round \n");
-            return(0);
-        }
-
-        if((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti))
-        {
-	  //            LOG_I(PHY,"bad dci mcs + rnti  \n");
-            return(0);
-        }
-    }
-
-    if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti))
-    {
-        NPRB = (TPC&1) + 2;
-        switch (N_RB_DL) {
-        case 6:
-            RIV_max  = RIV_max6;
-            break;
-        case 25:
-            RIV_max  = RIV_max25;
-            break;
-        case 50:
-            RIV_max  = RIV_max50;
-            break;
-        case 100:
-            RIV_max  = RIV_max100;
-            break;
-        }
-    }
-    else
-    {
-        switch (N_RB_DL) {
-        case 6:
-            NPRB     = RIV2nb_rb_LUT6[rballoc];//NPRB;
-            if(rah)
-              RIV_max  = RIV_max6;
-            else
-              RIV_max  = 0x3F;
-            break;
-        case 25:
-            NPRB     = RIV2nb_rb_LUT25[rballoc];//NPRB;
-            if(rah)
-              RIV_max  = RIV_max25;
-            else
-              RIV_max  = 0x1FFF;
-            break;
-        case 50:
-            NPRB     = RIV2nb_rb_LUT50[rballoc];//NPRB;
-            if(rah)
-              RIV_max  = RIV_max50;
-            else
-              RIV_max  = 0x1FFFF;
-            break;
-        case 100:
-            NPRB     = RIV2nb_rb_LUT100[rballoc];//NPRB;
-            if(rah)
-              RIV_max  = RIV_max100;
-            else
-              RIV_max  =  0x1FFFFFF;
-            break;
-        }
-    }
-
-
-    if(dci_format == format1)
-    {
-        NPRB = conv_nprb(rah, rballoc, N_RB_DL);
-    }
-
-
-    if(rballoc > RIV_max)
-    {
-      //        LOG_I(PHY,"bad dci rballoc rballoc %d  RIV_max %lld \n",rballoc, RIV_max);
-        // DCI false detection
-        return(0);
-    }
-
-    if(NPRB == 0)
-    {
-        // DCI false detection
-      //        LOG_I(PHY,"bad NPRB = 0 \n");
-        return(0);
-    }
-
-    // this a retransmission
-    if(pdlsch0_harq->round>0)
-    {
-        // compare old TBS to new TBS
-        if((mcs1<29) && (pdlsch0_harq->TBS != TBStable[get_I_TBS(mcs1)][NPRB-1]))
-        {
-            // this is an eNB issue
-            // retransmisison but old and new TBS are different !!!
-            // work around, consider it as a new transmission
-            LOG_E(PHY,"Format1A Retransmission but TBS are different: consider it as new transmission !!! \n");
-            pdlsch0_harq->round = 0;
-            //return(0); // ?? to cross check
-        }
-    }
-
-    return(1);
-}
-
-int check_dci_format1c_coherency(uint8_t N_RB_DL,
-                                 DCI_INFO_EXTRACTED_t *pdci_info_extarcted,
-                                 uint16_t rnti,
-                                 uint16_t si_rnti,
-                                 uint16_t ra_rnti,
-                                 uint16_t p_rnti,
-                                 LTE_DL_UE_HARQ_t *pdlsch0_harq)
-{
-    uint32_t rballoc = pdci_info_extarcted->rballoc;
-
-    uint8_t  NPRB    = 0;
-    uint32_t RIV_max = 0;
-
-    // I- check dci content minimum coherency
-
-    if((rnti!=si_rnti) && (rnti!=p_rnti) && (rnti!=ra_rnti))
-      return(0);
-
-    switch (N_RB_DL) {
-    case 6:
-      NPRB     = RIV2nb_rb_LUT6[rballoc];//NPRB;
-      RIV_max  = RIV_max6;
-    break;
-    case 25:
-      NPRB     = RIV2nb_rb_LUT25[rballoc];//NPRB;
-      RIV_max  = RIV_max25;
-    break;
-    case 50:
-      NPRB     = RIV2nb_rb_LUT50[rballoc];//NPRB;
-      RIV_max  = RIV_max50;
-    break;
-    case 100:
-      NPRB     = RIV2nb_rb_LUT100[rballoc];//NPRB;
-      RIV_max  = RIV_max100;
-    break;
-    }
-
-   if(rballoc > RIV_max)
-   {
-      // DCI false detection
-      return(0);
-   }
-
-   if(NPRB == 0)
-   {
-      // DCI false detection
-      return(0);
-   }
-
-   return(1);
-}
-
-int check_dci_format2_2a_coherency(DCI_format_t dci_format,
-                                   uint8_t N_RB_DL,
-                                   DCI_INFO_EXTRACTED_t *pdci_info_extarcted,
-                                   uint16_t rnti,
-                                   uint16_t si_rnti,
-                                   uint16_t ra_rnti,
-                                   uint16_t p_rnti,
-                                   LTE_DL_UE_HARQ_t *pdlsch0_harq,
-                                   LTE_DL_UE_HARQ_t *pdlsch1_harq)
-{
-    uint8_t  rah  = pdci_info_extarcted->rah;
-    uint8_t  mcs1 = pdci_info_extarcted->mcs1;
-    uint8_t  mcs2 = pdci_info_extarcted->mcs2;
-    uint8_t  rv1  = pdci_info_extarcted->rv1;
-    uint8_t  rv2  = pdci_info_extarcted->rv2;
-    uint8_t  harq_pid = pdci_info_extarcted->harq_pid;
-    uint32_t rballoc  = pdci_info_extarcted->rballoc;
-
-#ifdef DEBUG_DCI
-    uint8_t  ndi1     = pdci_info_extarcted->ndi1;
-    uint8_t  ndi2     = pdci_info_extarcted->ndi2;
-#endif
-
-    uint8_t  NPRB    = 0;
-    long long RIV_max = 0;
-
-#ifdef DEBUG_DCI
-    LOG_I(PHY, "extarcted dci - dci_format %d \n", dci_format);
-    LOG_I(PHY, "extarcted dci - rnti       %d \n", rnti);
-    LOG_I(PHY, "extarcted dci - rah        %d \n", rah);
-    LOG_I(PHY, "extarcted dci - mcs1       %d \n", mcs1);
-    LOG_I(PHY, "extarcted dci - mcs2       %d \n", mcs2);
-    LOG_I(PHY, "extarcted dci - rv1        %d \n", rv1);
-    LOG_I(PHY, "extarcted dci - rv2        %d \n", rv2);
-    //LOG_I(PHY, "extarcted dci - ndi1       %d \n", ndi1);
-    //LOG_I(PHY, "extarcted dci - ndi2       %d \n", ndi2);
-    LOG_I(PHY, "extarcted dci - rballoc    %x \n", rballoc);
-    LOG_I(PHY, "extarcted dci - harq pid   %d \n", harq_pid);
-    LOG_I(PHY, "extarcted dci - round0     %d \n", pdlsch0_harq->round);
-    LOG_I(PHY, "extarcted dci - round1     %d \n", pdlsch1_harq->round);
-#endif
-
-    // I- check dci content minimum coherency
-    if(harq_pid>=8)
-    {
-      //        LOG_I(PHY,"bad harq pid\n");
-      return(0);
-    }
-
-    if( (rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti) )
-    {
-      //        LOG_I(PHY,"bad rnti\n");
-        return(0);
-    }
-
-
-    if( mcs1 > 28)
-    {
-      if(pdlsch0_harq->round == 0)
-      {
-	//          LOG_I(PHY,"bad mcs1\n");
-        return(0);
-      }
-    }
-
-    if( mcs2 > 28)
-    {
-      if(pdlsch1_harq->round == 0)
-      {
-	//          LOG_I(PHY,"bad mcs2\n");
-          return(0);
-      }
-    }
-
-
-    if((pdlsch0_harq->round == 0) && (rv1 > 0) && (mcs1 != 0))
-    {
-      // DCI false detection
-      //        LOG_I(PHY,"bad rv1\n");
-      return(0);
-    }
-
-    if((pdlsch1_harq->round == 0) && (rv2 > 0) && (mcs2 != 0))
-    {
-      // DCI false detection
-      //        LOG_I(PHY,"bad rv2\n");
-      return(0);
-    }
-
-
-    switch (N_RB_DL) {
-    case 6:
-        if (rah == 0)
-        {
-            //RBG = 1;
-            RIV_max = 0x3F;
-        }
-        else
-        {
-            RIV_max  = RIV_max6;
-        }
-        break;
-    case 25:
-        if (rah == 0)
-        {
-            //RBG = 2;
-            RIV_max = 0x1FFF;
-        }
-        else
-        {
-            RIV_max  = RIV_max25;
-        }
-        break;
-    case 50:
-        if (rah == 0)
-        {
-            //RBG = 3;
-            RIV_max = 0x1FFFF;
-        }
-        else
-        {
-            RIV_max  = RIV_max50;
-        }
-        break;
-    case 100:
-        if (rah == 0)
-        {
-            //RBG = 4;
-            RIV_max  = 0x1FFFFFF;
-        }
-        else
-        {
-            RIV_max  = RIV_max100;
-        }
-        break;
-    }
-
-    NPRB = conv_nprb(rah,
-                     rballoc,
-                     N_RB_DL);
-
-
-
-   if( (rballoc > RIV_max) && (rah == 1) )
-   {
-      // DCI false detection
-     //       LOG_I(PHY,"bad rballoc %d RIV_max %lld\n", rballoc, RIV_max);
-      return(0);
-   }
-
-   if(NPRB == 0)
-   {
-      // DCI false detection
-     //       LOG_I(PHY,"bad NPRB\n");
-      return(0);
-   }
-
-   return(1);
-}
-
-void compute_llr_offset(LTE_DL_FRAME_PARMS *frame_parms,
-                        LTE_UE_PDCCH *pdcch_vars,
-                        LTE_UE_PDSCH *pdsch_vars,
-                        LTE_DL_UE_HARQ_t *dlsch0_harq,
-                        uint8_t nb_rb_alloc,
-                        uint8_t subframe)
-{
-    uint32_t pbch_pss_sss_re;
-    uint32_t crs_re;
-    uint32_t granted_re;
-    uint32_t data_re;
-    uint32_t llr_offset;
-    uint8_t symbol;
-    uint8_t symbol_mod;
-
-    pdsch_vars->llr_offset[pdcch_vars->num_pdcch_symbols] = 0;
-
-    LOG_I(PHY,"compute_llr_offset:  nb RB %d - Qm %d \n", nb_rb_alloc, dlsch0_harq->Qm);
-
-    //dlsch0_harq->rb_alloc_even;
-    //dlsch0_harq->rb_alloc_odd;
-
-    for(symbol=pdcch_vars->num_pdcch_symbols; symbol<frame_parms->symbols_per_tti; symbol++)
-    {
-        symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-        if((symbol_mod == 0) || symbol_mod == (4-frame_parms->Ncp))
-        {
-	  if (frame_parms->nb_antennas_tx == 2) 
-	    crs_re = 4;
-	  else
-	    crs_re = 2;
-        }
-        else
-        {
-            crs_re = 0;
-        }
-
-        granted_re = nb_rb_alloc * (12-crs_re);
-        pbch_pss_sss_re = adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,dlsch0_harq->Qm,subframe,symbol);
-        pbch_pss_sss_re = (double)pbch_pss_sss_re * ((double)(12-crs_re)/12);
-        data_re = granted_re - pbch_pss_sss_re;
-        llr_offset = data_re * dlsch0_harq->Qm * 2;
-
-        pdsch_vars->llr_length[symbol]   = data_re;
-        if(symbol < (frame_parms->symbols_per_tti-1))
-          pdsch_vars->llr_offset[symbol+1] = pdsch_vars->llr_offset[symbol] + llr_offset;
-
-	LOG_I(PHY,"Granted Re subframe %d / symbol %d => %d (%d RBs)\n", subframe, symbol_mod, granted_re,dlsch0_harq->nb_rb);
-	LOG_I(PHY,"Pbch/PSS/SSS Re subframe %d / symbol %d => %d \n", subframe, symbol_mod, pbch_pss_sss_re);
-	LOG_I(PHY,"CRS Re Per PRB subframe %d / symbol %d => %d \n", subframe, symbol_mod, crs_re);
-	LOG_I(PHY,"Data Re subframe %d / symbol %d => %d \n", subframe, symbol_mod, data_re);
-
-
-
-        LOG_I(PHY,"Data Re subframe %d-symbol %d => llr length %d, llr offset %d \n", subframe, symbol,
-              pdsch_vars->llr_length[symbol], pdsch_vars->llr_offset[symbol]);
-    }
-}
-void prepare_dl_decoding_format1_1A(DCI_format_t dci_format,
-                                    uint8_t N_RB_DL,
-                                    DCI_INFO_EXTRACTED_t *pdci_info_extarcted,
-                                    LTE_DL_FRAME_PARMS *frame_parms,
-                                    LTE_UE_PDCCH *pdcch_vars,
-                                    LTE_UE_PDSCH *pdsch_vars,
-                                    uint8_t  subframe,
-                                    uint16_t rnti,
-									uint16_t tc_rnti,
-                                    uint16_t si_rnti,
-                                    uint16_t ra_rnti,
-                                    uint16_t p_rnti,
-                                    LTE_DL_UE_HARQ_t *pdlsch0_harq,
-                                    LTE_UE_DLSCH_t *pdlsch0)
-{
-
-    uint8_t  harq_pid  = pdci_info_extarcted->harq_pid;
-    uint8_t  vrb_type  = pdci_info_extarcted->vrb_type;
-    uint32_t rballoc   = pdci_info_extarcted->rballoc;
-    uint8_t  mcs1      = pdci_info_extarcted->mcs1;
-    uint8_t  rv1       = pdci_info_extarcted->rv1;
-    uint8_t  ndi1      = pdci_info_extarcted->ndi1;
-    uint8_t  TPC       = pdci_info_extarcted->TPC;
-    uint8_t  rah       = pdci_info_extarcted->rah;
-    uint8_t  dai       = pdci_info_extarcted->dai;
-
-
-    uint8_t  NPRB      = 0;
-    uint8_t  NPRB4TBS  = 0;
-
-    if(dci_format == format1A)
-    {
-      switch (N_RB_DL) {
-      case 6:
-	NPRB     = RIV2nb_rb_LUT6[rballoc];
-	break;
-      case 25:
-	NPRB     = RIV2nb_rb_LUT25[rballoc];
-	break;
-      case 50:
-	NPRB     = RIV2nb_rb_LUT50[rballoc];
-	break;
-      case 100:
-	NPRB     = RIV2nb_rb_LUT100[rballoc];
-	break;
-      }
-      if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti))
-        {
-	  NPRB4TBS = (TPC&1) + 2;
-        }
-      else
-        {
-	  NPRB4TBS = NPRB;
-	  /*
-            switch (N_RB_DL) {
-            case 6:
-                NPRB     = RIV2nb_rb_LUT6[rballoc];//NPRB;
-                break;
-            case 25:
-                NPRB     = RIV2nb_rb_LUT25[rballoc];//NPRB;
-                break;
-            case 50:
-                NPRB     = RIV2nb_rb_LUT50[rballoc];//NPRB;
-                break;
-            case 100:
-                NPRB     = RIV2nb_rb_LUT100[rballoc];//NPRB;
-                break;
-            }
-
-	  */
-        }
-    }
-    else // format1
-    {
-        NPRB = conv_nprb(rah, rballoc, N_RB_DL);
-	NPRB4TBS=NPRB;
-    }
-
-    pdlsch0->current_harq_pid = harq_pid;
-    pdlsch0->active           = 1;
-    pdlsch0->rnti             = rnti;
-    if(dci_format == format1A)
-        pdlsch0->harq_ack[subframe].vDAI_DL = dai+1;
-
-    if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti))
-    {
-        pdlsch0_harq->round    = 0;
-        pdlsch0_harq->status   = ACTIVE;
-    }
-    else //CRNTI
-    {
-    	if (rnti == tc_rnti) {
-			//fix for standalone Contention Resolution Id
-	  pdlsch0_harq->DCINdi = (uint8_t)-1;
-	  LOG_D(PHY,"UE (%x/%d): Format1A DCI: C-RNTI is temporary. Set NDI = %d and to be ignored\n",
-		rnti,harq_pid,pdlsch0_harq->DCINdi);
-    	}
-
-        // NDI has been toggled or this is the first transmission
-        if ((ndi1!=pdlsch0_harq->DCINdi) || (pdlsch0_harq->first_tx==1))
-        {
-            pdlsch0_harq->round    = 0;
-            pdlsch0_harq->first_tx = 0;
-            pdlsch0_harq->status   = ACTIVE;
-
-        }else if (rv1  != 0 )
-            //NDI has not been toggled but rv was increased by eNB: retransmission
-        {
-            if (pdlsch0_harq->status == SCH_IDLE)
-                //packet was actually decoded in previous transmission (ACK was missed by eNB)
-                //However, the round is not a good check as it might have been decoded in a retransmission prior to this one.
-            {
-	      //                LOG_D(PHY,"skip pdsch decoding and report ack\n");
-                // skip pdsch decoding and report ack
-                //pdlsch0_harq->status   = SCH_IDLE;
-                pdlsch0->active       = 0;
-                pdlsch0->harq_ack[subframe].ack = 1;
-                pdlsch0->harq_ack[subframe].harq_id = harq_pid;
-                pdlsch0->harq_ack[subframe].send_harq_status = 1;
-
-                //pdlsch0_harq->first_tx = 0;
-            }
-            else  //normal retransmission
-            {
-                // nothing special to do
-            }
-        }
-        else
-        {
-            pdlsch0_harq->status   = ACTIVE;
-        }
-    }
-
-    pdlsch0_harq->DCINdi = ndi1;
-    pdlsch0_harq->mcs    = mcs1;
-    pdlsch0_harq->rvidx  = rv1;
-    pdlsch0_harq->nb_rb  = NPRB;
-
-    pdlsch0_harq->codeword     = 0;
-    pdlsch0_harq->Nl           = 1;
-    pdlsch0_harq->mimo_mode    = frame_parms->nb_antenna_ports_eNB == 1 ?SISO : ALAMOUTI;
-    pdlsch0_harq->dl_power_off = 1; //no power offset
-    pdlsch0_harq->delta_PUCCH  = delta_PUCCH_lut[TPC &3];
-
-    // compute resource allocation
-    if(dci_format == format1A)
-    {
-        switch (N_RB_DL) {
-        case 6:
-            if (vrb_type == LOCALIZED) {
-                pdlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT6[rballoc];
-                pdlsch0_harq->rb_alloc_odd[0]  = localRIV2alloc_LUT6[rballoc];
-            }
-            else {
-                pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT6[rballoc];
-                pdlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_odd_LUT6[rballoc];
-            }
-            break;
-
-        case 25:
-            if (vrb_type == LOCALIZED) {
-                pdlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT25[rballoc];
-                pdlsch0_harq->rb_alloc_odd[0]  = localRIV2alloc_LUT25[rballoc];
-            }
-            else {
-                pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT25[rballoc];
-                pdlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_odd_LUT25[rballoc];
-            }
-            break;
-
-        case 50:
-            if (vrb_type == LOCALIZED) {
-                pdlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT50_0[rballoc];
-                pdlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT50_1[rballoc];
-                pdlsch0_harq->rb_alloc_odd[0]  = localRIV2alloc_LUT50_0[rballoc];
-                pdlsch0_harq->rb_alloc_odd[1]  = localRIV2alloc_LUT50_1[rballoc];
-            } else { // DISTRIBUTED
-                if ((rballoc&(1<<10)) == 0) {
-                    rballoc = rballoc&(~(1<<10));
-                    pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
-                    pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
-                    pdlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
-                    pdlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
-                }
-                else {
-                    rballoc = rballoc&(~(1<<10));
-                    pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
-                    pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
-                    pdlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
-                    pdlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
-                }
-            }
-            break;
-
-        case 100:
-            if (vrb_type == LOCALIZED) {
-                pdlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT100_0[rballoc];
-                pdlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT100_1[rballoc];
-                pdlsch0_harq->rb_alloc_even[2] = localRIV2alloc_LUT100_2[rballoc];
-                pdlsch0_harq->rb_alloc_even[3] = localRIV2alloc_LUT100_3[rballoc];
-                pdlsch0_harq->rb_alloc_odd[0]  = localRIV2alloc_LUT100_0[rballoc];
-                pdlsch0_harq->rb_alloc_odd[1]  = localRIV2alloc_LUT100_1[rballoc];
-                pdlsch0_harq->rb_alloc_odd[2]  = localRIV2alloc_LUT100_2[rballoc];
-                pdlsch0_harq->rb_alloc_odd[3]  = localRIV2alloc_LUT100_3[rballoc];
-            } else {
-                if ((rballoc&(1<<10)) == 0) { //Gap 1
-                    rballoc = rballoc&(~(1<<12));
-                    pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT100_0[rballoc];
-                    pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT100_1[rballoc];
-                    pdlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap0_even_LUT100_2[rballoc];
-                    pdlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap0_even_LUT100_3[rballoc];
-                    pdlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap0_odd_LUT100_0[rballoc];
-                    pdlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap0_odd_LUT100_1[rballoc];
-                    pdlsch0_harq->rb_alloc_odd[2]  = distRIV2alloc_gap0_odd_LUT100_2[rballoc];
-                    pdlsch0_harq->rb_alloc_odd[3]  = distRIV2alloc_gap0_odd_LUT100_3[rballoc];
-                }
-                else { //Gap 2
-                    rballoc = rballoc&(~(1<<12));
-                    pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT100_0[rballoc];
-                    pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT100_1[rballoc];
-                    pdlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap1_even_LUT100_2[rballoc];
-                    pdlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap1_even_LUT100_3[rballoc];
-                    pdlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap1_odd_LUT100_0[rballoc];
-                    pdlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap1_odd_LUT100_1[rballoc];
-                    pdlsch0_harq->rb_alloc_odd[2]  = distRIV2alloc_gap1_odd_LUT100_2[rballoc];
-                    pdlsch0_harq->rb_alloc_odd[3]  = distRIV2alloc_gap1_odd_LUT100_3[rballoc];
-                }
-            }
-            break;
-        }
-    }
-    else // format1
-    {
-        conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,pdlsch0_harq->rb_alloc_even);
-        pdlsch0_harq->rb_alloc_odd[0]= pdlsch0_harq->rb_alloc_even[0];
-        pdlsch0_harq->rb_alloc_odd[1]= pdlsch0_harq->rb_alloc_even[1];
-        pdlsch0_harq->rb_alloc_odd[2]= pdlsch0_harq->rb_alloc_even[2];
-        pdlsch0_harq->rb_alloc_odd[3]= pdlsch0_harq->rb_alloc_even[3];
-    }
-    if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti))
-    {
-        pdlsch0_harq->TBS = TBStable[mcs1][NPRB4TBS-1];
-        pdlsch0_harq->Qm  = 2;
-    }
-    else
-    {
-        if(mcs1 < 29)
-        {
-            pdlsch0_harq->TBS = TBStable[get_I_TBS(mcs1)][NPRB4TBS-1];
-            pdlsch0_harq->Qm  = get_Qm(mcs1);
-        }
-    }
-
-    compute_llr_offset(frame_parms,
-                       pdcch_vars,
-                       pdsch_vars,
-                       pdlsch0_harq,
-                       NPRB,
-                       subframe);
-}
-
-void prepare_dl_decoding_format1C(uint8_t N_RB_DL,
-                                  DCI_INFO_EXTRACTED_t *pdci_info_extarcted,
-                                  LTE_DL_FRAME_PARMS *frame_parms,
-                                  LTE_UE_PDCCH *pdcch_vars,
-                                  LTE_UE_PDSCH *pdsch_vars,
-                                  uint32_t rnti,
-                                  uint32_t si_rnti,
-                                  uint32_t ra_rnti,
-                                  uint32_t p_rnti,
-                                  uint32_t frame,
-                                  uint8_t  subframe,
-                                  LTE_DL_UE_HARQ_t *pdlsch0_harq,
-                                  LTE_UE_DLSCH_t *pdlsch0)
-{
-
-    uint8_t  harq_pid  = pdci_info_extarcted->harq_pid;
-    uint32_t rballoc   = pdci_info_extarcted->rballoc;
-    uint8_t  mcs1      = pdci_info_extarcted->mcs1;
-    uint8_t  Ngap      = pdci_info_extarcted->Ngap;
-
-      pdlsch0_harq->round     = 0;
-      pdlsch0_harq->first_tx  = 1;
-      pdlsch0_harq->vrb_type  = DISTRIBUTED;
-
-      if (rnti==si_rnti) { // rule from Section 5.3.1 of 36.321
-        if (((frame&1) == 0) && (subframe == 5))
-           pdlsch0_harq->rvidx = (((3*((frame>>1)&3))+1)>>1)&3;  // SIB1
-        else
-           pdlsch0_harq->rvidx = (((3*(subframe&3))+1)>>1)&3;  // other SIBs
-      }
-      else if ((rnti==p_rnti) || (rnti==ra_rnti)) { // Section 7.1.7.3
-        pdlsch0_harq->rvidx = 0;
-      }
-
-
-      pdlsch0_harq->Nl           = 1;
-      pdlsch0_harq->mimo_mode    = frame_parms->nb_antenna_ports_eNB == 1 ?SISO : ALAMOUTI;
-      pdlsch0_harq->dl_power_off = 1; //no power offset
-
-      pdlsch0_harq->codeword = 0;
-      pdlsch0_harq->mcs      = mcs1;
-      pdlsch0_harq->TBS      = TBStable1C[mcs1];
-      pdlsch0_harq->Qm       = 2;
-
-
-      pdlsch0->current_harq_pid = harq_pid;
-      pdlsch0->active = 1;
-      pdlsch0->rnti   = rnti;
-
-    switch (N_RB_DL) {
-    case 6:
-        pdlsch0_harq->nb_rb            = RIV2nb_rb_LUT6[rballoc];
-        pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT6[rballoc];
-        pdlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_odd_LUT6[rballoc];
-
-        break;
-
-    case 25:
-        pdlsch0_harq->nb_rb            = RIV2nb_rb_LUT25[rballoc];
-        pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT25[rballoc];
-        pdlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_odd_LUT25[rballoc];
-        break;
-
-    case 50:
-        pdlsch0_harq->nb_rb            = RIV2nb_rb_LUT50[rballoc];
-        if (Ngap == 0) {
-            pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
-            pdlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
-            pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
-            pdlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
-        }
-        else {
-            pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT50_0[rballoc];
-            pdlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap1_odd_LUT50_0[rballoc];
-            pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT50_1[rballoc];
-            pdlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap1_odd_LUT50_1[rballoc];
-        }
-        break;
-
-    case 100:
-        pdlsch0_harq->nb_rb       = RIV2nb_rb_LUT100[rballoc];
-        if (Ngap==0) {
-            pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT100_0[rballoc];
-            pdlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap0_odd_LUT100_0[rballoc];
-            pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT100_1[rballoc];
-            pdlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap0_odd_LUT100_1[rballoc];
-            pdlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap0_even_LUT100_2[rballoc];
-            pdlsch0_harq->rb_alloc_odd[2]  = distRIV2alloc_gap0_odd_LUT100_2[rballoc];
-            pdlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap0_even_LUT100_3[rballoc];
-            pdlsch0_harq->rb_alloc_odd[3]  = distRIV2alloc_gap0_odd_LUT100_3[rballoc];
-        }
-        else {
-            pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT100_0[rballoc];
-            pdlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap1_odd_LUT100_0[rballoc];
-            pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT100_1[rballoc];
-            pdlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap1_odd_LUT100_1[rballoc];
-            pdlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap1_even_LUT100_2[rballoc];
-            pdlsch0_harq->rb_alloc_odd[2]  = distRIV2alloc_gap1_odd_LUT100_2[rballoc];
-            pdlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap1_even_LUT100_3[rballoc];
-            pdlsch0_harq->rb_alloc_odd[3]  = distRIV2alloc_gap1_odd_LUT100_3[rballoc];
-        }
-        break;
-
-    default:
-        AssertFatal(0,"Format 1C: Unknown N_RB_DL %d\n",frame_parms->N_RB_DL);
-        break;
-    }
-
-    compute_llr_offset(frame_parms,
-                       pdcch_vars,
-                       pdsch_vars,
-                       pdlsch0_harq,
-                       pdlsch0_harq->nb_rb,
-                       subframe);
-
-}
-
-void compute_precoding_info_2cw(uint8_t tpmi, uint8_t tbswap, uint16_t pmi_alloc, LTE_DL_FRAME_PARMS *frame_parms, LTE_DL_UE_HARQ_t *dlsch0_harq, LTE_DL_UE_HARQ_t *dlsch1_harq)
-{
-
-switch (tpmi) {
-          case 0:
-            dlsch0_harq->mimo_mode   = DUALSTREAM_UNIFORM_PRECODING1;
-            dlsch1_harq->mimo_mode   = DUALSTREAM_UNIFORM_PRECODING1;
-            dlsch0_harq->pmi_alloc   = pmi_extend(frame_parms,0, 1);
-            dlsch1_harq->pmi_alloc   = pmi_extend(frame_parms,0, 1);
-          break;
-          case 1:
-            dlsch0_harq->mimo_mode   = DUALSTREAM_UNIFORM_PRECODINGj;
-            dlsch1_harq->mimo_mode   = DUALSTREAM_UNIFORM_PRECODINGj;
-            dlsch0_harq->pmi_alloc   = pmi_extend(frame_parms,1, 1);
-            dlsch1_harq->pmi_alloc   = pmi_extend(frame_parms,1, 1);
-          break;
-          case 2: // PUSCH precoding
-            dlsch0_harq->mimo_mode   = DUALSTREAM_PUSCH_PRECODING;
-            dlsch1_harq->mimo_mode   = DUALSTREAM_PUSCH_PRECODING;
-            if (tbswap==0){
-              dlsch0_harq->pmi_alloc   = pmi_alloc;
-              dlsch1_harq->pmi_alloc   = pmi_alloc^0x1555;
-            } else {
-                dlsch1_harq->pmi_alloc   = pmi_alloc;
-                dlsch0_harq->pmi_alloc   = pmi_alloc^0x1555;
-            }
-#ifdef DEBUG_HARQ
-              printf ("\n \n compute_precoding_info_2cw pmi_alloc_new = %d\n", dlsch0_harq->pmi_alloc);
-  #endif
-          break;
-          default:
-          break;
-        }
-}
-
-void compute_precoding_info_1cw(uint8_t tpmi, uint16_t pmi_alloc, LTE_DL_FRAME_PARMS *frame_parms, LTE_DL_UE_HARQ_t *dlsch_harq)
-{
-
-switch (tpmi) {
-            case 0 :
-              dlsch_harq->mimo_mode   = ALAMOUTI;
-            break;
-            case 1:
-              dlsch_harq->mimo_mode   = UNIFORM_PRECODING11;
-              dlsch_harq->pmi_alloc   = pmi_extend(frame_parms,0, 0);
-            break;
-            case 2:
-              dlsch_harq->mimo_mode   = UNIFORM_PRECODING1m1;
-              dlsch_harq->pmi_alloc   = pmi_extend(frame_parms,1, 0);
-            break;
-            case 3:
-              dlsch_harq->mimo_mode   = UNIFORM_PRECODING1j;
-              dlsch_harq->pmi_alloc   = pmi_extend(frame_parms,2, 0);
-            break;
-            case 4:
-              dlsch_harq->mimo_mode   = UNIFORM_PRECODING1mj;
-              dlsch_harq->pmi_alloc   = pmi_extend(frame_parms,3, 0);
-            break;
-            case 5:
-              dlsch_harq->mimo_mode   = PUSCH_PRECODING0;
-              dlsch_harq->pmi_alloc   = pmi_alloc;//pmi_convert(frame_parms,dlsch0->pmi_alloc,0);
-            break;
-            case 6:
-              dlsch_harq->mimo_mode   = PUSCH_PRECODING1;
-              dlsch_harq->pmi_alloc   = pmi_alloc;//pmi_convert(frame_parms,dlsch0->pmi_alloc,1);
-            break;
-            }
-  #ifdef DEBUG_HARQ
-              printf ("[DCI UE] I am calling from the UE side pmi_alloc_new = %d with tpmi %d\n", dlsch_harq->pmi_alloc, tpmi);
-  #endif
-            }
-
-void compute_precoding_info_format2A(uint8_t tpmi,
-                                     uint8_t nb_antenna_ports_eNB,
-                                     uint8_t tb0_active,
-                                     uint8_t tb1_active,
-                                     LTE_DL_UE_HARQ_t *dlsch0_harq,
-                                     LTE_DL_UE_HARQ_t *dlsch1_harq)
-{
-
-    dlsch0_harq->dl_power_off = 0;
-    dlsch1_harq->dl_power_off = 0;
-
-    if (nb_antenna_ports_eNB == 2) {
-        if ((tb0_active==1) && (tb1_active==1)) {
-          dlsch0_harq->mimo_mode = LARGE_CDD;
-          dlsch1_harq->mimo_mode = LARGE_CDD;
-          dlsch0_harq->dl_power_off = 1;
-          dlsch1_harq->dl_power_off = 1;
-        } else {
-          dlsch0_harq->mimo_mode   = ALAMOUTI;
-          dlsch1_harq->mimo_mode   = ALAMOUTI;
-        }
-      } else if (nb_antenna_ports_eNB == 4) { // 4 antenna case
-        if ((tb0_active==1) && (tb1_active==1)) {
-          switch (tpmi) {
-          case 0: // one layer per transport block
-            dlsch0_harq->mimo_mode   = LARGE_CDD;
-            dlsch1_harq->mimo_mode   = LARGE_CDD;
-            dlsch0_harq->dl_power_off = 1;
-            dlsch1_harq->dl_power_off = 1;
-            break;
-
-          case 1: // one-layers on TB 0, two on TB 1
-            dlsch0_harq->mimo_mode   = LARGE_CDD;
-            dlsch1_harq->mimo_mode   = LARGE_CDD;
-            dlsch1_harq->Nl          = 2;
-            dlsch0_harq->dl_power_off = 1;
-            dlsch1_harq->dl_power_off = 1;
-            break;
-
-          case 2: // two-layers on TB 0, two on TB 1
-            dlsch0_harq->mimo_mode   = LARGE_CDD;
-            dlsch1_harq->mimo_mode   = LARGE_CDD;
-            dlsch0_harq->Nl          = 2;
-            dlsch0_harq->dl_power_off = 1;
-            dlsch1_harq->dl_power_off = 1;
-            break;
-
-          case 3: //
-            LOG_E(PHY,"Illegal value (3) for TPMI in Format 2A DCI\n");
-            break;
-          }
-        } else if (tb0_active == 1) {
-          switch (tpmi) {
-          case 0: // one layer per transport block
-            dlsch0_harq->mimo_mode   = ALAMOUTI;
-            dlsch1_harq->mimo_mode   = ALAMOUTI;
-            break;
-
-          case 1: // two-layers on TB 0
-            dlsch0_harq->mimo_mode   = LARGE_CDD;
-            dlsch0_harq->Nl          = 2;
-            dlsch0_harq->dl_power_off = 1;
-            break;
-
-          case 2: // two-layers on TB 0, two on TB 1
-          case 3: //
-            LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi);
-            break;
-          }
-        } else if (tb1_active == 1) {
-          switch (tpmi) {
-          case 0: // one layer per transport block
-            dlsch0_harq->mimo_mode   = ALAMOUTI;
-            dlsch1_harq->mimo_mode   = ALAMOUTI;
-            break;
-
-          case 1: // two-layers on TB 0
-            dlsch1_harq->mimo_mode   = LARGE_CDD;
-            dlsch1_harq->Nl          = 2;
-            dlsch0_harq->dl_power_off = 1;
-            break;
-
-          case 2: // two-layers on TB 0, two on TB 1
-          case 3: //
-            LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi);
-            break;
-          }
-        }
-      }
-      //    printf("Format 2A: NPRB=%d (rballoc %x,mcs1 %d, mcs2 %d, frame_type %d N_RB_DL %d,active %d/%d)\n",NPRB,rballoc,mcs1,mcs2,frame_parms->frame_type,frame_parms->N_RB_DL,dlsch0->active,dlsch1->active);
-      //printf("UE (%x/%d): Subframe %d Format2A DCI: ndi1 %d, old_ndi1 %d, ndi2 %d, old_ndi2 %d (first tx1 %d, first tx2 %d) harq_status1 %d, harq_status2 %d\n",dlsch0->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi,
-      //    dlsch0_harq->first_tx,dlsch1_harq->first_tx,dlsch0_harq->status,dlsch1_harq->status);
-      //printf("TBS0 %d, TBS1 %d\n",dlsch0_harq->TBS,dlsch1_harq->TBS);
-
-}
-
-void prepare_dl_decoding_format2_2A(DCI_format_t dci_format,
-                                    DCI_INFO_EXTRACTED_t *pdci_info_extarcted,
-                                    LTE_DL_FRAME_PARMS *frame_parms,
-                                    LTE_UE_PDCCH *pdcch_vars,
-                                    LTE_UE_PDSCH *pdsch_vars,
-                                    uint16_t rnti,
-                                    uint8_t subframe,
-                                    LTE_DL_UE_HARQ_t *dlsch0_harq,
-                                    LTE_DL_UE_HARQ_t *dlsch1_harq,
-                                    LTE_UE_DLSCH_t *pdlsch0,
-                                    LTE_UE_DLSCH_t *pdlsch1)
-{
-
-    uint8_t  rah  = pdci_info_extarcted->rah;
-    uint8_t  mcs1 = pdci_info_extarcted->mcs1;
-    uint8_t  mcs2 = pdci_info_extarcted->mcs2;
-    uint8_t  rv1  = pdci_info_extarcted->rv1;
-    uint8_t  rv2  = pdci_info_extarcted->rv2;
-    uint8_t  harq_pid = pdci_info_extarcted->harq_pid;
-    uint32_t rballoc  = pdci_info_extarcted->rballoc;
-    uint8_t  tbswap   = pdci_info_extarcted->tb_swap;
-    uint8_t  tpmi     = pdci_info_extarcted->tpmi;
-    uint8_t  TPC      = pdci_info_extarcted->TPC;
-    uint8_t  ndi1     = pdci_info_extarcted->ndi1;
-    uint8_t  ndi2     = pdci_info_extarcted->ndi2;
-
-    uint8_t TB0_active = 1;
-    uint8_t TB1_active = 1;
-
-   // printf("inside prepare pdlsch1->pmi_alloc %d \n",pdlsch1->pmi_alloc);
-
-
-      if ((rv1 == 1) && (mcs1 == 0)) {
-        TB0_active=0;
-      }
-      if ((rv2 == 1) && (mcs2 == 0)) {
-        TB1_active=0;
-      }
-
-#ifdef DEBUG_HARQ
-      printf("[DCI UE]: TB0 status %d , TB1 status %d\n", TB0_active, TB1_active);
-#endif
-
-        dlsch0_harq->mcs      = mcs1;
-        dlsch1_harq->mcs      = mcs2;
-        dlsch0_harq->rvidx    = rv1;
-        dlsch1_harq->rvidx    = rv2;
-        dlsch0_harq->DCINdi   = ndi1;
-        dlsch1_harq->DCINdi   = ndi2;
-
-        dlsch0_harq->codeword = 0;
-        dlsch1_harq->codeword = 1;
-        dlsch0_harq->Nl       = 1;
-        dlsch1_harq->Nl       = 1;
-        dlsch0_harq->delta_PUCCH  = delta_PUCCH_lut[TPC&3];
-        dlsch1_harq->delta_PUCCH  = delta_PUCCH_lut[TPC&3];
-        dlsch0_harq->dl_power_off = 1;
-        dlsch1_harq->dl_power_off = 1;
-
-        pdlsch0->current_harq_pid = harq_pid;
-        pdlsch0->harq_ack[subframe].harq_id     = harq_pid;
-        pdlsch1->current_harq_pid = harq_pid;
-        pdlsch1->harq_ack[subframe].harq_id     = harq_pid;
-
-        // assume two CW are active
-        dlsch0_harq->status   = ACTIVE;
-        dlsch1_harq->status   = ACTIVE;
-        pdlsch0->active = 1;
-        pdlsch1->active = 1;
-        pdlsch0->rnti = rnti;
-        pdlsch1->rnti = rnti;
-
-
-      if (TB0_active && TB1_active && tbswap==1) {
-        dlsch0_harq->codeword = 1;
-        dlsch1_harq->codeword = 0;
-      }
-
-
-      if (!TB0_active && TB1_active){
-        dlsch1_harq->codeword = 0;
-      }
-
-      if (TB0_active && !TB1_active){
-        dlsch0_harq->codeword = 0;
-      }
-
-
-      if (TB0_active==0) {
-        dlsch0_harq->status = SCH_IDLE;
-        pdlsch0->active     = 0;
-  #ifdef DEBUG_HARQ
-        printf("[DCI UE]: TB0 is deactivated, retransmit TB1 transmit in TM6\n");
-  #endif
-      }
-
-      if (TB1_active==0) {
-        dlsch1_harq->status = SCH_IDLE;
-        pdlsch1->active     = 0;
-      }
-
-#ifdef DEBUG_HARQ
-      printf("[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status);
-#endif
-
-      // compute resource allocation
-      if (TB0_active == 1){
-
-        dlsch0_harq->nb_rb = conv_nprb(rah,
-                                       rballoc,
-                                       frame_parms->N_RB_DL);
-        conv_rballoc(rah,
-                     rballoc,
-                     frame_parms->N_RB_DL,
-                     dlsch0_harq->rb_alloc_even);
-
-        dlsch0_harq->rb_alloc_odd[0]= dlsch0_harq->rb_alloc_even[0];
-        dlsch0_harq->rb_alloc_odd[1]= dlsch0_harq->rb_alloc_even[1];
-        dlsch0_harq->rb_alloc_odd[2]= dlsch0_harq->rb_alloc_even[2];
-        dlsch0_harq->rb_alloc_odd[3]= dlsch0_harq->rb_alloc_even[3];
-
-        if (TB1_active == 1){
-          dlsch1_harq->rb_alloc_even[0]= dlsch0_harq->rb_alloc_even[0];
-          dlsch1_harq->rb_alloc_even[1]= dlsch0_harq->rb_alloc_even[1];
-          dlsch1_harq->rb_alloc_even[2]= dlsch0_harq->rb_alloc_even[2];
-          dlsch1_harq->rb_alloc_even[3]= dlsch0_harq->rb_alloc_even[3];
-          dlsch1_harq->rb_alloc_odd[0] = dlsch0_harq->rb_alloc_odd[0];
-          dlsch1_harq->rb_alloc_odd[1] = dlsch0_harq->rb_alloc_odd[1];
-          dlsch1_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_odd[2];
-          dlsch1_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_odd[3];
-
-          dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
-
-          //dlsch0_harq->Nl       = 1;
-          //dlsch1_harq->Nl       = 1;
-        }
-      } else if ((TB0_active == 0) && (TB1_active == 1)){
-
-          conv_rballoc(rah,
-                       rballoc,
-                       frame_parms->N_RB_DL,
-                       dlsch1_harq->rb_alloc_even);
-
-          dlsch1_harq->rb_alloc_odd[0]= dlsch1_harq->rb_alloc_even[0];
-          dlsch1_harq->rb_alloc_odd[1]= dlsch1_harq->rb_alloc_even[1];
-          dlsch1_harq->rb_alloc_odd[2]= dlsch1_harq->rb_alloc_even[2];
-          dlsch1_harq->rb_alloc_odd[3]= dlsch1_harq->rb_alloc_even[3];
-          dlsch1_harq->nb_rb = conv_nprb(rah,
-                                         rballoc,
-                                         frame_parms->N_RB_DL);
-        }
-
-
-      // compute precoding matrix + mimo mode
-      if(dci_format == format2)
-      {
-      if ((TB0_active) && (TB1_active)){  //two CW active
-        compute_precoding_info_2cw(tpmi, tbswap, pdlsch0->pmi_alloc,frame_parms, dlsch0_harq, dlsch1_harq);
-
-   //   printf("[DCI UE 1]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status);
-      } else if ((TB0_active) && (!TB1_active))  { // only CW 0 active
-        compute_precoding_info_1cw(tpmi, pdlsch0->pmi_alloc, frame_parms, dlsch0_harq);
-      } else {
-        compute_precoding_info_1cw(tpmi, pdlsch1->pmi_alloc, frame_parms, dlsch1_harq);
-       // printf("I am doing compute_precoding_info_1cw with tpmi %d \n", tpmi);
-      }
-      //printf(" UE DCI harq0 MIMO mode = %d\n", dlsch0_harq->mimo_mode);
-      if ((frame_parms->nb_antenna_ports_eNB == 1) && (TB0_active))
-        dlsch0_harq->mimo_mode   = SISO;
-      }
-      else
-      {
-        compute_precoding_info_format2A( tpmi,
-                                      frame_parms->nb_antenna_ports_eNB,
-                                      TB0_active,
-                                      TB1_active,
-                                      dlsch0_harq,
-                                      dlsch1_harq);
-      }
-  //    printf("[DCI UE 2]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status);
-      // reset round + compute Qm
-      if (TB0_active) {
-       // printf("TB0 ndi1 =%d, dlsch0_harq->DCINdi =%d, dlsch0_harq->first_tx = %d\n", ndi1, dlsch0_harq->DCINdi, dlsch0_harq->first_tx);
-        if ((ndi1!=dlsch0_harq->DCINdi) || (dlsch0_harq->first_tx==1))  {
-          dlsch0_harq->round = 0;
-           dlsch0_harq->status = ACTIVE;
-           dlsch0_harq->DCINdi = ndi1;
-
-          //LOG_I(PHY,"[UE] DLSCH: New Data Indicator CW0 subframe %d (pid %d, round %d)\n",
-          //           subframe,harq_pid,dlsch0_harq->round);
-          if ( dlsch0_harq->first_tx==1) {
-	    //            LOG_D(PHY,"Format 2 DCI First TX0: Clearing flag\n");
-            dlsch0_harq->first_tx = 0;
-          }
-        }
-	/*else if (rv1  != 0 )
-	  //NDI has not been toggled but rv was increased by eNB: retransmission
-	  {
-	    if(dlsch0_harq->status == SCH_IDLE) {
-            // skip pdsch decoding and report ack
-	      //dlsch0_harq->status   = SCH_IDLE;
-            pdlsch0->active       = 0;
-            pdlsch0->harq_ack[subframe].ack = 1;
-            pdlsch0->harq_ack[subframe].harq_id = harq_pid;
-            pdlsch0->harq_ack[subframe].send_harq_status = 1;
-	    }*/
-
-        // if Imcs in [29..31] TBS is assumed to be as determined from DCI transported in the latest
-        // PDCCH for the same trasport block using Imcs in [0 .. 28]
-        if(dlsch0_harq->mcs <= 28)
-        {
-            dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
-            LOG_D(PHY,"[UE] DLSCH: New TBS CW0 subframe %d (pid %d, round %d) TBS %d \n",
-                       subframe,harq_pid,dlsch0_harq->round, dlsch0_harq->TBS);
-        }
-        else
-        {
-            LOG_D(PHY,"[UE] DLSCH: Keep the same TBS CW0 subframe %d (pid %d, round %d) TBS %d \n",
-                       subframe,harq_pid,dlsch0_harq->round, dlsch0_harq->TBS);
-        }
-        //if(dlsch0_harq->Nl == 2)
-        //dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
-        if (mcs1 <= 28)
-            dlsch0_harq->Qm = get_Qm(mcs1);
-        else if (mcs1<=31)
-            dlsch0_harq->Qm = (mcs1-28)<<1;
-      }
-
-   //   printf("[DCI UE 3]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status);
-
-      if (TB1_active) {
-       // printf("TB1 ndi2 =%d, dlsch1_harq->DCINdi =%d, dlsch1_harq->first_tx = %d\n", ndi2, dlsch1_harq->DCINdi, dlsch1_harq->first_tx);
-        if ((ndi2!=dlsch1_harq->DCINdi) || (dlsch1_harq->first_tx==1)) {
-          dlsch1_harq->round = 0;
-          dlsch1_harq->status = ACTIVE;
-          dlsch1_harq->DCINdi = ndi2;
-          //LOG_I(PHY,"[UE] DLSCH: New Data Indicator CW1 subframe %d (pid %d, round %d)\n",
-          //           subframe,harq_pid,dlsch0_harq->round);
-          if (dlsch1_harq->first_tx==1) {
-	    //            LOG_D(PHY,"Format 2 DCI First TX1: Clearing flag\n");
-            dlsch1_harq->first_tx = 0;
-          }
-        }
-	/*else if (rv1  != 0 )
-	//NDI has not been toggled but rv was increased by eNB: retransmission
-	  {
-	    if(dlsch1_harq->status == SCH_IDLE) {
-            // skip pdsch decoding and report ack
-	      //dlsch1_harq->status   = SCH_IDLE;
-            pdlsch1->active       = 0;
-            pdlsch1->harq_ack[subframe].ack = 1;
-            pdlsch1->harq_ack[subframe].harq_id = harq_pid;
-            pdlsch1->harq_ack[subframe].send_harq_status = 1;
-         }
-	  }*/
-
-        // if Imcs in [29..31] TBS is assumed to be as determined from DCI transported in the latest
-        // PDCCH for the same trasport block using Imcs in [0 .. 28]
-        if(dlsch1_harq->mcs <= 28)
-        {
-            dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
-            LOG_D(PHY,"[UE] DLSCH: New TBS CW1 subframe %d (pid %d, round %d) TBS %d \n",
-                       subframe,harq_pid,dlsch1_harq->round, dlsch1_harq->TBS);
-        }
-        else
-        {
-            LOG_D(PHY,"[UE] DLSCH: Keep the same TBS CW1 subframe %d (pid %d, round %d) TBS %d \n",
-                       subframe,harq_pid,dlsch1_harq->round, dlsch1_harq->TBS);
-        }
-        if (mcs2 <= 28)
-            dlsch1_harq->Qm = get_Qm(mcs2);
-        else if (mcs1<=31)
-            dlsch1_harq->Qm = (mcs2-28)<<1;
-      }
-
-
-      compute_llr_offset(frame_parms,
-                         pdcch_vars,
-                         pdsch_vars,
-                         dlsch0_harq,
-                         dlsch0_harq->nb_rb,
-                         subframe);
-
-
- /* #ifdef DEBUG_HARQ
-      printf("[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status);
-      printf("[DCI UE]: TB0_active %d , TB1_active %d\n", TB0_active, TB1_active);
-      if (dlsch0 != NULL && dlsch1 != NULL)
-        printf("[DCI UE] dlsch0_harq status = %d, dlsch1_harq status = %d\n", dlsch0_harq->status, dlsch1_harq->status);
-      else if (dlsch0 == NULL && dlsch1 != NULL)
-        printf("[DCI UE] dlsch0_harq NULL dlsch1_harq status = %d\n", dlsch1_harq->status);
-      else if (dlsch0 != NULL && dlsch1 == NULL)
-        printf("[DCI UE] dlsch1_harq NULL dlsch0_harq status = %d\n", dlsch0_harq->status);
-  #endif*/
-}
-
-int generate_ue_dlsch_params_from_dci(int frame,
-                                      uint8_t subframe,
-                                      void *dci_pdu,
-                                      uint16_t rnti,
-                                      DCI_format_t dci_format,
-                                      LTE_UE_PDCCH *pdcch_vars,
-                                      LTE_UE_PDSCH *pdsch_vars,
-                                      LTE_UE_DLSCH_t **dlsch,
-                                      LTE_DL_FRAME_PARMS *frame_parms,
-                                      PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
-                                      uint16_t si_rnti,
-                                      uint16_t ra_rnti,
-                                      uint16_t p_rnti,
-                                      uint8_t beamforming_mode,
-                                      uint16_t tc_rnti)
-{
-
-    uint8_t harq_pid=0;
-    uint8_t frame_type=frame_parms->frame_type;
-    uint8_t tpmi=0;
-    LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
-    LTE_DL_UE_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
-
-    DCI_INFO_EXTRACTED_t dci_info_extarcted;
-    uint8_t status=0;
-
-    if (!dlsch[0]) return -1;
-
-  #ifdef DEBUG_DCI
-    LOG_D(PHY,"dci_tools.c: Filling ue dlsch params -> rnti %x, SFN/SF %d/%d, dci_format %s\n",
-        rnti,
-        frame%1024,
-        subframe,
-        (dci_format==format0?  "Format 0":(
-         dci_format==format1?  "format 1":(
-         dci_format==format1A? "format 1A":(
-         dci_format==format1B? "format 1B":(
-         dci_format==format1C? "format 1C":(
-         dci_format==format1D? "format 1D":(
-         dci_format==format1E_2A_M10PRB? "format 1E_2A_M10PRB":(
-         dci_format==format2?  "format 2":(
-         dci_format==format2A? "format 2A":(
-         dci_format==format2B? "format 2B":(
-         dci_format==format2C? "format 2C":(
-         dci_format==format2D? "format 2D":(
-         dci_format==format3?  "format 3": "UNKNOWN"
-         ))))))))))))));
-  #endif
-
-    memset(&dci_info_extarcted,0,sizeof(dci_info_extarcted));
-    switch (dci_format) {
-
-    case format0:   // This is an ULSCH allocation so nothing here, inform MAC
-      LOG_E(PHY,"format0 not possible\n");
-      return(-1);
-      break;
-
-    case format1A:
-    {
-      // extract dci infomation
-#ifdef DEBUG_DCI
-      LOG_I(PHY,"[DCI-FORMAT-1A] AbsSubframe %d.%d extarct dci info \n", frame, subframe);
-#endif
-      extract_dci1A_info(frame_parms->N_RB_DL,
-                         frame_type,
-                         dci_pdu,
-                         &dci_info_extarcted);
-
-
-      // check dci content
-      dlsch0 = dlsch[0];
-      dlsch0->active = 0;
-      dlsch0_harq   = dlsch[0]->harq_processes[dci_info_extarcted.harq_pid];
-#ifdef DEBUG_DCI
-      LOG_I(PHY,"[DCI-FORMAT-1A] AbsSubframe %d.%d check dci coherency \n", frame, subframe);
-#endif
-      status = check_dci_format1_1a_coherency(format1A,
-                                              frame_parms->N_RB_DL,
-                                              rnti,
-                                              tc_rnti,
-                                              si_rnti,
-                                              ra_rnti,
-                                              p_rnti,frame,subframe,
-                                              &dci_info_extarcted,
-                                              dlsch0_harq);
-      if(status == 0)
-      {
-        printf("bad DCI 1A !!! \n");
-        return(-1);
-      }
-
-      // dci is correct ==> update internal structure and prepare dl decoding
-#ifdef DEBUG_DCI
-      LOG_I(PHY,"[DCI-FORMAT-1A] AbsSubframe %d.%d prepare dl decoding \n", frame, subframe);
-#endif
-      prepare_dl_decoding_format1_1A(format1A,
-                                     frame_parms->N_RB_DL,
-                                     &dci_info_extarcted,
-                                     frame_parms,
-                                     pdcch_vars,
-                                     pdsch_vars,
-                                     subframe,
-                                     rnti,
-									 tc_rnti,
-                                     si_rnti,
-                                     ra_rnti,
-                                     p_rnti,
-                                     dlsch0_harq,
-                                     dlsch0);
-
-
-
-      break;
-    }
-    case format1C:
-    {
-      // extract dci infomation
-#ifdef DEBUG_DL_DECODING
-      LOG_I(PHY,"[DCI Format-1C] extact dci information \n");
-#endif
-      extract_dci1C_info(frame_parms->N_RB_DL,
-                         frame_type,
-                         dci_pdu,
-                         &dci_info_extarcted);
-
-
-      // check dci content
-#ifdef DEBUG_DL_DECODING
-      LOG_I(PHY,"[DCI Format-1C] check dci content \n");
-#endif
-      dlsch0 = dlsch[0];
-      dlsch0->active = 0;
-      dlsch0_harq = dlsch[0]->harq_processes[dci_info_extarcted.harq_pid];
-
-      status = check_dci_format1c_coherency(frame_parms->N_RB_DL,
-                                            &dci_info_extarcted,
-                                            rnti,
-                                            si_rnti,
-                                            ra_rnti,
-                                            p_rnti,
-                                            dlsch0_harq);
-      if(status == 0)
-        return(-1);
-
-      // dci is correct ==> update internal structure and prepare dl decoding
-#ifdef DEBUG_DL_DECODING
-      LOG_I(PHY,"[DCI Format-1C] prepare downlink decoding \n");
-#endif
-      prepare_dl_decoding_format1C(frame_parms->N_RB_DL,
-                                   &dci_info_extarcted,
-                                   frame_parms,
-                                   pdcch_vars,
-                                   pdsch_vars,
-                                   rnti,
-                                   si_rnti,
-                                   ra_rnti,
-                                   p_rnti,
-                                   frame,
-                                   subframe,
-                                   dlsch0_harq,
-                                   dlsch0);
-
-      break;
-    }
-
-    case format1:
-    {
-      // extract dci infomation
-#ifdef DEBUG_DCI
-      LOG_I(PHY,"[DCI-FORMAT-1] AbsSubframe %d.%d extarct dci info \n", frame, subframe);
-#endif
-      extract_dci1_info(frame_parms->N_RB_DL,
-                         frame_type,
-                         dci_pdu,
-                         &dci_info_extarcted);
-
-      // check dci content
-      dlsch0 = dlsch[0];
-      dlsch0->active = 0;
-      dlsch0_harq = dlsch[0]->harq_processes[dci_info_extarcted.harq_pid];
-
-#ifdef DEBUG_DCI
-      LOG_I(PHY,"[DCI-FORMAT-1] AbsSubframe %d.%d check dci coherency \n", frame, subframe);
-#endif
-      status = check_dci_format1_1a_coherency(format1,
-                                              frame_parms->N_RB_DL,
-                                              rnti,
-                                              tc_rnti,
-                                              si_rnti,
-                                              ra_rnti,
-                                              p_rnti,frame,subframe,
-                                              &dci_info_extarcted,
-                                              dlsch0_harq);
-      if(status == 0)
-      {
-          printf("bad DCI 1 !!! \n");
-          return(-1);
-      }
-
-
-      // dci is correct ==> update internal structure and prepare dl decoding
-#ifdef DEBUG_DCI
-      LOG_I(PHY,"[DCI-FORMAT-1] AbsSubframe %d.%d prepare dl decoding \n", frame, subframe);
-#endif
-      prepare_dl_decoding_format1_1A(format1,
-                                     frame_parms->N_RB_DL,
-                                     &dci_info_extarcted,
-                                     frame_parms,
-                                     pdcch_vars,
-                                     pdsch_vars,
-                                     subframe,
-                                     rnti,
-									 tc_rnti,
-                                     si_rnti,
-                                     ra_rnti,
-                                     p_rnti,
-                                     dlsch0_harq,
-                                     dlsch0);
-      break;
-    }
-
-    case format2:
-    {
-        // extract dci infomation
-        //LOG_I(PHY,"[DCI-format2] AbsSubframe %d.%d extract dci infomation \n", frame, subframe);
-        extract_dci2_info(frame_parms->N_RB_DL,
-                frame_type,
-                frame_parms->nb_antenna_ports_eNB,
-                dci_pdu,
-                &dci_info_extarcted);
-
-
-        // check dci content
-        dlsch[0]->active = 1;
-        dlsch[1]->active = 1;
-
-            dlsch0 = dlsch[0];
-            dlsch1 = dlsch[1];
-
-    dlsch0_harq = dlsch0->harq_processes[dci_info_extarcted.harq_pid];
-    dlsch1_harq = dlsch1->harq_processes[dci_info_extarcted.harq_pid];
-   // printf("before coherency dlsch[1]->pmi_alloc %d\n",dlsch[1]->pmi_alloc);
-   // printf("before coherency dlsch1->pmi_alloc %d\n",dlsch1->pmi_alloc);
-   // printf("before coherency dlsch1_harq->pmi_alloc %d\n",dlsch1_harq->pmi_alloc);
-
-        //LOG_I(PHY,"[DCI-format2] check dci content \n");
-        status = check_dci_format2_2a_coherency(format2,
-                frame_parms->N_RB_DL,
-                &dci_info_extarcted,
-                rnti,
-                si_rnti,
-                ra_rnti,
-                p_rnti,
-                dlsch0_harq,
-                dlsch1_harq);
-        if(status == 0)
-            return(-1);
-
-
-        // dci is correct ==> update internal structure and prepare dl decoding
-        //LOG_I(PHY,"[DCI-format2] update internal structure and prepare dl decoding \n");
-        prepare_dl_decoding_format2_2A(format2,
-                &dci_info_extarcted,
-                frame_parms,
-                pdcch_vars,
-                pdsch_vars,
-                rnti,
-                subframe,
-                dlsch0_harq,
-                dlsch1_harq,
-                dlsch0,
-                dlsch1);
-    }
-    break;
-
-    case format2A:
-    {
-    // extract dci infomation
-    LOG_I(PHY,"[DCI-format2] AbsSubframe %d.%d extract dci infomation \n", frame%1024, subframe);
-    extract_dci2A_info(frame_parms->N_RB_DL,
-                       frame_type,
-                       frame_parms->nb_antenna_ports_eNB,
-                       dci_pdu,
-                       &dci_info_extarcted);
-
-    // check dci content
-    //LOG_I(PHY,"[DCI-format2A] check dci content \n");
-    //LOG_I(PHY,"[DCI-format2A] tb_swap %d harq_pid %d\n", dci_info_extarcted.tb_swap, dci_info_extarcted.harq_pid);
-      //dlsch[0]->active = 0;
-      //dlsch[1]->active = 0;
-
-    if (dci_info_extarcted.tb_swap == 0) {
-      dlsch0 = dlsch[0];
-      dlsch1 = dlsch[1];
-    } else {
-      dlsch0 = dlsch[1];
-      dlsch1 = dlsch[0];
-    }
-    dlsch0_harq = dlsch0->harq_processes[dci_info_extarcted.harq_pid];
-    dlsch1_harq = dlsch1->harq_processes[dci_info_extarcted.harq_pid];
-
-    //LOG_I(PHY,"[DCI-format2A] check dci content \n");
-    status = check_dci_format2_2a_coherency(format2A,
-                                              frame_parms->N_RB_DL,
-                                              &dci_info_extarcted,
-                                              rnti,
-                                              si_rnti,
-                                              ra_rnti,
-                                              p_rnti,
-                                              dlsch0_harq,
-                                              dlsch1_harq);
-    if(status == 0)
-      return(-1);
-
-    // dci is correct ==> update internal structure and prepare dl decoding
-    //LOG_I(PHY,"[DCI-format2A] update internal structure and prepare dl decoding \n");
-    prepare_dl_decoding_format2_2A(format2A,
-                                   &dci_info_extarcted,
-                                   frame_parms,
-                                   pdcch_vars,
-                                   pdsch_vars,
-                                   rnti,
-                                   subframe,
-                                   dlsch0_harq,
-                                   dlsch1_harq,
-                                   dlsch0,
-                                   dlsch1);
-    }
-      break;
-
-    case format1E_2A_M10PRB:
-      if (!dlsch[0]) return -1;
-
-      harq_pid  = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->harq_pid;
-
-      if (harq_pid>=8) {
-        LOG_E(PHY,"Format 1E_2A_M10PRB: harq_pid=%d >= 8\n", harq_pid);
-        return(-1);
-      }
-
-      dlsch[0]->current_harq_pid = harq_pid;
-      dlsch[0]->harq_ack[subframe].harq_id = harq_pid;
-
-      /*
-        tbswap = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tb_swap;
-        if (tbswap == 0) {
-        dlsch0 = dlsch[0];
-        dlsch1 = dlsch[1];
-        }
-        else{
-        dlsch0 = dlsch[1];
-        dlsch1 = dlsch[0];
-        }
-      */
-      dlsch0 = dlsch[0];
-
-      dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
-      // Needs to be checked
-      dlsch0_harq->codeword=0;
-      conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
-                   ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL,
-                   dlsch0_harq->rb_alloc_even);
-
-      dlsch0_harq->rb_alloc_odd[0]                         = dlsch0_harq->rb_alloc_even[0];
-      dlsch0_harq->rb_alloc_odd[1]                         = dlsch0_harq->rb_alloc_even[1];
-      dlsch0_harq->rb_alloc_odd[2]                         = dlsch0_harq->rb_alloc_even[2];
-      dlsch0_harq->rb_alloc_odd[3]                         = dlsch0_harq->rb_alloc_even[3];
-      /*
-      dlsch1_harq->rb_alloc_even[0]                         = dlsch0_harq->rb_alloc_even[0];
-      dlsch1_harq->rb_alloc_even[1]                         = dlsch0_harq->rb_alloc_even[1];
-      dlsch1_harq->rb_alloc_even[2]                         = dlsch0_harq->rb_alloc_even[2];
-      dlsch1_harq->rb_alloc_even[3]                         = dlsch0_harq->rb_alloc_even[3];
-      */
-      dlsch0_harq->nb_rb                               = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
-								   ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,
-								   frame_parms->N_RB_DL);
-      //dlsch1_harq->nb_rb                               = dlsch0_harq->nb_rb;
-
-      dlsch0_harq->mcs             = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
-      dlsch0_harq->delta_PUCCH     = delta_PUCCH_lut[((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->TPC&3];
-
-
-
-      /*
-        if (dlsch0_harq->mcs>20) {
-        printf("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs);
-        return(-1);
-        }
-      */
-
-      //dlsch1_harq->mcs       = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2;
-      dlsch0_harq->rvidx     = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv;
-      //dlsch1_harq->rvidx     = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2;
-
-      // check if either TB is disabled (see 36-213 V8.6 p. 26)
-
-      if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
-        dlsch0_harq->status = DISABLED;
-      }
-
-      //if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
-      //dlsch1_harq->status = DISABLED;
-      //}
-      dlsch0_harq->Nl        = 1;
-
-      //dlsch0->layer_index                         = tbswap;
-      //dlsch1->layer_index                         = 1-tbswap;
-
-
-      // Fix this
-      tpmi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tpmi;
-      //    printf("ue: tpmi %d\n",tpmi);
-
-      switch (tpmi) {
-      case 0 :
-        dlsch0_harq->mimo_mode   = ALAMOUTI;
-        break;
-
-      case 1:
-        dlsch0_harq->mimo_mode   = UNIFORM_PRECODING11;
-        dlsch0_harq->pmi_alloc   = pmi_extend(frame_parms,0,0);
-        break;
-
-      case 2:
-        dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1m1;
-        dlsch0_harq->pmi_alloc   = pmi_extend(frame_parms,1, 0);
-        break;
-
-      case 3:
-        dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1j;
-        dlsch0_harq->pmi_alloc   = pmi_extend(frame_parms,2, 0);
-
-        break;
-
-      case 4:
-        dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1mj;
-        dlsch0_harq->pmi_alloc   = pmi_extend(frame_parms,3, 0);
-        break;
-
-      case 5:
-        dlsch0_harq->mimo_mode   = PUSCH_PRECODING0;
-        // pmi stored from ulsch allocation routine
-        dlsch0_harq->pmi_alloc   = dlsch0->pmi_alloc;
-        //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc));
-        break;
-
-
-      case 6:
-        dlsch0_harq->mimo_mode   = PUSCH_PRECODING1;
-        LOG_E(PHY,"Unsupported TPMI\n");
-        return(-1);
-        break;
-      }
-
-
-      if (frame_parms->nb_antenna_ports_eNB == 1)
-        dlsch0_harq->mimo_mode   = SISO;
-
-
-      if ((dlsch0_harq->DCINdi != ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi) ||
-	(dlsch0_harq->first_tx==1)) {
-
-        dlsch0_harq->round = 0;
-	dlsch0_harq->first_tx = 0;
-        dlsch0_harq->status = ACTIVE;
-      }
-      /*
-	else if (dlsch0_harq->status == SCH_IDLE) { // we got same ndi for a previously decoded process,
-        // this happens if either another harq process in the same
-        // is NAK or an ACK was not received
-
-        dlsch0->harq_ack[subframe].ack              = 1;
-        dlsch0->harq_ack[subframe].harq_id          = harq_pid;
-        dlsch0->harq_ack[subframe].send_harq_status = 1;
-        dlsch0->active = 0;
-        return(0);
-      }
-      */
-
-      dlsch0_harq->DCINdi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi;
-      dlsch0_harq->mcs    = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
-
-      if (dlsch0_harq->nb_rb>1) {
-        dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
-      } else
-        dlsch0_harq->TBS         =0;
-
-      dlsch0->rnti = rnti;
-      //dlsch1->rnti = rnti;
-
-      dlsch0->active = 1;
-      //dlsch1->active = 1;
-
-      dlsch0_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off;
-      //dlsch1_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off;
-
-
-      break;
-
-    default:
-      LOG_E(PHY,"format %d not yet implemented\n",dci_format);
-      return(-1);
-      break;
-    }
-
-#ifdef UE_DEBUG_TRACE
-
-    if (dlsch[0] && (dlsch[0]->rnti != 0xffff)) {
-        LOG_I(PHY,"dci_format:%d Abssubframe: %d.%d \n",dci_format,frame%1024,subframe);
-        LOG_I(PHY,"PDSCH dlsch0 UE: rnti     %x\n",dlsch[0]->rnti);
-        LOG_D(PHY,"PDSCH dlsch0 UE: NBRB     %d\n",dlsch0_harq->nb_rb);
-        LOG_D(PHY,"PDSCH dlsch0 UE: rballoc  %x\n",dlsch0_harq->rb_alloc_even[0]);
-        LOG_I(PHY,"PDSCH dlsch0 UE: harq_pid %d\n",dci_info_extarcted.harq_pid);
-        LOG_I(PHY,"PDSCH dlsch0 UE: g        %d\n",dlsch[0]->g_pucch);
-        LOG_D(PHY,"PDSCH dlsch0 UE: round    %d\n",dlsch0_harq->round);
-        LOG_D(PHY,"PDSCH dlsch0 UE: DCINdi   %d\n",dlsch0_harq->DCINdi);
-        LOG_D(PHY,"PDSCH dlsch0 UE: rvidx    %d\n",dlsch0_harq->rvidx);
-        LOG_D(PHY,"PDSCH dlsch0 UE: TBS      %d\n",dlsch0_harq->TBS);
-        LOG_D(PHY,"PDSCH dlsch0 UE: mcs      %d\n",dlsch0_harq->mcs);
-        LOG_D(PHY,"PDSCH dlsch0 UE: pwr_off  %d\n",dlsch0_harq->dl_power_off);
-    }
-#endif
-
-#if T_TRACER
-    if( (dlsch[0]->rnti != si_rnti) && (dlsch[0]->rnti != ra_rnti) && (dlsch[0]->rnti != p_rnti))
-    {
-      T(T_UE_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame%1024), T_INT(subframe),
-        T_INT(dlsch[0]->rnti), T_INT(dci_format),
-        T_INT(harq_pid),
-        T_INT(dlsch0_harq->mcs),
-        T_INT(dlsch0_harq->TBS));
-    }
-#endif
-
-
-    // compute DL power control parameters
-    if (dlsch0_harq != NULL){
-      computeRhoA_UE(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off, frame_parms->nb_antenna_ports_eNB);
-      computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antenna_ports_eNB,dlsch[0],dlsch0_harq->dl_power_off);
-    }
-
-    if (dlsch1_harq != NULL) {
-      computeRhoA_UE(pdsch_config_dedicated, dlsch[1],dlsch1_harq->dl_power_off, frame_parms->nb_antenna_ports_eNB);
-      computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antenna_ports_eNB,dlsch[1],dlsch1_harq->dl_power_off);
-    }
-
-
-    return(0);
-}
-
-
-uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t subframe)
-{
-  uint8_t ret = 255;
-
-  if (frame_parms->frame_type == FDD) {
-    ret = (((frame*10)+subframe)&7);
-  } else {
-
-    switch (frame_parms->tdd_config) {
-
-    case 1:
-      if ((subframe==2) ||
-          (subframe==3) ||
-          (subframe==7) ||
-          (subframe==8))
-        switch (subframe) {
-        case 2:
-        case 3:
-          ret = (subframe-2);
-          break;
-
-        case 7:
-        case 8:
-          ret = (subframe-5);
-          break;
-
-        default:
-          LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config);
-          ret = (255);
-          break;
-        }
-
-      break;
-
-    case 2:
-      if ((subframe!=2) && (subframe!=7)) {
-	LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config);
-	ret=255;
-      }
-      else ret = (subframe/7);
-      break;
-
-    case 3:
-      if ((subframe<2) || (subframe>4)) {
-        LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config);
-        ret = (255);
-      }
-      else ret = (subframe-2);
-      break;
-
-    case 4:
-      if ((subframe<2) || (subframe>3)) {
-        LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config);
-        ret = (255);
-      }
-      else ret = (subframe-2);
-      break;
-
-    case 5:
-      if (subframe!=2) {
-        LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config);
-        ret = (255);
-      }
-      else ret = (subframe-2);
-      break;
-
-    default:
-      LOG_E(PHY,"subframe2_harq_pid, Unsupported TDD mode %d\n",frame_parms->tdd_config);
-      ret = (255);
-    }
-  }
-
-  AssertFatal(ret!=255,
-	      "invalid harq_pid(%d) at SFN/SF = %d/%d\n", (int8_t)ret, frame, subframe);
-  return ret;
-}
-
-uint8_t pdcch_alloc2ul_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n)
-{
-  uint8_t ul_subframe = 255;
-
-  if ((frame_parms->frame_type == TDD) &&
-      (frame_parms->tdd_config == 1) &&
-      ((n==1)||(n==6))) // tdd_config 0,1 SF 1,5
-    ul_subframe = ((n+6)%10);
-  else if ((frame_parms->frame_type == TDD) &&
-           (frame_parms->tdd_config == 6) &&
-           ((n==0)||(n==1)||(n==5)||(n==6)))
-    ul_subframe = ((n+7)%10);
-  else if ((frame_parms->frame_type == TDD) &&
-           (frame_parms->tdd_config == 6) &&
-           (n==9)) // tdd_config 6 SF 9
-    ul_subframe = ((n+5)%10);
-  else
-    ul_subframe = ((n+4)%10);
-
-  AssertFatal(frame_parms->frame_type == FDD || subframe_select(frame_parms,ul_subframe) == SF_UL,"illegal ul_subframe %d (n %d)\n",ul_subframe,n);
-
-  LOG_D(PHY, "subframe %d: PUSCH subframe = %d\n", n, ul_subframe);
-  return ul_subframe;
-}
-
-uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n)
-{
-  if ((frame_parms->frame_type == TDD) &&
-      (frame_parms->tdd_config == 1) &&
-      ((n==7)||(n==2))) // tdd_config 0,1 SF 1,5
-    return((n==7)? 1 : 6);
-  else if ((frame_parms->frame_type == TDD) &&
-           (frame_parms->tdd_config == 6) &&
-           ((n==7)||(n==8)||(n==2)||(n==3)))
-    return((n+3)%10);
-  else if ((frame_parms->frame_type == TDD) &&
-           (frame_parms->tdd_config == 6) &&
-           (n==4)) // tdd_config 6 SF 9
-    return(9);
-  else
-    return((n+6)%10);
-}
-
-uint32_t pdcch_alloc2ul_frame(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t n)
-{
-  uint32_t ul_frame;
-
-  if ((frame_parms->frame_type == TDD) &&
-      (frame_parms->tdd_config == 1) &&
-      ((n==1)||(n==6))) // tdd_config 0,1 SF 1,5
-    ul_frame = (frame + (n==1 ? 0 : 1));
-  else if ((frame_parms->frame_type == TDD) &&
-           (frame_parms->tdd_config == 6) &&
-           ((n==0)||(n==1)||(n==5)||(n==6)))
-    ul_frame = (frame + (n>=5 ? 1 : 0));
-  else if ((frame_parms->frame_type == TDD) &&
-           (frame_parms->tdd_config == 6) &&
-           (n==9)) // tdd_config 6 SF 9
-    ul_frame = (frame+1);
-  else
-    ul_frame = (frame+(n>=6 ? 1 : 0));
-
-  LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n", frame, n, ul_frame);
-  return ul_frame % 1024;
-}
-
-int32_t pmi_convert_rank1_from_rank2(uint16_t pmi_alloc, int tpmi, int nb_rb)
-{
-  int nb_subbands = 0;
-  int32_t pmi_alloc_new = 0, pmi_new = 0, pmi_old = 0;
-  int i;
-
-  switch (nb_rb) {
-    case 6:
-      nb_subbands = 6;
-      break;
-    default:
-    case 25:
-      nb_subbands = 7;
-      break;
-    case 50:
-      nb_subbands = 9;
-      break;
-    case 100:
-      nb_subbands = 13;
-      break;
-    }
-
-  for (i = 0; i < nb_subbands; i++) {
-    pmi_old = (pmi_alloc >> i)&1;
-
-    if (pmi_old == 0)
-      if (tpmi == 5)
-        pmi_new = 0;
-      else
-        pmi_new = 1;
-    else
-      if (tpmi == 5)
-        pmi_new = 2;
-      else
-        pmi_new = 3;
-
-    pmi_alloc_new|=pmi_new<<(2*i);
-
-  }
-#ifdef DEBUG_HARQ
-printf("  [DCI UE] pmi_alloc_old %d, pmi_alloc_new %d pmi_old %d , pmi_new %d\n", pmi_alloc, pmi_alloc_new,pmi_old, pmi_new );
-#endif
-return(pmi_alloc_new);
-
-}
-
-uint16_t quantize_subband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,int nb_rb)
-{
-
-  int i, aarx;
-  uint16_t pmiq=0;
-  uint32_t pmivect = 0;
-  uint8_t rank = meas->rank[eNB_id];
-  int pmi_re,pmi_im;
-  int  nb_subbands=0;
-
-
-  switch (nb_rb) {
-    case 6:
-      nb_subbands = 6;
-      break;
-    default:
-    case 25:
-      nb_subbands = 7;
-      break;
-    case 50:
-      nb_subbands = 9;
-      break;
-    case 100:
-      nb_subbands = 13;
-      break;
-    }
-
-
-  for (i=0; i<nb_subbands; i++) {
-    pmi_re = 0;
-    pmi_im = 0;
-
-    if (rank == 0) {
-      for (aarx=0; aarx<meas->nb_antennas_rx; aarx++) {
-        pmi_re += meas->subband_pmi_re[eNB_id][i][aarx];
-        pmi_im += meas->subband_pmi_im[eNB_id][i][aarx];
-      }
-
-      //  pmi_re = meas->subband_pmi_re[eNB_id][i][meas->selected_rx_antennas[eNB_id][i]];
-      //  pmi_im = meas->subband_pmi_im[eNB_id][i][meas->selected_rx_antennas[eNB_id][i]];
-
-      //      printf("pmi => (%d,%d)\n",pmi_re,pmi_im);
-      if ((pmi_re > pmi_im) && (pmi_re > -pmi_im))
-        pmiq = PMI_2A_11;
-      else if ((pmi_re < pmi_im) && (pmi_re > -pmi_im))
-        pmiq = PMI_2A_1j;
-      else if ((pmi_re < pmi_im) && (pmi_re < -pmi_im))
-        pmiq = PMI_2A_1m1;
-      else if ((pmi_re > pmi_im) && (pmi_re < -pmi_im))
-        pmiq = PMI_2A_1mj;
-
-      //      printf("subband %d, pmi%d \n",i,pmiq);
-      pmivect |= (pmiq<<(2*i));
-    }
-
-    else if (rank==1) {
-      for (aarx=0; aarx<meas->nb_antennas_rx; aarx++) {
-        pmi_re += meas->subband_pmi_re[eNB_id][i][aarx];
-  //printf("meas->subband_pmi_re[eNB_id][i][%d]=%d\n", aarx, meas->subband_pmi_re[eNB_id][i][aarx]);
-        pmi_im += meas->subband_pmi_im[eNB_id][i][aarx];
-  //printf("meas->subband_pmi_im[eNB_id][i][%d]=%d\n",aarx, meas->subband_pmi_im[eNB_id][i][aarx]);
-      }
-     if (pmi_re >= pmi_im) // this is not orthogonal
-     // this is orthogonal
-     //if (((pmi_re >= pmi_im) && (pmi_re >= -pmi_im)) || ((pmi_re <= pmi_im) && (pmi_re >= -pmi_im)))
-       pmiq = PMI_2A_R1_11;
-     else
-       pmiq = PMI_2A_R1_1j;
-
-     // printf("subband %d, pmi_re %d, pmi_im %d, pmiq %d \n",i,pmi_re,pmi_im,pmiq);
-     // printf("subband %d, pmi%d \n",i,pmiq);
-      //According to Section 7.2.4 of 36.213
-
-      pmivect |= ((pmiq-1)<<(i)); //shift 1 since only one bit
-    }
-    else {
-      LOG_E(PHY,"PMI feedback for rank>1 not supported!\n");
-      pmivect = 0;
-    }
-
-  }
-#ifdef DEBUG_HARQ
-    printf( "quantize_subband_pmi pmivect %d \n", pmivect);
-#endif
-  return(pmivect);
-}
-
-uint16_t quantize_subband_pmi2(PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t a_id,int nb_subbands)
-{
-
-  uint8_t i;
-  uint16_t pmiq=0;
-  uint16_t pmivect = 0;
-  uint8_t rank = meas->rank[eNB_id];
-  int pmi_re,pmi_im;
-
-  for (i=0; i<nb_subbands; i++) {
-
-    if (rank == 0) {
-      pmi_re = meas->subband_pmi_re[eNB_id][i][a_id];
-      pmi_im = meas->subband_pmi_im[eNB_id][i][a_id];
-
-      if ((pmi_re > pmi_im) && (pmi_re > -pmi_im))
-        pmiq = PMI_2A_11;
-      else if ((pmi_re < pmi_im) && (pmi_re > -pmi_im))
-        pmiq = PMI_2A_1j;
-      else if ((pmi_re < pmi_im) && (pmi_re < -pmi_im))
-        pmiq = PMI_2A_1m1;
-      else if ((pmi_re > pmi_im) && (pmi_re < -pmi_im))
-        pmiq = PMI_2A_1mj;
-
-      pmivect |= (pmiq<<(2*i));
-    } else {
-      // This needs to be done properly!!!
-      pmivect = 0;
-    }
-  }
-
-  return(pmivect);
-}
-
-uint16_t quantize_wideband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id)
-{
-
-  uint16_t pmiq=0;
-  uint8_t rank = meas->rank[eNB_id];
-  //int pmi;
-  int pmi_re,pmi_im;
-
-  if (rank == 1) {
-    //pmi =
-    pmi_re = meas->wideband_pmi_re[eNB_id][meas->selected_rx_antennas[eNB_id][0]];
-    pmi_im = meas->wideband_pmi_im[eNB_id][meas->selected_rx_antennas[eNB_id][0]];
-
-    if ((pmi_re > pmi_im) && (pmi_re > -pmi_im))
-      pmiq = PMI_2A_11;
-    else if ((pmi_re < pmi_im) && (pmi_re > -pmi_im))
-      pmiq = PMI_2A_1j;
-    else if ((pmi_re < pmi_im) && (pmi_re < -pmi_im))
-      pmiq = PMI_2A_1m1;
-    else if ((pmi_re > pmi_im) && (pmi_re < -pmi_im))
-      pmiq = PMI_2A_1mj;
-
-  } else {
-    // This needs to be done properly!
-    pmiq = PMI_2A_11;
-  }
-
-
-  return(pmiq);
-}
-/*
-  uint8_t sinr2cqi(int sinr) {
-  if (sinr<-3)
-  return(0);
-  if (sinr>14)
-  return(10);
-  else
-  return(3+(sinr>>1));
-  }
-*/
-
-uint8_t sinr2cqi(double sinr,uint8_t trans_mode)
-{
-  // int flag_LA=0;
-
-  uint8_t retValue = 0;
-
-  if(flag_LA==0) {
-    // Ideal Channel Estimation
-    if (sinr<=-4.89)
-      retValue = (0);
-    else if (sinr < -3.53)
-      retValue = (3);
-    else if (sinr <= -1.93)
-      retValue = (4);
-    else if (sinr <= -0.43)
-      retValue = (5);
-    else if (sinr <= 1.11)
-      retValue = (6);
-    else if (sinr <= 3.26)
-      retValue = (7);
-    else if (sinr <= 5.0)
-      retValue = (8);
-    else if (sinr <= 7.0)
-      retValue = (9);
-    else if (sinr <= 9.0)
-      retValue = (10);
-    else if (sinr <= 11.0)
-      retValue = (11);
-    else if (sinr <= 13.0)
-      retValue = (12);
-    else if (sinr <= 15.5)
-      retValue = (13);
-    else if (sinr <= 17.5)
-      retValue = (14);
-    else
-      retValue = (15);
-  } else {
-    int h=0;
-    int trans_mode_tmp;
-
-    if (trans_mode ==5)
-      trans_mode_tmp=2;
-    else if(trans_mode ==6)
-      trans_mode_tmp=3;
-    else
-      trans_mode_tmp = trans_mode-1;
-
-    for(h=0; h<16; h++) {
-      if(sinr<=sinr_to_cqi[trans_mode_tmp][h])
-        retValue = (h);
-    }
-  }
-
-  LOG_D(PHY, "sinr=%f trans_mode=%d cqi=%d\n", sinr, trans_mode, retValue);
-  return retValue;
-}
-//uint32_t fill_subband_cqi(PHY_MEASUREMENTS *meas,uint8_t eNB_id) {
-//
-//  uint8_t i;
-////  uint16_t cqivect = 0;
-//  uint32_t cqivect = 0;
-//
-////  char diff_cqi;
-//  int diff_cqi=0;
-//
-//  for (i=0;i<NUMBER_OF_SUBBANDS;i++) {
-//
-//    diff_cqi = -sinr2cqi(meas->wideband_cqi_dB[eNB_id][0]) + sinr2cqi(meas->subband_cqi_dB[eNB_id][0][i]);
-//
-//    // Note, this is Table 7.2.1-2 from 36.213
-//    if (diff_cqi<=-1)
-//      diff_cqi = 3;
-//    else if (diff_cqi>2)
-//      diff_cqi = 2;
-//    cqivect |= (diff_cqi<<(2*i));
-//
-//  }
-//
-//  return(cqivect);
-//}
-
-
-uint32_t fill_subband_cqi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t trans_mode,int nb_subbands)
-{
-
-  uint8_t i;
-
-  uint32_t cqivect = 0,offset=0;
-
-
-  int diff_cqi=0;
-
-  for (i=0; i<nb_subbands; i++) {
-
-    diff_cqi = -sinr2cqi(meas->wideband_cqi_avg[eNB_id],trans_mode) + sinr2cqi(meas->subband_cqi_tot_dB[eNB_id][i],trans_mode);
-
-    // Note, this is Table 7.2.1-2 from 36.213
-    if (diff_cqi<=-1)
-      offset = 3;
-    else if (diff_cqi>=2)
-      offset = 2;
-    else
-      offset=(uint32_t)diff_cqi;
-
-    cqivect |= (offset<<(2*i));
-
-  }
-
-  return(cqivect);
-}
-
-void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t harq_pid,int N_RB_DL,uint16_t rnti, uint8_t trans_mode, double sinr_eff)
-{
-
-  //  printf("[PHY][UE] Filling CQI for eNB %d, meas->wideband_cqi_tot[%d] %d\n",
-  //      eNB_id,eNB_id,meas->wideband_cqi_tot[eNB_id]);
-  double sinr_tmp;
-  uint8_t *o = ulsch->o;
-  UCI_format_t uci_format = ulsch->uci_format;
-
-  if(flag_LA==1)
-    sinr_tmp = sinr_eff;
-  else
-    sinr_tmp = (double) meas->wideband_cqi_avg[eNB_id];
-
-
-
-  //LOG_I(PHY,"[UE][UCI] Filling CQI format %d for eNB %d N_RB_DL %d\n",uci_format,eNB_id,N_RB_DL);
-
-  switch (N_RB_DL) {
-
-  case 6:
-    switch (uci_format) {
-    case wideband_cqi_rank1_2A:
-      ((wideband_cqi_rank1_2A_1_5MHz *)o)->cqi1 = sinr2cqi(sinr_tmp,trans_mode);
-      ((wideband_cqi_rank1_2A_1_5MHz *)o)->pmi  = quantize_subband_pmi(meas,eNB_id,6);
-      break;
-
-    case wideband_cqi_rank2_2A:
-      ((wideband_cqi_rank2_2A_1_5MHz *)o)->cqi1 = sinr2cqi(sinr_tmp,trans_mode); //FIXME: calculate rank2 cqi
-      ((wideband_cqi_rank2_2A_1_5MHz *)o)->cqi2 = sinr2cqi(sinr_tmp,trans_mode); //FIXME: calculate rank2 cqi
-      ((wideband_cqi_rank2_2A_1_5MHz *)o)->pmi  = quantize_subband_pmi(meas,eNB_id,6);
-      break;
-
-    case HLC_subband_cqi_nopmi:
-      ((HLC_subband_cqi_nopmi_1_5MHz *)o)->cqi1     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_nopmi_1_5MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,6);
-      break;
-
-    case HLC_subband_cqi_rank1_2A:
-      ((HLC_subband_cqi_rank1_2A_1_5MHz *)o)->cqi1     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_rank1_2A_1_5MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,6);
-      ((HLC_subband_cqi_rank1_2A_1_5MHz *)o)->pmi      = quantize_wideband_pmi(meas,eNB_id);
-      break;
-
-    case HLC_subband_cqi_rank2_2A:
-      // This has to be improved!!!
-      ((HLC_subband_cqi_rank2_2A_1_5MHz *)o)->cqi1     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_rank2_2A_1_5MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,6);
-      ((HLC_subband_cqi_rank2_2A_1_5MHz *)o)->cqi2     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_rank2_2A_1_5MHz *)o)->diffcqi2 = fill_subband_cqi(meas,eNB_id,trans_mode,6);
-      ((HLC_subband_cqi_rank2_2A_1_5MHz *)o)->pmi      = quantize_subband_pmi(meas,eNB_id,6);
-      break;
-
-    case HLC_subband_cqi_mcs_CBA:
-      // this is the cba mcs uci for cba transmission
-      ((HLC_subband_cqi_mcs_CBA_1_5MHz *)o)->mcs     = ulsch->harq_processes[harq_pid]->mcs;
-      ((HLC_subband_cqi_mcs_CBA_1_5MHz *)o)->crnti  = rnti;
-      LOG_D(PHY,"fill uci for cba rnti %x, mcs %d \n", rnti, ulsch->harq_processes[harq_pid]->mcs);
-      break;
-
-    case ue_selected:
-      LOG_E(PHY,"fill_CQI ue_selected CQI not supported yet!!!\n");
-      AssertFatal(1==0,"fill_CQI ue_selected CQI not supported yet!!!");
-      break;
-
-    default:
-      LOG_E(PHY,"unsupported CQI mode (%d)!!!\n",uci_format);
-      AssertFatal(1==0,"unsupported CQI mode !!!");
-      break;
-
-    }
-
-    break;
-
-  case 25:
-    switch (uci_format) {
-    case wideband_cqi_rank1_2A:
-      ((wideband_cqi_rank1_2A_5MHz *)o)->cqi1 = sinr2cqi(sinr_tmp,trans_mode);
-      ((wideband_cqi_rank1_2A_5MHz *)o)->pmi  = quantize_subband_pmi(meas,eNB_id,7);
-      break;
-
-    case wideband_cqi_rank2_2A:
-      ((wideband_cqi_rank2_2A_5MHz *)o)->cqi1 = sinr2cqi(sinr_tmp,trans_mode); //FIXME: calculate rank2 cqi
-      ((wideband_cqi_rank2_2A_5MHz *)o)->cqi2 = sinr2cqi(sinr_tmp,trans_mode); //FIXME: calculate rank2 cqi
-      ((wideband_cqi_rank2_2A_5MHz *)o)->pmi  = quantize_subband_pmi(meas,eNB_id,7);
-      break;
-
-    case HLC_subband_cqi_nopmi:
-      ((HLC_subband_cqi_nopmi_5MHz *)o)->cqi1     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_nopmi_5MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,7);
-      break;
-
-    case HLC_subband_cqi_rank1_2A:
-      ((HLC_subband_cqi_rank1_2A_5MHz *)o)->cqi1     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_rank1_2A_5MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,7);
-      ((HLC_subband_cqi_rank1_2A_5MHz *)o)->pmi      = quantize_wideband_pmi(meas,eNB_id);
-      break;
-
-    case HLC_subband_cqi_rank2_2A:
-      // This has to be improved!!!
-      ((HLC_subband_cqi_rank2_2A_5MHz *)o)->cqi1     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_rank2_2A_5MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,7);
-      ((HLC_subband_cqi_rank2_2A_5MHz *)o)->cqi2     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_rank2_2A_5MHz *)o)->diffcqi2 = fill_subband_cqi(meas,eNB_id,trans_mode,7);
-      ((HLC_subband_cqi_rank2_2A_5MHz *)o)->pmi      = quantize_subband_pmi(meas,eNB_id,7);
-      break;
-
-    case HLC_subband_cqi_mcs_CBA:
-      // this is the cba mcs uci for cba transmission
-      ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->mcs     = ulsch->harq_processes[harq_pid]->mcs;
-      ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->crnti  = rnti;
-      LOG_N(PHY,"fill uci for cba rnti %x, mcs %d \n", rnti, ulsch->harq_processes[harq_pid]->mcs);
-      break;
-
-    case ue_selected:
-      LOG_E(PHY,"fill_CQI ue_selected CQI not supported yet!!!\n");
-      AssertFatal(1==0,"fill_CQI ue_selected CQI not supported yet!!!");
-      break;
-
-    default:
-      LOG_E(PHY,"unsupported CQI mode (%d)!!!\n",uci_format);
-      AssertFatal(1==0,"unsupported CQI mode !!!");
-      break;
-
-    }
-
-    break;
-
-  case 50:
-    switch (uci_format) {
-    case wideband_cqi_rank1_2A:
-      ((wideband_cqi_rank1_2A_10MHz *)o)->cqi1 = sinr2cqi(sinr_tmp,trans_mode);
-      ((wideband_cqi_rank1_2A_10MHz *)o)->pmi  = quantize_subband_pmi(meas,eNB_id,9);
-      break;
-
-    case wideband_cqi_rank2_2A:
-      ((wideband_cqi_rank2_2A_10MHz *)o)->cqi1 = sinr2cqi(sinr_tmp,trans_mode); //FIXME: calculate rank2 cqi
-      ((wideband_cqi_rank2_2A_10MHz *)o)->cqi2 = sinr2cqi(sinr_tmp,trans_mode); //FIXME: calculate rank2 cqi
-      ((wideband_cqi_rank2_2A_10MHz *)o)->pmi  = quantize_subband_pmi(meas,eNB_id,9);
-      break;
-
-    case HLC_subband_cqi_nopmi:
-      ((HLC_subband_cqi_nopmi_10MHz *)o)->cqi1     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_nopmi_10MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,9);
-      break;
-
-    case HLC_subband_cqi_rank1_2A:
-      ((HLC_subband_cqi_rank1_2A_10MHz *)o)->cqi1     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_rank1_2A_10MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,9);
-      ((HLC_subband_cqi_rank1_2A_10MHz *)o)->pmi      = quantize_wideband_pmi(meas,eNB_id);
-      break;
-
-    case HLC_subband_cqi_rank2_2A:
-      // This has to be improved!!!
-      ((HLC_subband_cqi_rank2_2A_10MHz *)o)->cqi1     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_rank2_2A_10MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,9);
-      ((HLC_subband_cqi_rank2_2A_10MHz *)o)->cqi2     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_rank2_2A_10MHz *)o)->diffcqi2 = fill_subband_cqi(meas,eNB_id,trans_mode,9);
-      ((HLC_subband_cqi_rank2_2A_10MHz *)o)->pmi      = quantize_subband_pmi(meas,eNB_id,9);
-      break;
-
-    case HLC_subband_cqi_mcs_CBA:
-      // this is the cba mcs uci for cba transmission
-      ((HLC_subband_cqi_mcs_CBA_10MHz *)o)->mcs     = ulsch->harq_processes[harq_pid]->mcs;
-      ((HLC_subband_cqi_mcs_CBA_10MHz *)o)->crnti  = rnti;
-      LOG_N(PHY,"fill uci for cba rnti %x, mcs %d \n", rnti, ulsch->harq_processes[harq_pid]->mcs);
-      break;
-
-    case ue_selected:
-      LOG_E(PHY,"fill_CQI ue_selected CQI not supported yet!!!\n");
-      AssertFatal(1==0,"fill_CQI ue_selected CQI not supported yet!!!");
-      break;
-
-    default:
-      LOG_E(PHY,"unsupported CQI mode (%d)!!!\n",uci_format);
-      AssertFatal(1==0,"unsupported CQI mode !!!");
-      break;
-
-    }
-
-    break;
-
-  case 100:
-    switch (uci_format) {
-    case wideband_cqi_rank1_2A:
-      ((wideband_cqi_rank1_2A_20MHz *)o)->cqi1 = sinr2cqi(sinr_tmp,trans_mode);
-      ((wideband_cqi_rank1_2A_20MHz *)o)->pmi  = quantize_subband_pmi(meas,eNB_id,13);
-      break;
-
-    case wideband_cqi_rank2_2A:
-      ((wideband_cqi_rank2_2A_20MHz *)o)->cqi1 = sinr2cqi(sinr_tmp,trans_mode); //FIXME: calculate rank2 cqi
-      ((wideband_cqi_rank2_2A_20MHz *)o)->cqi2 = sinr2cqi(sinr_tmp,trans_mode); //FIXME: calculate rank2 cqi
-      ((wideband_cqi_rank2_2A_20MHz *)o)->pmi  = quantize_subband_pmi(meas,eNB_id,13);
-      break;
-
-    case HLC_subband_cqi_nopmi:
-      ((HLC_subband_cqi_nopmi_20MHz *)o)->cqi1     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_nopmi_20MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,13);
-      break;
-
-    case HLC_subband_cqi_rank1_2A:
-      ((HLC_subband_cqi_rank1_2A_20MHz *)o)->cqi1     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_rank1_2A_20MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,13);
-      ((HLC_subband_cqi_rank1_2A_20MHz *)o)->pmi      = quantize_wideband_pmi(meas,eNB_id);
-      break;
-
-    case HLC_subband_cqi_rank2_2A:
-      // This has to be improved!!!
-      ((HLC_subband_cqi_rank2_2A_20MHz *)o)->cqi1     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_rank2_2A_20MHz *)o)->diffcqi1 = fill_subband_cqi(meas,eNB_id,trans_mode,13);
-      ((HLC_subband_cqi_rank2_2A_20MHz *)o)->cqi2     = sinr2cqi(sinr_tmp,trans_mode);
-      ((HLC_subband_cqi_rank2_2A_20MHz *)o)->diffcqi2 = fill_subband_cqi(meas,eNB_id,trans_mode,13);
-      ((HLC_subband_cqi_rank2_2A_20MHz *)o)->pmi      = quantize_subband_pmi(meas,eNB_id,13);
-      break;
-
-    case HLC_subband_cqi_mcs_CBA:
-      // this is the cba mcs uci for cba transmission
-      ((HLC_subband_cqi_mcs_CBA_20MHz *)o)->mcs     = ulsch->harq_processes[harq_pid]->mcs;
-      ((HLC_subband_cqi_mcs_CBA_20MHz *)o)->crnti  = rnti;
-      LOG_N(PHY,"fill uci for cba rnti %x, mcs %d \n", rnti, ulsch->harq_processes[harq_pid]->mcs);
-      break;
-
-    case ue_selected:
-      LOG_E(PHY,"fill_CQI ue_selected CQI not supported yet!!!\n");
-      AssertFatal(1==0,"fill_CQI ue_selected CQI not supported yet!!!");
-      break;
-
-    default:
-      LOG_E(PHY,"unsupported CQI mode (%d)!!!\n",uci_format);
-      AssertFatal(1==0,"unsupported CQI mode !!!");
-      break;
-
-    }
-
-    break;
-
-  }
-
-
-}
-
-void reset_cba_uci(void *o)
-{
-  // this is the cba mcs uci for cba transmission
-  ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->mcs     = 0; //fixme
-  ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->crnti  = 0x0;
-}
-
-
-uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi, uint8_t rank)
-{
-
-  uint8_t i,wideband_pmi2;
-  uint32_t pmi_ex = 0;
-
-  if (frame_parms->N_RB_DL!=25) {
-    LOG_E(PHY,"pmi_extend not yet implemented for anything else than 25PRB\n");
-    return(-1);
-  }
-
-  if (rank==0) {
-    wideband_pmi2=wideband_pmi&3;
-    for (i=0; i<14; i+=2)
-      pmi_ex|=(wideband_pmi2<<i);
-  }
-  else if (rank==1) {
-    wideband_pmi2=wideband_pmi&1;
-    for (i=0; i<7; i++)
-      pmi_ex|=(wideband_pmi2<<i);
-  }
-  else {
-    LOG_E(PHY,"unsupported rank\n");
-    return(-1);
-  }
-
-  return(pmi_ex);
-}
-
-
-int generate_ue_ulsch_params_from_dci(void *dci_pdu,
-                                      uint16_t rnti,
-                                      uint8_t subframe,
-                                      DCI_format_t dci_format,
-                                      PHY_VARS_UE *ue,
-                                      UE_rxtx_proc_t *proc,
-                                      uint16_t si_rnti,
-                                      uint16_t ra_rnti,
-                                      uint16_t p_rnti,
-                                      uint16_t cba_rnti,
-                                      uint8_t eNB_id,
-                                      uint8_t use_srs)
-{
-
-  uint8_t harq_pid;
-  uint8_t transmission_mode = ue->transmission_mode[eNB_id];
-  ANFBmode_t AckNackFBMode;
-  LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
-  LTE_UE_DLSCH_t **dlsch = ue->dlsch[ue->current_thread_id[subframe]][0];
-  PHY_MEASUREMENTS *meas = &ue->measurements;
-  LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
-  //  uint32_t current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id];
-
-  if(frame_parms->frame_type == TDD)
-  {
-      AckNackFBMode = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode;
-  }
-  else
-  {
-      AckNackFBMode = 1; // 1: multiplexing for FDD
-  }
-
-  uint32_t cqi_req;
-  uint32_t dai=3;
-  uint32_t cshift;
-  uint32_t TPC;
-  uint32_t ndi;
-  uint32_t mcs;
-  uint32_t rballoc,RIV_max;
-  uint16_t* RIV2first_rb_LUT;
-  uint16_t* RIV2nb_rb_LUT;
-
-  //  uint32_t hopping;
-  //  uint32_t type;
-
-  if (dci_format == format0) {
-
-    if (!ulsch)
-      return -1;
-
-    if (rnti == ra_rnti)
-      harq_pid = 0;
-    else
-      harq_pid = subframe2harq_pid(frame_parms,
-                                   pdcch_alloc2ul_frame(frame_parms,proc->frame_rx,subframe),
-                                   pdcch_alloc2ul_subframe(frame_parms,subframe));
-    LOG_D(PHY,"Frame %d, Subframe %d: Programming ULSCH for (%d.%d) => harq_pid %d\n",
-	  proc->frame_rx,subframe,
-	  pdcch_alloc2ul_frame(frame_parms,proc->frame_rx,subframe),
-	  pdcch_alloc2ul_subframe(frame_parms,subframe), harq_pid);
-
-    if (harq_pid == 255) {
-      LOG_E(PHY, "frame %d, subframe %d, rnti %x, format %d: illegal harq_pid!\n",
-            proc->frame_rx, subframe, rnti, dci_format);
-      return(-1);
-    }
-
-    switch (frame_parms->N_RB_DL) {
-    case 6:
-      if (frame_parms->frame_type == TDD) {
-        cqi_req = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->cqi_req;
-        dai     = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->dai;
-        cshift  = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC;
-        ndi     = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi;
-        mcs     = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping;
-        //  type    = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->type;
-      } else {
-        cqi_req = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cqi_req;
-        cshift  = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->TPC;
-        ndi     = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->ndi;
-        mcs     = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping=hopping;
-        //  type    = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->type;
-      }
-
-      RIV_max = RIV_max6;
-      RIV2first_rb_LUT = RIV2first_rb_LUT6;
-      RIV2nb_rb_LUT = RIV2nb_rb_LUT6;
-
-      break;
-
-    case 25:
-      if (frame_parms->frame_type == TDD) {
-        cqi_req = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cqi_req;
-        dai     = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->dai;
-        cshift  = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->TPC;
-        ndi     = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->ndi;
-        mcs     = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping;
-        //  type    = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->type;
-      } else {
-        cqi_req = ((DCI0_5MHz_FDD_t *)dci_pdu)->cqi_req;
-        cshift  = ((DCI0_5MHz_FDD_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_5MHz_FDD_t *)dci_pdu)->TPC;
-        ndi     = ((DCI0_5MHz_FDD_t *)dci_pdu)->ndi;
-        mcs     = ((DCI0_5MHz_FDD_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_5MHz_FDD_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_5MHz_FDD_t *)dci_pdu)->hopping=hopping;
-        //  type    = ((DCI0_5MHz_FDD_t *)dci_pdu)->type;
-      }
-
-      RIV_max = RIV_max25;
-      RIV2first_rb_LUT = RIV2first_rb_LUT25;
-      RIV2nb_rb_LUT = RIV2nb_rb_LUT25;
-      //      printf("***********rballoc %d, first_rb %d, nb_rb %d (dci %p)\n",rballoc,ulsch->harq_processes[harq_pid]->first_rb,ulsch->harq_processes[harq_pid]->nb_rb,dci_pdu);
-      break;
-
-    case 50:
-      if (frame_parms->frame_type == TDD) {
-        cqi_req = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->cqi_req;
-        dai     = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->dai;
-        cshift  = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->TPC;
-        ndi     = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->ndi;
-        mcs     = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping;
-        //  type    = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->type;
-      } else {
-        cqi_req = ((DCI0_10MHz_FDD_t *)dci_pdu)->cqi_req;
-        cshift  = ((DCI0_10MHz_FDD_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_10MHz_FDD_t *)dci_pdu)->TPC;
-        ndi     = ((DCI0_10MHz_FDD_t *)dci_pdu)->ndi;
-        mcs     = ((DCI0_10MHz_FDD_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_10MHz_FDD_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_10MHz_FDD_t *)dci_pdu)->hopping=hopping;
-        //  type    = ((DCI0_10MHz_FDD_t *)dci_pdu)->type;
-      }
-
-      RIV_max = RIV_max50;
-      RIV2first_rb_LUT = RIV2first_rb_LUT50;
-      RIV2nb_rb_LUT = RIV2nb_rb_LUT50;
-
-      break;
-
-    case 100:
-      if (frame_parms->frame_type == TDD) {
-        cqi_req = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->cqi_req;
-        dai     = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->dai;
-        cshift  = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->TPC;
-        ndi     = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->ndi;
-        mcs     = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping;
-        //  type    = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->type;
-      } else {
-        cqi_req = ((DCI0_20MHz_FDD_t *)dci_pdu)->cqi_req;
-        cshift  = ((DCI0_20MHz_FDD_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_20MHz_FDD_t *)dci_pdu)->TPC;
-        ndi     = ((DCI0_20MHz_FDD_t *)dci_pdu)->ndi;
-        mcs     = ((DCI0_20MHz_FDD_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_20MHz_FDD_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_20MHz_FDD_t *)dci_pdu)->hopping=hopping;
-        //  type    = ((DCI0_20MHz_FDD_t *)dci_pdu)->type;
-      }
-
-      RIV_max = RIV_max100;
-      RIV2first_rb_LUT = RIV2first_rb_LUT100;
-      RIV2nb_rb_LUT = RIV2nb_rb_LUT100;
-
-      //      printf("rb_alloc (20 MHz dci) %d\n",rballoc);
-      break;
-
-    default:
-      LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-      DevParam (frame_parms->N_RB_DL, 0, 0);
-      break;
-    }
-
-
-    if (rballoc > RIV_max) {
-      LOG_E(PHY,"frame %d, subframe %d, rnti %x, format %d: FATAL ERROR: generate_ue_ulsch_params_from_dci, rb_alloc[%d] > RIV_max[%d]\n",
-            proc->frame_rx, subframe, rnti, dci_format,rballoc,RIV_max);
-      LOG_E(PHY,"Wrong DCI0 detection, do not transmit PUSCH for HARQID: %d\n",harq_pid);
-      ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
-      return(-1);
-    }
-
-
-    // indicate that this process is to be serviced in subframe n+4
-    if ((rnti >= cba_rnti) && (rnti < p_rnti))
-      ulsch->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; //+=1 this indicates the number of dci / cba group: not supported in the data struct
-    else
-    {
-        ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
-        //LOG_I(PHY,"[HARQ-UL harqId: %d] DCI0 ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag, ulsch->harq_processes[harq_pid]->round);
-
-    }
-
-    ulsch->harq_processes[harq_pid]->TPC                                   = TPC;
-    ulsch->harq_processes[harq_pid]->first_rb                              = RIV2first_rb_LUT[rballoc];
-    ulsch->harq_processes[harq_pid]->nb_rb                                 = RIV2nb_rb_LUT[rballoc];
-
-    if (ue->ul_power_control_dedicated[eNB_id].accumulationEnabled == 1) {
-      LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d: f_pusch (ACC) %d, adjusting by %d (TPC %d)\n",
-            ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->f_pusch,
-            delta_PUSCH_acc[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC],
-            ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC);
-      ulsch->f_pusch += delta_PUSCH_acc[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC];
-    } else {
-      LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d: f_pusch (ABS) %d, adjusting to %d (TPC %d)\n",
-            ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->f_pusch,
-            delta_PUSCH_abs[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC],
-            ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC);
-      ulsch->f_pusch = delta_PUSCH_abs[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC];
-    }
-
-    if (ulsch->harq_processes[harq_pid]->first_tx==1) {
-      //      ulsch->harq_processes[harq_pid]->Ndi                                   = 1;
-      ulsch->harq_processes[harq_pid]->first_tx=0;
-      ulsch->harq_processes[harq_pid]->DCINdi= ndi;
-      ulsch->harq_processes[harq_pid]->round = 0;
-    } else {
-      if (ulsch->harq_processes[harq_pid]->DCINdi!=ndi) { // new SDU opportunity
-        //  ulsch->harq_processes[harq_pid]->Ndi = 1;
-        ulsch->harq_processes[harq_pid]->DCINdi= ndi;
-        ulsch->harq_processes[harq_pid]->round = 0;
-      } else {
-        //  ulsch->harq_processes[harq_pid]->Ndi = 0;
-        //ulsch->harq_processes[harq_pid]->round++;  // This is done in phich RX
-
-        //#ifdef DEBUG_PHICH
-        //LOG_I(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d Adaptative Retrans, NDI not toggled => Nack. maxHARQ_Tx %d \n",
-        //      ue->Mod_id,harq_pid,
-        //      proc->frame_rx,
-        //      subframe,
-        //      ulsch->Mlimit);
-        //#endif
-/*
-        if (ulsch->harq_processes[harq_pid]->round > 0) // NACK detected on phich
-        {
-            // ulsch->harq_processes[harq_pid]->round++; already done on phich_rx
-            // ulsch->harq_processes[harq_pid] = ulsch->harq_processes[8];
-            // LOG_I(PHY,"          Adaptative retransmission - copy temporary harq Process to current harq process. [harqId %d round %d] \n",harq_pid, ulsch->harq_processes[8]->round);
-
-            if (ulsch->harq_processes[harq_pid]->round >= ulsch->Mlimit) //UE_mac_inst[eNB_id].scheduling_info.maxHARQ_Tx)
-            {
-                ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
-                ulsch->harq_processes[harq_pid]->round  = 0;
-                ulsch->harq_processes[harq_pid]->status = IDLE;
-                //LOG_I(PHY,"          PUSCH MAX Retransmission acheived ==> flush harq buff (%d) \n",harq_pid);
-                //LOG_I(PHY,"          [HARQ-UL harqId: %d] Adaptative retransmission NACK MAX RETRANS(%d) ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, UE_mac_inst[eNB_id].scheduling_info.maxHARQ_Tx, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag, ulsch->harq_processes[harq_pid]->round);
-            }
-            else
-            {
-                // ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
-                uint8_t rv_table[4] = {0, 2, 3, 1};
-                ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3];
-                ulsch->O_RI = 0;
-                ulsch->O    = 0;
-                ulsch->uci_format = HLC_subband_cqi_nopmi;
-                //LOG_I(PHY,"          [HARQ-UL harqId: %d] Adaptative retransmission NACK ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag,ulsch->harq_processes[harq_pid]->round);
-            }
-        }
-*/
-      }
-    }
-
-    ulsch->harq_processes[harq_pid]->n_DMRS                                = cshift;
-
-    //printf("nb_rb %d, first_rb %d (RIV %d)\n",ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb,rballoc);
-    if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-      // ulsch->cba_rnti[0]=rnti;
-    } else {
-      ulsch->rnti = rnti;
-    }
-
-    //    printf("[PHY][UE] DCI format 0: harq_pid %d nb_rb %d, rballoc %d\n",harq_pid,ulsch->harq_processes[harq_pid]->nb_rb,
-    //     ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->rballoc);
-    //Mapping of cyclic shift field in DCI format0 to n_DMRS2 (3GPP 36.211, Table 5.5.2.1.1-1)
-    if(cshift == 0)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 0;
-    else if(cshift == 1)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 6;
-    else if(cshift == 2)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 3;
-    else if(cshift == 3)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 4;
-    else if(cshift == 4)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 2;
-    else if(cshift == 5)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 8;
-    else if(cshift == 6)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 10;
-    else if(cshift == 7)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 9;
-
-
-    //reserved for cooperative communication
-    /*
-      if(ulsch->n_DMRS2 == 6)
-      ulsch->cooperation_flag = 2;
-      else
-      ulsch->cooperation_flag = 0;
-    */
-
-    if ((ulsch->harq_processes[harq_pid]->nb_rb>0) && (ulsch->harq_processes[harq_pid]->nb_rb < 25))
-      ulsch->power_offset = ue_power_offsets[ulsch->harq_processes[harq_pid]->nb_rb-1];
-
-    //    if (ulsch->harq_processes[harq_pid]->Ndi == 1)
-    //    ulsch->harq_processes[harq_pid]->status = ACTIVE;
-
-
-    if (cqi_req == 1) {
-
-      if( (AntennaInfoDedicated__transmissionMode_tm3 == transmission_mode) || (AntennaInfoDedicated__transmissionMode_tm4 == transmission_mode) )
-      {
-          ulsch->O_RI = 1;
-      }
-      else
-      {
-          ulsch->O_RI = 0;
-      }
-      //ulsch->O_RI = 0; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table
-
-      switch(transmission_mode) {
-        // The aperiodic CQI reporting mode is fixed for every transmission mode instead of being configured by higher layer signaling
-      case 1:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_mcs_CBA;
-          ulsch->o_RI[0]                             = 0;
-        } else  if(meas->rank[eNB_id] == 0) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_nopmi;
-          ulsch->o_RI[0]                             = 0;
-        } else {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_nopmi;
-          ulsch->o_RI[0]                             = 1;
-        }
-
-        break;
-
-      case 2:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_mcs_CBA;
-          ulsch->o_RI[0]                             = 0;
-        } else if(meas->rank[eNB_id] == 0) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_nopmi;
-          ulsch->o_RI[0]                             = 0;
-        } else {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_nopmi;
-          ulsch->o_RI[0]                             = 1;
-        }
-
-        break;
-
-      case 3:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_mcs_CBA;
-          ulsch->o_RI[0]                             = 0;
-        } else if(meas->rank[eNB_id] == 0) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_nopmi;
-          ulsch->o_RI[0]                             = 0;
-        } else {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_nopmi;
-          ulsch->o_RI[0]                             = 1;
-        }
-
-        break;
-
-      case 4:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_mcs_CBA;
-          ulsch->o_RI[0]                             = 0;
-        } else if(meas->rank[eNB_id] == 0) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = wideband_cqi_rank1_2A;
-          ulsch->o_RI[0]                             = 0;
-        } else {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = wideband_cqi_rank2_2A;
-          ulsch->o_RI[0]                             = 1;
-        }
-
-        break;
-
-      case 5:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_mcs_CBA;
-          ulsch->o_RI[0]                             = 0;
-        } else if(meas->rank[eNB_id] == 0) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = wideband_cqi_rank1_2A;
-          ulsch->o_RI[0]                             = 0;
-        } else {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = wideband_cqi_rank2_2A;
-          ulsch->o_RI[0]                             = 1;
-        }
-
-        break;
-
-      case 6:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_mcs_CBA;
-          ulsch->o_RI[0]                             = 0;
-        } else if(meas->rank[eNB_id] == 0) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = wideband_cqi_rank1_2A;
-          ulsch->o_RI[0]                             = 0;
-        } else {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = wideband_cqi_rank2_2A;
-          ulsch->o_RI[0]                             = 1;
-        }
-
-        break;
-
-      case 7:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_mcs_CBA;
-          ulsch->o_RI[0]                             = 0;
-        } else if(meas->rank[eNB_id] == 0) {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_nopmi;
-          ulsch->o_RI[0]                             = 0;
-        } else {
-          switch (ue->frame_parms.N_RB_DL) {
-          case 6:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_5MHz;
-            break;
-
-          case 50:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_10MHz;
-            break;
-
-          case 100:
-            ulsch->O                                   = sizeof_HLC_subband_cqi_nopmi_20MHz;
-            break;
-          }
-
-          ulsch->uci_format                          = HLC_subband_cqi_nopmi;
-          ulsch->o_RI[0]                             = 1;
-        }
-
-        break;
-
-      default:
-        LOG_E(PHY,"Incorrect Transmission Mode \n");
-        break;
-      }
-    } else {
-      ulsch->O_RI = 0;
-      ulsch->O                                   = 0;
-      ulsch->uci_format                          = HLC_subband_cqi_nopmi;
-    }
-
-    print_CQI(ulsch->o,ulsch->uci_format,eNB_id,ue->frame_parms.N_RB_DL);
-
-    ulsch->bundling = 1-AckNackFBMode;
-
-    if (frame_parms->frame_type == FDD) {
-      //int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4);
-      int dl_subframe = subframe;
-
-      if (ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_ack[dl_subframe].send_harq_status>0) { // we have downlink transmission
-        ulsch->harq_processes[harq_pid]->O_ACK = 1;
-      } else {
-        ulsch->harq_processes[harq_pid]->O_ACK = 0;
-      }
-      /*LOG_I(PHY,"DCI 0 Processing: dl_subframe %d send_harq_status Odd %d send_harq_status Even %d harq_pid %d O_ACK %d\n", dl_subframe,
-              ue->dlsch[0][eNB_id][0]->harq_ack[dl_subframe].send_harq_status,
-              ue->dlsch[1][eNB_id][0]->harq_ack[dl_subframe].send_harq_status,
-              harq_pid,
-              ulsch->harq_processes[harq_pid]->O_ACK);*/
-
-    } else {
-      if (ulsch->bundling)
-        ulsch->harq_processes[harq_pid]->O_ACK = (dai == 3)? 0 : 1;
-      else
-        ulsch->harq_processes[harq_pid]->O_ACK = (dai >= 2)? 2 : (dai+1)&3; //(dai+1)&3;
-
-      //      ulsch->harq_processes[harq_pid]->V_UL_DAI = dai+1;
-    }
-
-    dlsch[0]->harq_ack[subframe].vDAI_UL = dai+1;
-
-
-    LOG_D(PHY, "[PUSCH %d] Format0 DCI %s, CQI_req=%d, cshift=%d, TPC=%d, DAI=%d, vDAI_UL[sf#%d]=%d, NDI=%d, MCS=%d, RBalloc=%d, first_rb=%d, harq_pid=%d, nb_rb=%d, subframe_scheduling_flag=%d"
-            "   ulsch->bundling %d, O_ACK %d \n",
-        harq_pid,
-        (frame_parms->frame_type == TDD? "TDD" : "FDD"),
-        cqi_req, cshift, TPC, dai, subframe, dlsch[0]->harq_ack[subframe].vDAI_UL, ndi, mcs, rballoc,
-        ulsch->harq_processes[harq_pid]->first_rb, harq_pid, ulsch->harq_processes[harq_pid]->nb_rb,
-        ulsch->harq_processes[harq_pid]->subframe_scheduling_flag,
-        ulsch->bundling,
-        ulsch->harq_processes[harq_pid]->O_ACK);
-
-    LOG_D(PHY,"Setting beta_offset_cqi_times8 to %d, index %d\n",
-	  beta_cqi[ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index],
-	  ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index);
-
-    ulsch->beta_offset_cqi_times8                = beta_cqi[ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index];//18;
-    ulsch->beta_offset_ri_times8                 = beta_ri[ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index];//10;
-    ulsch->beta_offset_harqack_times8            = beta_ack[ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index];//16;
-
-    ulsch->Nsymb_pusch                             = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1);
-    ulsch->srs_active                              = use_srs;
-
-    if ((rnti >= cba_rnti) && (rnti < p_rnti))
-      ulsch->harq_processes[harq_pid]->status = CBA_ACTIVE;
-    else
-      ulsch->harq_processes[harq_pid]->status = ACTIVE;
-
-    ulsch->harq_processes[harq_pid]->rvidx = 0;
-
-    //      ulsch->harq_processes[harq_pid]->calibration_flag =0;
-    if (mcs < 29) {
-      ulsch->harq_processes[harq_pid]->mcs = mcs;
-      // ulsch->harq_processes[harq_pid]->round = 0;
-    } else {
-      ulsch->harq_processes[harq_pid]->rvidx = mcs - 28;
-      if (ulsch->harq_processes[harq_pid]->round == 0) {
-        LOG_W(PHY,"PUSCH::mcs = %d and DCI0::mcs(%d) > 28 and round == %d\n", ulsch->harq_processes[harq_pid]->mcs, mcs, ulsch->harq_processes[harq_pid]->round);
-      } else {
-        LOG_D(PHY,"PUSCH::mcs = %d and DCI0::mcs(%d) > 28 and round == %d\n", ulsch->harq_processes[harq_pid]->mcs, mcs, ulsch->harq_processes[harq_pid]->round);
-      }
-      //LOG_E(PHY,"Fatal: mcs(%d) > 28!!! and round == 0\n", mcs);
-    }
-    ulsch->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1];
-
-    /*
-       else if (ulsch->harq_processes[harq_pid]->mcs == 29) {
-       ulsch->harq_processes[harq_pid]->mcs = 4;
-       ulsch->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1];
-    // ulsch->harq_processes[harq_pid]->calibration_flag =1;
-    // printf("Auto-Calibration (UE): mcs %d, TBS %d, nb_rb %d\n",ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->TBS,ulsch->harq_processes[harq_pid]->nb_rb);
-    }*/
-    ulsch->harq_processes[harq_pid]->Msc_initial   = 12*ulsch->harq_processes[harq_pid]->nb_rb;
-    ulsch->harq_processes[harq_pid]->Nsymb_initial = ulsch->Nsymb_pusch;
-
-    // a Ndi=1 automatically acknowledges previous PUSCH transmission
-    if (ue->ulsch_Msg3_active[eNB_id] == 1)
-      ue->ulsch_Msg3_active[eNB_id] = 0;
-
-    LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d), nb_rb %d, first_rb %d, mcs %d, round %d, rv %d, ulsch_ue_Msg3_active %d, cqi_req %d => O %d\n",
-        ue->Mod_id,harq_pid,
-        proc->frame_rx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift,ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb,
-	  ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->round,ulsch->harq_processes[harq_pid]->rvidx, ue->ulsch_Msg3_active[eNB_id],cqi_req,ulsch->O);
-
-  // ulsch->n_DMRS2 = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift;
-
-#ifdef UE_DEBUG_TRACE
-
-    LOG_D(PHY,"Format 0 DCI : ulsch (ue): AbsSubframe %d.%d\n",proc->frame_rx%1024,subframe);
-    LOG_D(PHY,"Format 0 DCI : ulsch (ue): NBRB        %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
-    LOG_D(PHY,"Format 0 DCI :ulsch (ue): first_rb    %d\n",ulsch->harq_processes[harq_pid]->first_rb);
-    LOG_D(PHY,"Format 0 DCI :ulsch (ue): rballoc     %d\n",rballoc);
-    LOG_D(PHY,"Format 0 DCI :ulsch (ue): harq_pid    %d\n",harq_pid);
-    LOG_D(PHY,"Format 0 DCI :ulsch (ue): first_tx       %d\n",ulsch->harq_processes[harq_pid]->first_tx);
-    LOG_D(PHY,"Format 0 DCI :ulsch (ue): DCINdi       %d\n",ulsch->harq_processes[harq_pid]->DCINdi);
-    LOG_D(PHY,"Format 0 DCI :ulsch (ue): round       %d\n",ulsch->harq_processes[harq_pid]->round);
-    //LOG_I(PHY,"Format 0 DCI :ulsch (ue): TBS         %d\n",ulsch->harq_processes[harq_pid]->TBS);
-    LOG_D(PHY,"Format 0 DCI :ulsch (ue): mcs         %d\n",ulsch->harq_processes[harq_pid]->mcs);
-    //LOG_I(PHY,"Format 0 DCI :ulsch (ue): O           %d\n",ulsch->O);
-    //LOG_I(PHY,"Format 0 DCI :ulsch (ue): cqiReq      %d\n",cqi_req);
-    //if (frame_parms->frame_type == TDD)
-    //  LOG_I(PHY,"Format 0 DCI :ulsch (ue): O_ACK/DAI   %d/%d\n",ulsch->harq_processes[harq_pid]->O_ACK,dai);
-    //else
-    //  LOG_I(PHY,"Format 0 DCI :ulsch (ue): O_ACK       %d\n",ulsch->harq_processes[harq_pid]->O_ACK);
-
-    LOG_D(PHY,"Format 0 DCI :ulsch (ue): Nsymb_pusch   %d\n",ulsch->Nsymb_pusch);
-    LOG_D(PHY,"Format 0 DCI :ulsch (ue): cshift        %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
-    LOG_D(PHY,"Format 0 DCI :ulsch (ue): phich status  %d\n",ulsch->harq_processes[harq_pid]->status);
-#else
-    UNUSED_VARIABLE(dai);
-#endif
-    return(0);
-  } else {
-    LOG_E(PHY,"frame %d, subframe %d: FATAL ERROR, generate_ue_ulsch_params_from_dci, Illegal dci_format %d\n",
-          proc->frame_rx, subframe,dci_format);
-    return(-1);
-  }
-
-}
-
-/*
-int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
-                                       eNB_rxtx_proc_t *proc,
-                                       void *dci_pdu,
-                                       uint16_t rnti,
-                                       DCI_format_t dci_format,
-                                       uint8_t UE_id,
-                                       uint16_t si_rnti,
-                                       uint16_t ra_rnti,
-                                       uint16_t p_rnti,
-                                       uint16_t cba_rnti,
-                                       uint8_t use_srs)
-{
-
-  uint8_t harq_pid;
-  uint32_t rb_alloc;
-  uint8_t transmission_mode=eNB->transmission_mode[UE_id];
-  ANFBmode_t AckNackFBMode = eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode;
-  LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id];
-  LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
-  int subframe = proc->subframe_tx;
-
-  uint32_t cqi_req = 0;
-  uint32_t dai = 0;
-  uint32_t cshift = 0;
-  uint32_t TPC = 0;
-  uint32_t mcs = 0;
-  uint32_t rballoc = UINT32_MAX;
-  uint32_t RIV_max = 0;
-  //  uint32_t hopping;
-  //  uint32_t type;
-
-#ifdef DEBUG_DCI
-  printf("filling eNB ulsch params for rnti %x, dci format %d, dci %x, subframe %d\n",
-        rnti,dci_format,*(uint32_t*)dci_pdu,subframe);
-#endif
-
-  if (dci_format == format0) {
-
-    harq_pid = subframe2harq_pid(frame_parms,
-                                 pdcch_alloc2ul_frame(frame_parms,
-                                                      proc->frame_tx,
-                                                      subframe),
-                                 pdcch_alloc2ul_subframe(frame_parms,subframe));
-    switch (frame_parms->N_RB_DL) {
-    case 6:
-      if (frame_parms->frame_type == TDD) {
-        cqi_req = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->cqi_req;
-        dai     = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->dai;
-        cshift  = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC;
-        mcs     = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping;
-        //  type    = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->type;
-      } else {
-        cqi_req = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cqi_req;
-        cshift  = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->TPC;
-        mcs     = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping=hopping;
-        //  type    = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->type;
-      }
-      
-      RIV_max = RIV_max6;
-      ulsch->harq_processes[harq_pid]->first_rb                              = RIV2first_rb_LUT6[rballoc];
-      ulsch->harq_processes[harq_pid]->nb_rb                                 = RIV2nb_rb_LUT6[rballoc];
-
-      break;
-
-    case 25:
-      if (frame_parms->frame_type == TDD) {
-        cqi_req = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cqi_req;
-        dai     = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->dai;
-        cshift  = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->TPC;
-        mcs     = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->hopping;
-        //  type    = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->type;
-      } else {
-        cqi_req = ((DCI0_5MHz_FDD_t *)dci_pdu)->cqi_req;
-        cshift  = ((DCI0_5MHz_FDD_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_5MHz_FDD_t *)dci_pdu)->TPC;
-        mcs     = ((DCI0_5MHz_FDD_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_5MHz_FDD_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_5MHz_FDD_t *)dci_pdu)->hopping;
-        //  type    = ((DCI0_5MHz_FDD_t *)dci_pdu)->type;
-      }
-
-      RIV_max = RIV_max25;
-      ulsch->harq_processes[harq_pid]->first_rb                              = RIV2first_rb_LUT25[rballoc];
-      ulsch->harq_processes[harq_pid]->nb_rb                                 = RIV2nb_rb_LUT25[rballoc];
-
-      break;
-
-    case 50:
-      if (frame_parms->frame_type == TDD) {
-        cqi_req = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->cqi_req;
-        dai     = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->dai;
-        cshift  = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->TPC;
-        mcs     = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->hopping;
-        //  type    = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->type;
-      } else {
-        cqi_req = ((DCI0_10MHz_FDD_t *)dci_pdu)->cqi_req;
-        cshift  = ((DCI0_10MHz_FDD_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_10MHz_FDD_t *)dci_pdu)->TPC;
-        mcs     = ((DCI0_10MHz_FDD_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_10MHz_FDD_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_10MHz_FDD_t *)dci_pdu)->hopping;
-        //  type    = ((DCI0_10MHz_FDD_t *)dci_pdu)->type;
-      }
-
-      RIV_max = RIV_max50;
-      ulsch->harq_processes[harq_pid]->first_rb                              = RIV2first_rb_LUT50[rballoc];
-      ulsch->harq_processes[harq_pid]->nb_rb                                 = RIV2nb_rb_LUT50[rballoc];
-
-      break;
-
-    case 100:
-      if (frame_parms->frame_type == TDD) {
-        cqi_req = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->cqi_req;
-        dai     = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->dai;
-        cshift  = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->TPC;
-        mcs     = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->hopping;
-        //  type    = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->type;
-      } else {
-        cqi_req = ((DCI0_20MHz_FDD_t *)dci_pdu)->cqi_req;
-        cshift  = ((DCI0_20MHz_FDD_t *)dci_pdu)->cshift;
-        TPC     = ((DCI0_20MHz_FDD_t *)dci_pdu)->TPC;
-        mcs     = ((DCI0_20MHz_FDD_t *)dci_pdu)->mcs;
-        rballoc = ((DCI0_20MHz_FDD_t *)dci_pdu)->rballoc;
-        //  hopping = ((DCI0_20MHz_FDD_t *)dci_pdu)->hopping;
-        //  type    = ((DCI0_20MHz_FDD_t *)dci_pdu)->type;
-      }
-
-      RIV_max = RIV_max100;
-      ulsch->harq_processes[harq_pid]->first_rb                              = RIV2first_rb_LUT100[rballoc];
-      ulsch->harq_processes[harq_pid]->nb_rb                                 = RIV2nb_rb_LUT100[rballoc];
-
-      //printf("eNB: rb_alloc (20 MHz dci) %d\n",rballoc);
-      break;
-
-    default:
-      LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-      DevParam (frame_parms->N_RB_DL, 0, 0);
-      break;
-    }
-
-
-    rb_alloc = rballoc;
-    AssertFatal(rb_alloc>RIV_max,
-		"Format 0: rb_alloc (%d) > RIV_max (%d)\n",rb_alloc,RIV_max);
-#ifdef DEBUG_DCI
-    printf("generate_eNB_ulsch_params_from_dci: subframe %d, rnti %x,harq_pid %d,cqi_req %d\n",subframe,rnti,harq_pid,cqi_req);
-#endif
-
-    ulsch->harq_processes[harq_pid]->dci_alloc                             = 1;
-    ulsch->harq_processes[harq_pid]->rar_alloc                             = 0;
-    ulsch->harq_processes[harq_pid]->TPC                                   = TPC;
-    ulsch->harq_processes[harq_pid]->n_DMRS                                = cshift;
-
-
-    if (cqi_req == 1) {
-      // 36.213 7.2.1 (release 10) says:
-      // "RI is only reported for transmission modes 3 and 4,
-      // as well as transmission modes 8 and 9 with PMI/RI reporting"
-      // This is for aperiodic reporting.
-      // TODO: deal with TM 8&9 correctly when they are implemented.
-      // TODO: deal with periodic reporting if we implement it.
-      //
-      if (transmission_mode == 3 || transmission_mode == 4)
-        ulsch->harq_processes[harq_pid]->O_RI = 1; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table
-      else
-        ulsch->harq_processes[harq_pid]->O_RI = 0;
-
-      switch(transmission_mode) {
-        // The aperiodic CQI reporting mode is fixed for every transmission mode instead of being configured by higher layer signaling
-      case 1:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          ulsch->harq_processes[harq_pid]->Or2                                   = 0;
-
-          switch (frame_parms->N_RB_DL) {
-          case 6:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_mcs_CBA;
-        } else {
-          ulsch->harq_processes[harq_pid]->Or2                                   = 0;
-
-          switch (frame_parms->N_RB_DL) {
-          case 6:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_5MHz;
-            break;
-
-          case 50:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_10MHz;
-            break;
-
-          case 100:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_20MHz;
-            break;
-          }
-
-          ulsch->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_nopmi;
-        }
-
-        break;
-
-      case 2:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          ulsch->harq_processes[harq_pid]->Or2                                   = 0;
-
-          switch (frame_parms->N_RB_DL) {
-          case 6:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_mcs_CBA;
-        } else {
-          ulsch->harq_processes[harq_pid]->Or2                                   = 0;
-
-          switch (frame_parms->N_RB_DL) {
-          case 6:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_5MHz;
-            break;
-
-          case 50:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_10MHz;
-            break;
-
-          case 100:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_20MHz;
-            break;
-          }
-
-          ulsch->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_nopmi;
-        }
-
-        break;
-
-      case 3:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          ulsch->harq_processes[harq_pid]->Or2                                   = 0;
-
-          switch (frame_parms->N_RB_DL) {
-          case 6:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_mcs_CBA;
-        } else {
-          ulsch->harq_processes[harq_pid]->Or2                                   = 0;
-
-          switch (frame_parms->N_RB_DL) {
-          case 6:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_5MHz;
-            break;
-
-          case 50:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_10MHz;
-            break;
-
-          case 100:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_20MHz;
-            break;
-          }
-
-          ulsch->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_nopmi;
-        }
-
-        break;
-
-      case 4:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          ulsch->harq_processes[harq_pid]->Or2                                   = 0;
-
-          switch (frame_parms->N_RB_DL) {
-          case 6:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_mcs_CBA;
-        } else {
-          switch (frame_parms->N_RB_DL) {
-          case 6:
-            ulsch->harq_processes[harq_pid]->Or2                                 = sizeof_wideband_cqi_rank2_2A_1_5MHz;
-            ulsch->harq_processes[harq_pid]->Or1                                 = sizeof_wideband_cqi_rank1_2A_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->harq_processes[harq_pid]->Or2                                 = sizeof_wideband_cqi_rank2_2A_5MHz;
-            ulsch->harq_processes[harq_pid]->Or1                                 = sizeof_wideband_cqi_rank1_2A_5MHz;
-            break;
-
-          case 50:
-            ulsch->harq_processes[harq_pid]->Or2                                 = sizeof_wideband_cqi_rank2_2A_10MHz;
-            ulsch->harq_processes[harq_pid]->Or1                                 = sizeof_wideband_cqi_rank1_2A_10MHz;
-            break;
-
-          case 100:
-            ulsch->harq_processes[harq_pid]->Or2                                 = sizeof_wideband_cqi_rank2_2A_20MHz;
-            ulsch->harq_processes[harq_pid]->Or1                                 = sizeof_wideband_cqi_rank1_2A_20MHz;
-            break;
-
-          }
-
-          ulsch->harq_processes[harq_pid]->uci_format                          = wideband_cqi_rank1_2A;
-        }
-
-        break;
-
-      case 5:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          ulsch->harq_processes[harq_pid]->Or2                                   = 0;
-
-          switch (frame_parms->N_RB_DL) {
-          case 6:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_mcs_CBA;
-        } else {
-          switch (frame_parms->N_RB_DL) {
-          case 6:
-            ulsch->harq_processes[harq_pid]->Or2                                 = sizeof_wideband_cqi_rank2_2A_1_5MHz;
-            ulsch->harq_processes[harq_pid]->Or1                                 = sizeof_wideband_cqi_rank1_2A_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->harq_processes[harq_pid]->Or2                                 = sizeof_wideband_cqi_rank2_2A_5MHz;
-            ulsch->harq_processes[harq_pid]->Or1                                 = sizeof_wideband_cqi_rank1_2A_5MHz;
-            break;
-
-          case 50:
-            ulsch->harq_processes[harq_pid]->Or2                                 = sizeof_wideband_cqi_rank2_2A_10MHz;
-            ulsch->harq_processes[harq_pid]->Or1                                 = sizeof_wideband_cqi_rank1_2A_10MHz;
-            break;
-
-          case 100:
-            ulsch->harq_processes[harq_pid]->Or2                                 = sizeof_wideband_cqi_rank2_2A_20MHz;
-            ulsch->harq_processes[harq_pid]->Or1                                 = sizeof_wideband_cqi_rank1_2A_20MHz;
-            break;
-          }
-
-          ulsch->harq_processes[harq_pid]->uci_format                          = wideband_cqi_rank1_2A;
-        }
-
-        break;
-
-      case 6:
-        if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-          ulsch->harq_processes[harq_pid]->Or2                                   = 0;
-
-          switch (frame_parms->N_RB_DL) {
-          case 6:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_5MHz;
-            break;
-
-          case 50:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_10MHz;
-            break;
-
-          case 100:
-            ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_mcs_CBA_20MHz;
-            break;
-          }
-
-          ulsch->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_mcs_CBA;
-        } else {
-          switch (frame_parms->N_RB_DL) {
-          case 6:
-            ulsch->harq_processes[harq_pid]->Or2                                 = sizeof_wideband_cqi_rank2_2A_1_5MHz;
-            ulsch->harq_processes[harq_pid]->Or1                                 = sizeof_wideband_cqi_rank1_2A_1_5MHz;
-            break;
-
-          case 25:
-            ulsch->harq_processes[harq_pid]->Or2                                 = sizeof_wideband_cqi_rank2_2A_5MHz;
-            ulsch->harq_processes[harq_pid]->Or1                                 = sizeof_wideband_cqi_rank1_2A_5MHz;
-            break;
-
-          case 50:
-            ulsch->harq_processes[harq_pid]->Or2                                 = sizeof_wideband_cqi_rank2_2A_10MHz;
-            ulsch->harq_processes[harq_pid]->Or1                                 = sizeof_wideband_cqi_rank1_2A_10MHz;
-            break;
-
-          case 100:
-            ulsch->harq_processes[harq_pid]->Or2                                 = sizeof_wideband_cqi_rank2_2A_20MHz;
-            ulsch->harq_processes[harq_pid]->Or1                                 = sizeof_wideband_cqi_rank1_2A_20MHz;
-            break;
-          }
-
-          ulsch->harq_processes[harq_pid]->uci_format                          = wideband_cqi_rank1_2A;
-        }
-
-        break;
-
-      case 7:
-        ulsch->harq_processes[harq_pid]->Or2                                   = 0;
-
-        switch (frame_parms->N_RB_DL) {
-        case 6:
-          ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_1_5MHz;
-          break;
-
-        case 25:
-          ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_5MHz;
-          break;
-
-        case 50:
-          ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_10MHz;
-          break;
-
-        case 100:
-          ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_HLC_subband_cqi_nopmi_20MHz;
-          break;
-        }
-
-        ulsch->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_nopmi;
-        break;
-
-      default:
-        LOG_E(PHY,"Incorrect Transmission Mode \n");
-        break;
-      }
-    } else {
-      ulsch->harq_processes[harq_pid]->O_RI = 0;
-      ulsch->harq_processes[harq_pid]->Or2                                   = 0;
-      ulsch->harq_processes[harq_pid]->Or1                                   = 0;
-      ulsch->harq_processes[harq_pid]->uci_format                            = HLC_subband_cqi_nopmi;
-    }
-
-    ulsch->bundling = 1-AckNackFBMode;
-
-    if (frame_parms->frame_type == FDD) {
-      int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4);
-
-      if (eNB->dlsch[UE_id][0]->subframe_tx[dl_subframe]>0) { // we have downlink transmission
-        ulsch->harq_processes[harq_pid]->O_ACK = 1;
-      } else {
-        ulsch->harq_processes[harq_pid]->O_ACK = 0;
-      }
-    } else {
-      if (ulsch->bundling)
-        ulsch->harq_processes[harq_pid]->O_ACK = (dai == 3)? 0 : 1;
-      else
-        ulsch->harq_processes[harq_pid]->O_ACK = (dai+1)&3;
-
-      ulsch->harq_processes[harq_pid]->V_UL_DAI = dai+1;
-    }
-
-    ulsch->beta_offset_cqi_times8                = beta_cqi[eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index];//18;
-    ulsch->beta_offset_ri_times8                 = beta_ri[eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index];//10;
-    ulsch->beta_offset_harqack_times8            = beta_ack[eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index];//16;
-
-    ulsch->harq_processes[harq_pid]->Nsymb_pusch                             = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1);
-    ulsch->harq_processes[harq_pid]->srs_active                            = use_srs;
-
-    //Mapping of cyclic shift field in DCI format0 to n_DMRS2 (3GPP 36.211, Table 5.5.2.1.1-1)
-    if(cshift == 0)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 0;
-    else if(cshift == 1)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 6;
-    else if(cshift == 2)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 3;
-    else if(cshift == 3)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 4;
-    else if(cshift == 4)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 2;
-    else if(cshift == 5)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 8;
-    else if(cshift == 6)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 10;
-    else if(cshift == 7)
-      ulsch->harq_processes[harq_pid]->n_DMRS2 = 9;
-
-
-    LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d)\n",
-          eNB->Mod_id,harq_pid,proc->frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift);
-
-
-
-    if (ulsch->harq_processes[harq_pid]->round == 0) {
-      if ((rnti >= cba_rnti) && (rnti < p_rnti))
-        ulsch->harq_processes[harq_pid]->status = CBA_ACTIVE;
-      else
-        ulsch->harq_processes[harq_pid]->status = ACTIVE;
-
-      ulsch->harq_processes[harq_pid]->rvidx = 0;
-      ulsch->harq_processes[harq_pid]->mcs         = mcs;
-      //      ulsch->harq_processes[harq_pid]->calibration_flag = 0;
-      //if (ulsch->harq_processes[harq_pid]->mcs)
-      //
-      //if (ulsch->harq_processes[harq_pid]->mcs == 29) {
-      //ulsch->harq_processes[harq_pid]->mcs = 4;
-      // ulsch->harq_processes[harq_pid]->calibration_flag = 1;
-      // printf("Auto-Calibration (eNB): mcs %d, nb_rb %d\n",ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->nb_rb);
-      //}
-      
-      ulsch->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1];
-
-      ulsch->harq_processes[harq_pid]->Msc_initial   = 12*ulsch->harq_processes[harq_pid]->nb_rb;
-      ulsch->harq_processes[harq_pid]->Nsymb_initial = ulsch->harq_processes[harq_pid]->Nsymb_pusch;
-      ulsch->harq_processes[harq_pid]->round = 0;
-    } else {
-      if (mcs>28)
-        ulsch->harq_processes[harq_pid]->rvidx = mcs - 28;
-      else {
-        ulsch->harq_processes[harq_pid]->rvidx = 0;
-        ulsch->harq_processes[harq_pid]->mcs = mcs;
-      }
-
-      //      ulsch->harq_processes[harq_pid]->round++;
-    }
-
-    if ((rnti >= cba_rnti) && (rnti < p_rnti)) {
-      ulsch->cba_rnti[0] = rnti;
-    } else {
-      ulsch->rnti = rnti;
-    }
-
-    //ulsch->n_DMRS2 = cshift;
-
-#ifdef DEBUG_DCI
-    printf("ulsch (eNB): NBRB          %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
-    printf("ulsch (eNB): first_rb      %d\n",ulsch->harq_processes[harq_pid]->first_rb);
-    printf("ulsch (eNB): harq_pid      %d\n",harq_pid);
-    printf("ulsch (eNB): round         %d\n",ulsch->harq_processes[harq_pid]->round);
-    printf("ulsch (eNB): TBS           %d\n",ulsch->harq_processes[harq_pid]->TBS);
-    printf("ulsch (eNB): mcs           %d\n",ulsch->harq_processes[harq_pid]->mcs);
-    printf("ulsch (eNB): Or1           %d\n",ulsch->harq_processes[harq_pid]->Or1);
-    printf("ulsch (eNB): Nsymb_pusch   %d\n",ulsch->harq_processes[harq_pid]->Nsymb_pusch);
-    printf("ulsch (eNB): cshift        %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2);
-#else
-    UNUSED_VARIABLE(dai);
-#endif
-    return(0);
-  } else {
-    LOG_E(PHY,"generate_eNB_ulsch_params_from_dci, Illegal dci_format %d\n",dci_format);
-    return(-1);
-  }
-
-}
-*/
-
-double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe)
-{
-  uint8_t transmission_mode = ue->transmission_mode[eNB_id];
-  PHY_MEASUREMENTS *meas = &ue->measurements;
-  LTE_DL_FRAME_PARMS *frame_parms =  &ue->frame_parms;
-  int32_t **dl_channel_est = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id];
-  double *s_dB;
-  s_dB = ue->sinr_CQI_dB;
-  //  LTE_UE_ULSCH_t *ulsch  = ue->ulsch[eNB_id];
-  //for the calculation of SINR_eff for CQI calculation
-  int count,a_rx,a_tx;
-  double abs_channel=0;
-  double channelx=0;
-  double channely=0;
-  double channelx_i=0;
-  double channely_i=0;
-  uint16_t q = quantize_subband_pmi(meas,eNB_id,7);
-  uint8_t qq;
-
-  switch(transmission_mode) {
-  case 1:
-    for (count=0; count<frame_parms->N_RB_DL*12; count++) {
-      for(a_tx=0; a_tx<frame_parms->nb_antenna_ports_eNB; a_tx++) {
-        for (a_rx=0; a_rx<frame_parms->nb_antennas_rx; a_rx++) {
-          s_dB[count] = 10*log10(pow(((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2],2) + pow(((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2],
-                                 2)) - meas->n0_power_avg_dB;
-        }
-      }
-    }
-
-    break;
-
-  case 2:
-    for (count=0; count<frame_parms->N_RB_DL*12; count++) {
-      abs_channel=0;
-
-      for(a_tx=0; a_tx<frame_parms->nb_antenna_ports_eNB; a_tx++) {
-        for (a_rx=0; a_rx<frame_parms->nb_antennas_rx; a_rx++) {
-          abs_channel += (pow(((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2],2) + pow(((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2],2));
-        }
-      }
-
-      s_dB[count] = 10*log10(abs_channel/2) - meas->n0_power_avg_dB;
-    }
-
-    break;
-
-  case 5:
-    for (count=0; count<frame_parms->N_RB_DL*12; count++) {
-      channelx=0;
-      channely=0;
-      channelx_i=0;
-      channely_i=0;
-      qq = (q>>(((count/12)>>2)<<1))&3;
-
-      //printf("pmi_alloc %d: rb %d, pmi %d\n",q,count/12,qq);
-      for(a_tx=0; a_tx<frame_parms->nb_antenna_ports_eNB; a_tx++) {
-        for (a_rx=0; a_rx<frame_parms->nb_antennas_rx; a_rx++) {
-          switch(qq) {
-          case 0:
-            if (channelx==0 || channely==0) {
-              channelx = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-              channelx_i = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely_i = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-            } else {
-              channelx += ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely += ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-              channelx_i -= ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely_i -= ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-            }
-
-            break;
-
-          case 1:
-            if (channelx==0 || channely==0) {
-              channelx = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-              channelx_i = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely_i = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-            } else {
-              channelx -= ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely -= ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-              channelx_i += ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely_i += ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-            }
-
-            break;
-
-          case 2:
-            if (channelx==0 || channely==0) {
-              channelx = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-              channelx_i = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely_i = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-            } else {
-              channelx -= ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-              channely += ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channelx_i += ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-              channely_i -= ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-            }
-
-            break;
-
-          case 3:
-            if (channelx==0 || channely==0) {
-              channelx = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-              channelx_i = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely_i = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-            } else {
-              channelx += ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-              channely -= ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channelx_i -= ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-              channely_i += ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-            }
-
-            break;
-
-          default:
-            printf("Problem in SINR Calculation for TM5 \n");
-            break;
-          }//switch(qq)
-        }//a_rx
-      }//a_tx
-
-      s_dB[count] =  10 * log10 ((pow(channelx,2) + pow(channely,2))/2) - 10 * log10 ((pow(channelx_i,2) + pow(channely_i,2))/2) - meas->n0_power_avg_dB;
-    }//count
-
-    break;
-
-  case 6:
-    for (count=0; count<frame_parms->N_RB_DL*12; count++) {
-      channelx=0;
-      channely=0;
-      qq = (q>>(((count/12)>>2)<<1))&3;
-
-      //printf("pmi_alloc %d: rb %d, pmi %d\n",q,count/12,qq);
-      for(a_tx=0; a_tx<frame_parms->nb_antenna_ports_eNB; a_tx++) {
-        for (a_rx=0; a_rx<frame_parms->nb_antennas_rx; a_rx++) {
-          switch(qq) {
-          case 0:
-            if (channelx==0 || channely==0) {
-              channelx = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-            } else {
-              channelx += ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely += ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-            }
-
-            break;
-
-          case 1:
-            if (channelx==0 || channely==0) {
-              channelx = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-            } else {
-              channelx -= ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely -= ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-            }
-
-            break;
-
-          case 2:
-            if (channelx==0 || channely==0) {
-              channelx = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-            } else {
-              channelx -= ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-              channely += ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-            }
-
-            break;
-
-          case 3:
-            if (channelx==0 || channely==0) {
-              channelx = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-              channely = ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-            } else {
-              channelx += ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2];
-              channely -= ((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2];
-            }
-
-            break;
-
-          default:
-            printf("Problem in SINR Calculation for TM6 \n");
-            break;
-          }//switch(qq)
-        }//a_rx
-      }//a_tx
-
-      s_dB[count] =  10 * log10 ((pow(channelx,2) + pow(channely,2))/2) - meas->n0_power_avg_dB;
-    }//count
-
-    break;
-
-  default:
-    printf("Problem in SINR Calculation for CQI \n");
-    break;
-  }
-
-  int ii;
-  double sinr_eff = 0;
-  double sinr_eff_qpsk=0;
-  double sinr_eff_qam16=0;
-  double sinr_eff_qam64=0;
-  double x = 0;
-  double I_qpsk=0;
-  double I_qam16=0;
-  double I_qam64=0;
-  double I_qpsk_avg=0;
-  double I_qam16_avg=0;
-  double I_qam64_avg=0;
-  double qpsk_max=12.2;
-  double qam16_max=19.2;
-  double qam64_max=25.2;
-  double sinr_min = -20;
-  int offset=0;
-
-
-  for (offset = 0; offset <= 24; offset++) {
-    for(ii=0; ii<12; ii++) {
-      //x is the sinr_dB in dB
-      x = s_dB[(offset*12)+ii];
-
-      if(x<sinr_min) {
-        I_qpsk +=0;
-        I_qam16 +=0;
-        I_qam64 +=0;
-      } else {
-        if(x>qpsk_max)
-          I_qpsk += 1;
-        else
-          I_qpsk += (q_qpsk[0]*pow(x,7) + q_qpsk[1]*pow(x,6) + q_qpsk[2]*pow(x,5) + q_qpsk[3]*pow(x,4) + q_qpsk[4]*pow(x,3) + q_qpsk[5]*pow(x,2) + q_qpsk[6]*x + q_qpsk[7]);
-
-        if(x>qam16_max)
-          I_qam16 += 1;
-        else
-          I_qam16 += (q_qam16[0]*pow(x,7) + q_qam16[1]*pow(x,6) + q_qam16[2]*pow(x,5) + q_qam16[3]*pow(x,4) + q_qam16[4]*pow(x,3) + q_qam16[5]*pow(x,2) + q_qam16[6]*x + q_qam16[7]);
-
-        if(x>qam64_max)
-          I_qam64 += 1;
-        else
-          I_qam64 += (q_qam64[0]*pow(x,7) + q_qam64[1]*pow(x,6) + q_qam64[2]*pow(x,5) + q_qam64[3]*pow(x,4) + q_qam64[4]*pow(x,3) + q_qam64[5]*pow(x,2) + q_qam64[6]*x + q_qam64[7]);
-
-      }
-    }
-  }
-
-  // averaging of accumulated MI
-  I_qpsk_avg = I_qpsk/(12*frame_parms->N_RB_DL);
-  I_qam16_avg = I_qam16/(12*frame_parms->N_RB_DL);
-  I_qam64_avg = I_qam64/(12*frame_parms->N_RB_DL);
-
-  // I->SINR_effective Mapping
-
-  sinr_eff_qpsk = (p_qpsk[0]*pow(I_qpsk_avg,7) + p_qpsk[1]*pow(I_qpsk_avg,6) + p_qpsk[2]*pow(I_qpsk_avg,5) + p_qpsk[3]*pow(I_qpsk_avg,4) + p_qpsk[4]*pow(I_qpsk_avg,3) + p_qpsk[5]*pow(I_qpsk_avg,
-                   2) + p_qpsk[6]*I_qpsk_avg + p_qpsk[7]);
-
-  sinr_eff_qam16 = (p_qam16[0]*pow(I_qam16_avg,7) + p_qam16[1]*pow(I_qam16_avg,6) + p_qam16[2]*pow(I_qam16_avg,5) + p_qam16[3]*pow(I_qam16_avg,4) + p_qam16[4]*pow(I_qam16_avg,
-                    3) + p_qam16[5]*pow(I_qam16_avg,2) + p_qam16[6]*I_qam16_avg + p_qam16[7]);
-
-  sinr_eff_qam64 = (p_qam64[0]*pow(I_qam64_avg,7) + p_qam64[1]*pow(I_qam64_avg,6) + p_qam64[2]*pow(I_qam64_avg,5) + p_qam64[3]*pow(I_qam64_avg,4) + p_qam64[4]*pow(I_qam64_avg,
-                    3) + p_qam64[5]*pow(I_qam64_avg,2) + p_qam64[6]*I_qam64_avg + p_qam64[7]);
-  sinr_eff = cmax3(sinr_eff_qpsk,sinr_eff_qam16,sinr_eff_qam64);
-
-  //printf("SINR_Eff = %e\n",sinr_eff);
-
-  return(sinr_eff);
-}
-//
-
-
-
-#ifdef DEBUG_DLSCH_TOOLS
-main()
-{
-
-  int i;
-  uint8_t rah;
-  uint32_t rballoc;
-
-  generate_RIV_tables();
-
-  rah = 0;
-  rballoc = 0x1fff;
-  printf("rballoc 0 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
-  rah = 1;
-
-  rballoc = 0x1678;
-  printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
-
-  rballoc = 0xfffc;
-  printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
-  rballoc = 0xfffd;
-  printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
-  rballoc = 0xffff;
-  printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
-  rballoc = 0xfffe;
-  printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
-}
-
-#endif
-
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools_common_extern.h b/openair1/PHY/LTE_TRANSPORT/dci_tools_common_extern.h
new file mode 100644
index 0000000000..b0a06fb9f1
--- /dev/null
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools_common_extern.h
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file PHY/LTE_TRANSPORT/dci_tools_common_extern.h
+ * \brief PHY Support routines (eNB/UE) for filling PDSCH/PUSCH/DLSCH/ULSCH data structures based on DCI PDUs generated by eNB MAC scheduler.
+ * \author R. Knopp
+ * \date 2011
+ * \version 0.1
+ * \company Eurecom
+ * \email: knopp@eurecom.fr
+ * \note
+ * \warning
+ */
+#include <stdint.h>
+
+extern uint32_t localRIV2alloc_LUT6[32];
+extern uint32_t distRIV2alloc_even_LUT6[32];
+extern uint32_t distRIV2alloc_odd_LUT6[32];
+extern uint16_t RIV2nb_rb_LUT6[32];
+extern uint16_t RIV2first_rb_LUT6[32];
+extern uint16_t RIV_max6;
+
+extern uint32_t localRIV2alloc_LUT25[512];
+extern uint32_t distRIV2alloc_even_LUT25[512];
+extern uint32_t distRIV2alloc_odd_LUT25[512];
+extern uint16_t RIV2nb_rb_LUT25[512];
+extern uint16_t RIV2first_rb_LUT25[512];
+extern uint16_t RIV_max25;
+
+
+extern uint32_t localRIV2alloc_LUT50_0[1600];
+extern uint32_t localRIV2alloc_LUT50_1[1600];
+extern uint32_t distRIV2alloc_gap0_even_LUT50_0[1600];
+extern uint32_t distRIV2alloc_gap0_odd_LUT50_0[1600];
+extern uint32_t distRIV2alloc_gap0_even_LUT50_1[1600];
+extern uint32_t distRIV2alloc_gap0_odd_LUT50_1[1600];
+extern uint32_t distRIV2alloc_gap1_even_LUT50_0[1600];
+extern uint32_t distRIV2alloc_gap1_odd_LUT50_0[1600];
+extern uint32_t distRIV2alloc_gap1_even_LUT50_1[1600];
+extern uint32_t distRIV2alloc_gap1_odd_LUT50_1[1600];
+extern uint16_t RIV2nb_rb_LUT50[1600];
+extern uint16_t RIV2first_rb_LUT50[1600];
+extern uint16_t RIV_max50;
+
+extern uint32_t localRIV2alloc_LUT100_0[6000];
+extern uint32_t localRIV2alloc_LUT100_1[6000];
+extern uint32_t localRIV2alloc_LUT100_2[6000];
+extern uint32_t localRIV2alloc_LUT100_3[6000];
+extern uint32_t distRIV2alloc_gap0_even_LUT100_0[6000];
+extern uint32_t distRIV2alloc_gap0_odd_LUT100_0[6000];
+extern uint32_t distRIV2alloc_gap0_even_LUT100_1[6000];
+extern uint32_t distRIV2alloc_gap0_odd_LUT100_1[6000];
+extern uint32_t distRIV2alloc_gap0_even_LUT100_2[6000];
+extern uint32_t distRIV2alloc_gap0_odd_LUT100_2[6000];
+extern uint32_t distRIV2alloc_gap0_even_LUT100_3[6000];
+extern uint32_t distRIV2alloc_gap0_odd_LUT100_3[6000];
+extern uint32_t distRIV2alloc_gap1_even_LUT100_0[6000];
+extern uint32_t distRIV2alloc_gap1_odd_LUT100_0[6000];
+extern uint32_t distRIV2alloc_gap1_even_LUT100_1[6000];
+extern uint32_t distRIV2alloc_gap1_odd_LUT100_1[6000];
+extern uint32_t distRIV2alloc_gap1_even_LUT100_2[6000];
+extern uint32_t distRIV2alloc_gap1_odd_LUT100_2[6000];
+extern uint32_t distRIV2alloc_gap1_even_LUT100_3[6000];
+extern uint32_t distRIV2alloc_gap1_odd_LUT100_3[6000];
+extern uint16_t RIV2nb_rb_LUT100[6000];
+extern uint16_t RIV2first_rb_LUT100[6000];
+extern uint16_t RIV_max100;
+
+extern int8_t *delta_PUCCH_lut;
+extern int8_t delta_PUSCH_acc[4];
+extern int8_t delta_PUSCH_abs[4];
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
index e91665e04e..e96e5937da 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -30,15 +30,14 @@
 * \warning
 */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "PHY/CODING/defs.h"
-#include "PHY/CODING/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "PHY/CODING/coding_defs.h"
+#include "PHY/CODING/coding_extern.h"
 #include "PHY/CODING/lte_interleaver_inline.h"
-#include "PHY/LTE_TRANSPORT/defs.h"
-#include "PHY/LTE_TRANSPORT/proto.h"
-#include "SCHED/defs.h"
-#include "defs.h"
+#include "PHY/LTE_TRANSPORT/transport_eNB.h"
+#include "PHY/LTE_TRANSPORT/transport_proto.h"
+#include "SCHED/sched_eNB.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 #include "UTIL/LOG/log.h"
 #include <syscall.h>
@@ -720,186 +719,6 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
 }
 
 
-int dlsch_encoding_SIC(PHY_VARS_UE *ue,
-		       unsigned char *a,
-		       uint8_t num_pdcch_symbols,
-		       LTE_eNB_DLSCH_t *dlsch,
-		       int frame,
-		       uint8_t subframe,
-		       time_stats_t *rm_stats,
-		       time_stats_t *te_stats,
-		       time_stats_t *i_stats)
-{
-  
-  unsigned int G;
-  unsigned int crc=1;
-  unsigned short iind;
-
-  LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
-  unsigned char harq_pid = ue->dlsch[subframe&2][0][0]->rnti;
-  unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb;
-  unsigned int A;
-  unsigned char mod_order;
-  unsigned int Kr=0,Kr_bytes,r,r_offset=0;
-  //  unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
-  uint8_t beamforming_mode=0;
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN);
-
-  A = dlsch->harq_processes[harq_pid]->TBS; //6228
-  // printf("Encoder: A: %d\n",A);
-  mod_order = dlsch->harq_processes[harq_pid]->Qm;
-
-  if(dlsch->harq_processes[harq_pid]->mimo_mode == TM7)
-    beamforming_mode = 7;
-  else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM8)
-    beamforming_mode = 8;
-  else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM9_10)
-    beamforming_mode = 9;
-  G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,beamforming_mode);
-
-
-  //  if (dlsch->harq_processes[harq_pid]->Ndi == 1) {  // this is a new packet
-  if (dlsch->harq_processes[harq_pid]->round == 0) {  // this is a new packet
-#ifdef DEBUG_DLSCH_CODING
-  printf("SIC encoding thinks this is a new packet \n");
-#endif
-    /*
-    int i;
-    printf("dlsch (tx): \n");
-    for (i=0;i<(A>>3);i++)
-      printf("%02x.",a[i]);
-    printf("\n");
-    */
-    // Add 24-bit crc (polynomial A) to payload
-    crc = crc24a(a,
-                 A)>>8;
-    a[A>>3] = ((uint8_t*)&crc)[2];
-    a[1+(A>>3)] = ((uint8_t*)&crc)[1];
-    a[2+(A>>3)] = ((uint8_t*)&crc)[0];
-    //    printf("CRC %x (A %d)\n",crc,A);
-
-    dlsch->harq_processes[harq_pid]->B = A+24;
-    //    dlsch->harq_processes[harq_pid]->b = a;
-    memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4);
-
-    if (lte_segmentation(dlsch->harq_processes[harq_pid]->b,
-                         dlsch->harq_processes[harq_pid]->c,
-                         dlsch->harq_processes[harq_pid]->B,
-                         &dlsch->harq_processes[harq_pid]->C,
-                         &dlsch->harq_processes[harq_pid]->Cplus,
-                         &dlsch->harq_processes[harq_pid]->Cminus,
-                         &dlsch->harq_processes[harq_pid]->Kplus,
-                         &dlsch->harq_processes[harq_pid]->Kminus,
-                         &dlsch->harq_processes[harq_pid]->F)<0)
-      return(-1);
-
-    for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
-
-      if (r<dlsch->harq_processes[harq_pid]->Cminus)
-        Kr = dlsch->harq_processes[harq_pid]->Kminus;
-      else
-        Kr = dlsch->harq_processes[harq_pid]->Kplus;
-
-      Kr_bytes = Kr>>3;
-
-      // get interleaver index for Turbo code (lookup in Table 5.1.3-3 36-212, V8.6 2009-03, p. 13-14)
-      if (Kr_bytes<=64)
-        iind = (Kr_bytes-5);
-      else if (Kr_bytes <=128)
-        iind = 59 + ((Kr_bytes-64)>>1);
-      else if (Kr_bytes <= 256)
-        iind = 91 + ((Kr_bytes-128)>>2);
-      else if (Kr_bytes <= 768)
-        iind = 123 + ((Kr_bytes-256)>>3);
-      else {
-        printf("dlsch_coding: Illegal codeword size %d!!!\n",Kr_bytes);
-        return(-1);
-      }
-
-
-#ifdef DEBUG_DLSCH_CODING
-      printf("Generating Code Segment %d (%d bits)\n",r,Kr);
-      // generate codewords
-
-      printf("bits_per_codeword (Kr)= %d, A %d\n",Kr,A);
-      printf("N_RB = %d\n",nb_rb);
-      printf("Ncp %d\n",frame_parms->Ncp);
-      printf("mod_order %d\n",mod_order);
-#endif
-
-
-#ifdef DEBUG_DLSCH_CODING
-      printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
-#endif
-      start_meas(te_stats);
-      encoder(dlsch->harq_processes[harq_pid]->c[r],
-              Kr>>3,
-              &dlsch->harq_processes[harq_pid]->d[r][96],
-              (r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
-              f1f2mat_old[iind*2],   // f1 (see 36121-820, page 14)
-              f1f2mat_old[(iind*2)+1]  // f2 (see 36121-820, page 14)
-             );
-      stop_meas(te_stats);
-#ifdef DEBUG_DLSCH_CODING
-
-      if (r==0)
-        write_output("enc_output0.m","enc0",&dlsch->harq_processes[harq_pid]->d[r][96],(3*8*Kr_bytes)+12,1,4);
-
-#endif
-      start_meas(i_stats);
-      dlsch->harq_processes[harq_pid]->RTC[r] =
-        sub_block_interleaving_turbo(4+(Kr_bytes*8),
-                                     &dlsch->harq_processes[harq_pid]->d[r][96],
-                                     dlsch->harq_processes[harq_pid]->w[r]);
-      stop_meas(i_stats);
-    }
-
-  }
-
-  // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
-  // outputs for each code segment, see Section 5.1.5 p.20
-
-  for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
-#ifdef DEBUG_DLSCH_CODING
-    printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n",
-        r,
-        G,
-        Kr*3,
-        mod_order,nb_rb);
-#endif
-
-    start_meas(rm_stats);
-#ifdef DEBUG_DLSCH_CODING
-    printf("rvidx in SIC encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
-#endif
-    r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r],
-                                        G,  //G
-                                        dlsch->harq_processes[harq_pid]->w[r],
-                                        dlsch->harq_processes[harq_pid]->e+r_offset,
-                                        dlsch->harq_processes[harq_pid]->C, // C
-                                        dlsch->Nsoft,                    // Nsoft,
-                                        dlsch->Mdlharq,
-                                        dlsch->Kmimo,
-                                        dlsch->harq_processes[harq_pid]->rvidx,
-                                        dlsch->harq_processes[harq_pid]->Qm,
-                                        dlsch->harq_processes[harq_pid]->Nl,
-                                        r,
-                                        nb_rb);
-    //                                        m);                       // r
-    stop_meas(rm_stats);
-#ifdef DEBUG_DLSCH_CODING
-
-    if (r==dlsch->harq_processes[harq_pid]->C-1)
-      write_output("enc_output.m","enc",dlsch->harq_processes[harq_pid]->e,r_offset,1,4);
-
-#endif
-  }
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
-
-  return(0);
-}
 
 
 
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
index f3a9a05ae5..417ee7f361 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
@@ -29,13 +29,12 @@
  * \note
  * \warning
  */
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "PHY/CODING/defs.h"
-#include "PHY/CODING/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "PHY/CODING/coding_defs.h"
+#include "PHY/CODING/coding_extern.h"
 #include "PHY/CODING/lte_interleaver_inline.h"
-#include "PHY/LTE_TRANSPORT/defs.h"
-#include "defs.h"
+#include "PHY/LTE_TRANSPORT/transport_eNB.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
 //#define DEBUG_DLSCH_MODULATION 1
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
index 8d650bbe21..8f0de76b2a 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
@@ -32,12 +32,12 @@
 
 //#define DEBUG_SCRAMBLING 1
 
-#include "PHY/defs.h"
-#include "PHY/CODING/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
+#include "PHY/CODING/coding_extern.h"
 #include "PHY/CODING/lte_interleaver_inline.h"
-#include "defs.h"
-#include "extern.h"
-#include "PHY/extern.h"
+#include "transport_eNB.h"
+#include "PHY/phy_extern.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
 static inline unsigned int lte_gold_scram(unsigned int *x1, unsigned int *x2, unsigned char reset) __attribute__((always_inline));
@@ -187,6 +187,20 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
 
 }
 
+
+
+void init_scrambling_lut() {
+
+  uint32_t s;
+  int i=0,j;
+
+  for (s=0;s<=65535;s++) {
+    for (j=0;j<16;j++) {
+      scrambling_lut[i++] = (uint8_t)((s>>j)&1);
+    }
+  }
+}
+
 void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
                         int mbsfn_flag,
                         LTE_UE_DLSCH_t *dlsch,
@@ -239,15 +253,3 @@ void init_unscrambling_lut() {
     }
   }
 }
-
-void init_scrambling_lut() {
-
-  uint32_t s;
-  int i=0,j;
-
-  for (s=0;s<=65535;s++) {
-    for (j=0;j<16;j++) {
-      scrambling_lut[i++] = (uint8_t)((s>>j)&1);
-    }
-  }
-}
diff --git a/openair1/PHY/LTE_TRANSPORT/edci.c b/openair1/PHY/LTE_TRANSPORT/edci.c
index 5caf5bcd71..9b46ffdc56 100755
--- a/openair1/PHY/LTE_TRANSPORT/edci.c
+++ b/openair1/PHY/LTE_TRANSPORT/edci.c
@@ -32,12 +32,13 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "SIMULATION/TOOLS/defs.h" // for taus 
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "SCHED/sched_eNB.h"
+#include "SIMULATION/TOOLS/sim.h" // for taus 
 #include "PHY/sse_intrin.h"
-
+#include "transport_proto.h"
+#include "transport_common_proto.h"
 #include "assertions.h" 
 #include "T.h"
 #include "UTIL/LOG/log.h"
diff --git a/openair1/PHY/LTE_TRANSPORT/group_hopping.c b/openair1/PHY/LTE_TRANSPORT/group_hopping.c
index a7c8921c2c..cae68f05b8 100644
--- a/openair1/PHY/LTE_TRANSPORT/group_hopping.c
+++ b/openair1/PHY/LTE_TRANSPORT/group_hopping.c
@@ -29,7 +29,7 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
+#include "PHY/defs_common.h"
 
 //#define DEBUG_GROUPHOP 1
 
diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c
index 88312e4a46..cfe4cf8558 100644
--- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c
@@ -30,10 +30,10 @@
 * \warning
 */
 
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
 #include "PHY/TOOLS/alaw_lut.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
+#include "PHY/phy_extern.h"
+#include "SCHED/sched_eNB.h"
 
 //#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
 #include "targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h"
diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h
index 0a95e60ead..4fcf537f83 100644
--- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h
+++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h
@@ -32,7 +32,7 @@
 
 #ifndef __IF4_TOOLS_H__
 #define __IF4_TOOLS_H__
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
 
 /// Macro for IF4 packet type
 #define IF4p5_PACKET_TYPE 0x080A 
diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c
index b160318a6e..06b4a4ad80 100644
--- a/openair1/PHY/LTE_TRANSPORT/if5_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c
@@ -30,7 +30,7 @@
 * \warning
 */
 
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
 #include "PHY/TOOLS/alaw_lut.h"
 
 #include "time_utils.h"
diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.h b/openair1/PHY/LTE_TRANSPORT/if5_tools.h
index 84ad530526..0f24f7bece 100644
--- a/openair1/PHY/LTE_TRANSPORT/if5_tools.h
+++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.h
@@ -34,7 +34,7 @@
 #define __IF5_TOOLS_H__
 
 #include <stdint.h>
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
 
 #define IF5_RRH_GW_DL 0x0022
 #define IF5_RRH_GW_UL 0x0023
diff --git a/openair1/PHY/LTE_TRANSPORT/lte_mcs.c b/openair1/PHY/LTE_TRANSPORT/lte_mcs.c
index 910610b969..a66344611b 100644
--- a/openair1/PHY/LTE_TRANSPORT/lte_mcs.c
+++ b/openair1/PHY/LTE_TRANSPORT/lte_mcs.c
@@ -30,9 +30,9 @@
 * \warning
 */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "PHY/LTE_TRANSPORT/proto.h"
+#include "PHY/defs_common.h"
+#include "PHY/phy_extern.h"
+#include "PHY/LTE_TRANSPORT/transport_common_proto.h"
 
 unsigned char get_Qm(unsigned char I_MCS)
 {
diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c
index d90d031917..e1bade676c 100644
--- a/openair1/PHY/LTE_TRANSPORT/pbch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pbch.c
@@ -29,12 +29,12 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "PHY/CODING/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/CODING/coding_extern.h"
 #include "PHY/CODING/lte_interleaver_inline.h"
-#include "defs.h"
-#include "extern.h"
-#include "PHY/extern.h"
+#include "transport_eNB.h"
+#include "transport_proto.h"
+#include "PHY/phy_extern.h"
 #include "PHY/sse_intrin.h"
 
 //#define DEBUG_PBCH 1
@@ -138,6 +138,31 @@ int allocate_pbch_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
   return(0);
 }
 
+void pbch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
+                     uint8_t *pbch_e,
+                     uint32_t length)
+{
+  int i;
+  uint8_t reset;
+  uint32_t x1, x2, s=0;
+
+  reset = 1;
+  // x1 is set in lte_gold_generic
+  x2 = frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.6.1
+  //  msg("pbch_scrambling: Nid_cell = %d\n",x2);
+
+  for (i=0; i<length; i++) {
+    if ((i&0x1f)==0) {
+      s = lte_gold_generic(&x1, &x2, reset);
+      //      printf("lte_gold[%d]=%x\n",i,s);
+      reset = 0;
+    }
+
+    pbch_e[i] = (pbch_e[i]&1) ^ ((s>>(i&0x1f))&1);
+
+  }
+}
+
 //uint8_t pbch_d[96+(3*(16+PBCH_A))], pbch_w[3*3*(16+PBCH_A)],pbch_e[1920];  //one bit per byte
 int generate_pbch(LTE_eNB_PBCH *eNB_pbch,
                   int32_t **txdataF,
diff --git a/openair1/PHY/LTE_TRANSPORT/pcfich.c b/openair1/PHY/LTE_TRANSPORT/pcfich.c
index 01a8fa7a81..cc4f652a2e 100644
--- a/openair1/PHY/LTE_TRANSPORT/pcfich.c
+++ b/openair1/PHY/LTE_TRANSPORT/pcfich.c
@@ -29,48 +29,12 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
+#include "PHY/impl_defs_top.h"
+#include "PHY/defs_eNB.h"
 
 //#define DEBUG_PCFICH
+extern uint8_t pcfich_b[4][32];
 
-void generate_pcfich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
-{
-
-  uint16_t kbar = 6 * (frame_parms->Nid_cell %(2*frame_parms->N_RB_DL));
-  uint16_t first_reg;
-  uint16_t *pcfich_reg = frame_parms->pcfich_reg;
-
-  pcfich_reg[0] = kbar/6;
-  first_reg = pcfich_reg[0];
-
-  frame_parms->pcfich_first_reg_idx=0;
-
-  pcfich_reg[1] = ((kbar + (frame_parms->N_RB_DL>>1)*6)%(frame_parms->N_RB_DL*12))/6;
-
-  if (pcfich_reg[1] < pcfich_reg[0]) {
-    frame_parms->pcfich_first_reg_idx = 1;
-    first_reg = pcfich_reg[1];
-  }
-
-  pcfich_reg[2] = ((kbar + (frame_parms->N_RB_DL)*6)%(frame_parms->N_RB_DL*12))/6;
-
-  if (pcfich_reg[2] < first_reg) {
-    frame_parms->pcfich_first_reg_idx = 2;
-    first_reg = pcfich_reg[2];
-  }
-
-  pcfich_reg[3] = ((kbar + ((3*frame_parms->N_RB_DL)>>1)*6)%(frame_parms->N_RB_DL*12))/6;
-
-  if (pcfich_reg[3] < first_reg) {
-    frame_parms->pcfich_first_reg_idx = 3;
-    first_reg = pcfich_reg[3];
-  }
-
-
-  //#ifdef DEBUG_PCFICH
-  printf("pcfich_reg : %d,%d,%d,%d\n",pcfich_reg[0],pcfich_reg[1],pcfich_reg[2],pcfich_reg[3]);
-  //#endif
-}
 
 void pcfich_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
                        uint8_t subframe,
@@ -96,11 +60,7 @@ void pcfich_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
   }
 }
 
-uint8_t pcfich_b[4][32]= {{0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1},
-  {1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0},
-  {1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1},
-  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
-};
+
 
 void generate_pcfich(uint8_t num_pdcch_symbols,
                      int16_t amp,
diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c
index 2115829a13..f16e2b2f94 100644
--- a/openair1/PHY/LTE_TRANSPORT/phich.c
+++ b/openair1/PHY/LTE_TRANSPORT/phich.c
@@ -1,3 +1,4 @@
+
 /*
  * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -20,7 +21,7 @@
  */
 
 /*! \file PHY/LTE_TRANSPORT/phich.c
-* \brief Top-level routines for generating and decoding  the PHICH/HI physical/transport channel V8.6 2009-03
+* \brief Top-level routines for generating the PHICH/HI physical/transport channel V8.6 2009-03
 * \author R. Knopp
 * \date 2011
 * \version 0.1
@@ -31,13 +32,7 @@
 */
 
 #include "PHY/defs_eNB.h"
-#include "PHY/extern.h"
-#include "SCHED/sched_eNB.h"
-#include "transport_eNB.h"
-
-#include "LAYER2/MAC/mac_extern.h"
-#include "LAYER2/MAC/mac.h"
-
+#include "PHY/impl_defs_top.h"
 #include "T.h"
 
 //#define DEBUG_PHICH 1
@@ -48,365 +43,6 @@
 //unsigned short phich_reg[MAX_NUM_PHICH_GROUPS][3];
 
 
-uint8_t rv_table[4] = {0, 2, 3, 1};
-
-uint8_t get_mi(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
-{
-
-  // for FDD
-  if (frame_parms->frame_type == FDD)
-    return 1;
-
-  // for TDD
-  switch (frame_parms->tdd_config) {
-
-  case 0:
-    if ((subframe==0) || (subframe==5))
-      return(2);
-    else return(1);
-
-    break;
-
-  case 1:
-    if ((subframe==0) || (subframe==5))
-      return(0);
-    else return(1);
-
-    break;
-
-  case 2:
-    if ((subframe==3) || (subframe==8))
-      return(1);
-    else return(0);
-
-    break;
-
-  case 3:
-    if ((subframe==0) || (subframe==8) || (subframe==9))
-      return(1);
-    else return(0);
-
-    break;
-
-  case 4:
-    if ((subframe==8) || (subframe==9))
-      return(1);
-    else return(0);
-
-    break;
-
-  case 5:
-    if (subframe==8)
-      return(1);
-    else return(0);
-
-    break;
-
-  case 6:
-    return(1);
-    break;
-
-  default:
-    return(0);
-  }
-}
-
-unsigned char subframe2_ul_harq(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe)
-{
-
-  if (frame_parms->frame_type == FDD)
-    return(subframe&7);
-
-  switch (frame_parms->tdd_config) {
-  case 3:
-    if ( (subframe == 8) || (subframe == 9) ) {
-      return(subframe-8);
-    } else if (subframe==0)
-      return(2);
-    else {
-      LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      return(0);
-    }
-
-    break;
-
-  case 4:
-     if ( (subframe == 8) || (subframe == 9) ) {
-       return(subframe-8);
-     } else {
-       LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n",
-             subframe,frame_parms->tdd_config);
-       return(0);
-     }
-
-     break;
-
-  }
-
-  return(0);
-}
-
-int phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms, int frame, int subframe)
-{
-  int pusch_frame;
-
-  if (frame_parms->frame_type == FDD) {
-    pusch_frame = subframe<4 ? frame + 1024 - 1 : frame;
-  } else {
-    // Note this is not true, but it doesn't matter, the frame number is irrelevant for TDD!
-    pusch_frame = (frame);
-  }
-
-  //LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n", frame, subframe, pusch_frame);
-  return pusch_frame % 1024;
-}
-
-uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
-{
-  uint8_t pusch_subframe = 255;
-
-  if (frame_parms->frame_type == FDD)
-    return subframe < 4 ? subframe + 6 : subframe - 4;
-
-  switch (frame_parms->tdd_config) {
-  case 0:
-    if (subframe == 0)
-      pusch_subframe = (3);
-    else if (subframe == 5) {
-      pusch_subframe = (8);
-    } else if (subframe == 6)
-      pusch_subframe = (2);
-    else if (subframe == 1)
-      pusch_subframe = (7);
-    else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-		  subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  case 1:
-    if (subframe == 6)
-      pusch_subframe = (2);
-    else if (subframe == 9)
-      pusch_subframe = (3);
-    else if (subframe == 1)
-      pusch_subframe = (7);
-    else if (subframe == 4)
-      pusch_subframe = (8);
-    else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  case 2:
-    if (subframe == 8)
-      pusch_subframe = (2);
-    else if (subframe == 3)
-      pusch_subframe = (7);
-    else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  case 3:
-    if ( (subframe == 8) || (subframe == 9) ) {
-      pusch_subframe = (subframe-6);
-    } else if (subframe==0)
-      pusch_subframe = (4);
-    else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  case 4:
-    if ( (subframe == 8) || (subframe == 9) ) {
-      pusch_subframe = (subframe-6);
-    } else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  case 5:
-    if (subframe == 8) {
-      pusch_subframe = (2);
-    } else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  case 6:
-    if (subframe == 6) {
-      pusch_subframe = (2);
-    } else if (subframe == 9) {
-      pusch_subframe = (3);
-    } else if (subframe == 0) {
-      pusch_subframe = (4);
-    } else if (subframe == 1) {
-      pusch_subframe = (7);
-    } else if (subframe == 5) {
-      pusch_subframe = (8);
-    } else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  default:
-    AssertFatal(1==0, "no implementation for TDD UL/DL-config = %d!\n", frame_parms->tdd_config);
-    pusch_subframe = (0);
-  }
-
-  LOG_D(PHY, "subframe  %d: PUSCH subframe = %d\n", subframe, pusch_subframe);
-  return pusch_subframe;
-}
-
-int check_pcfich(LTE_DL_FRAME_PARMS *frame_parms,uint16_t reg)
-{
-
-  if ((reg == frame_parms->pcfich_reg[0]) ||
-      (reg == frame_parms->pcfich_reg[1]) ||
-      (reg == frame_parms->pcfich_reg[2]) ||
-      (reg == frame_parms->pcfich_reg[3]))
-    return(1);
-
-  return(0);
-}
-
-void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
-{
-
-  unsigned short n0 = (frame_parms->N_RB_DL * 2) - 4;  // 2 REG per RB less the 4 used by PCFICH in first symbol
-  unsigned short n1 = (frame_parms->N_RB_DL * 3);      // 3 REG per RB in second and third symbol
-  unsigned short n2 = n1;
-  unsigned short mprime = 0;
-  unsigned short Ngroup_PHICH;
-  //  uint16_t *phich_reg = frame_parms->phich_reg;
-  uint16_t *pcfich_reg = frame_parms->pcfich_reg;
-
-  // compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211
-  Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
-
-
-  if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
-    Ngroup_PHICH++;
-
-  // check if Extended prefix
-  if (frame_parms->Ncp == 1) {
-    Ngroup_PHICH<<=1;
-  }
-
-#ifdef DEBUG_PHICH
-  LOG_D(PHY,"Ngroup_PHICH %d (phich_config_common.phich_resource %d,phich_config_common.phich_duration %s, NidCell %d,Ncp %d, frame_type %d), smallest pcfich REG %d, n0 %d, n1 %d (first PHICH REG %d)\n",
-    ((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1)),
-    frame_parms->phich_config_common.phich_resource,
-    frame_parms->phich_config_common.phich_duration==normal?"normal":"extended",
-    frame_parms->Nid_cell,frame_parms->Ncp,frame_parms->frame_type,
-    pcfich_reg[frame_parms->pcfich_first_reg_idx],
-    n0,
-    n1,
-    ((frame_parms->Nid_cell))%n0);
-#endif
-
-  // This is the algorithm from Section 6.9.3 in 36-211, it works only for normal PHICH duration for now ...
-
-  for (mprime=0; 
-       mprime<((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1)); 
-       mprime++) {
-
-    if (frame_parms->phich_config_common.phich_duration==normal) { // normal PHICH duration
-
-      frame_parms->phich_reg[mprime][0] = (frame_parms->Nid_cell + mprime)%n0;
-
-      if (frame_parms->phich_reg[mprime][0]>=pcfich_reg[frame_parms->pcfich_first_reg_idx])
-        frame_parms->phich_reg[mprime][0]++;
-
-      if (frame_parms->phich_reg[mprime][0]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+1)&3])
-        frame_parms->phich_reg[mprime][0]++;
-
-      if (frame_parms->phich_reg[mprime][0]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+2)&3])
-        frame_parms->phich_reg[mprime][0]++;
-
-      if (frame_parms->phich_reg[mprime][0]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3])
-        frame_parms->phich_reg[mprime][0]++;
-
-      frame_parms->phich_reg[mprime][1] = (frame_parms->Nid_cell + mprime + (n0/3))%n0;
-
-      
-      if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[frame_parms->pcfich_first_reg_idx])
-        frame_parms->phich_reg[mprime][1]++;
-      
-      if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+1)&3])
-        frame_parms->phich_reg[mprime][1]++;
-
-      if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+2)&3])
-        frame_parms->phich_reg[mprime][1]++;
-
-      if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3])
-        frame_parms->phich_reg[mprime][1]++;
-      
-
-      frame_parms->phich_reg[mprime][2] = (frame_parms->Nid_cell + mprime + (2*n0/3))%n0;
-      
-      if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[frame_parms->pcfich_first_reg_idx])
-        frame_parms->phich_reg[mprime][2]++;
-
-      if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+1)&3])
-        frame_parms->phich_reg[mprime][2]++;
-
-      if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+2)&3])
-        frame_parms->phich_reg[mprime][2]++;
-
-      if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3])
-        frame_parms->phich_reg[mprime][2]++;
-      
-#ifdef DEBUG_PHICH
-      printf("phich_reg :%d => %d,%d,%d\n",mprime,frame_parms->phich_reg[mprime][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]);
-#endif
-    } else { // extended PHICH duration
-      frame_parms->phich_reg[mprime<<1][0] = (frame_parms->Nid_cell + mprime)%n0;
-      frame_parms->phich_reg[1+(mprime<<1)][0] = (frame_parms->Nid_cell + mprime)%n0;
-
-      frame_parms->phich_reg[mprime<<1][1] = ((frame_parms->Nid_cell*n1/n0) + mprime + (n1/3))%n1;
-      frame_parms->phich_reg[mprime<<1][2] = ((frame_parms->Nid_cell*n2/n0) + mprime + (2*n2/3))%n2;
-
-      frame_parms->phich_reg[1+(mprime<<1)][1] = ((frame_parms->Nid_cell*n1/n0) + mprime + (n1/3))%n1;
-      frame_parms->phich_reg[1+(mprime<<1)][2] = ((frame_parms->Nid_cell*n2/n0) + mprime + (2*n2/3))%n2;
-      //#ifdef DEBUG_PHICH
-      printf("phich_reg :%d => %d,%d,%d\n",mprime<<1,frame_parms->phich_reg[mprime<<1][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]);
-      printf("phich_reg :%d => %d,%d,%d\n",1+(mprime<<1),frame_parms->phich_reg[1+(mprime<<1)][0],frame_parms->phich_reg[1+(mprime<<1)][1],frame_parms->phich_reg[1+(mprime<<1)][2]);
-      //#endif
-    }
-  } // mprime loop
-}  // num_pdcch_symbols loop
-
-
-void generate_phich_emul(LTE_DL_FRAME_PARMS *frame_parms,
-                         uint8_t HI,
-                         uint8_t subframe)
-{
-
-
-}
 
 int32_t alam_bpsk_perm1[4] = {2,1,4,3}; // -conj(x) 1 (-1-j) -> 2 (1-j), 2->1, 3 (-1+j) -> (4) 1+j, 4->3
 int32_t alam_bpsk_perm2[4] = {3,4,2,1}; // conj(x) 1 (-1-j) -> 3 (-1+j), 3->1, 2 (1-j) -> 4 (1+j), 4->2
@@ -1065,436 +701,6 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms,
   } // normal/extended prefix
 }
 
-// This routine demodulates the PHICH and updates PUSCH/ULSCH parameters
-
-void rx_phich(PHY_VARS_UE *ue,
-	      UE_rxtx_proc_t *proc,
-              uint8_t subframe,
-              uint8_t eNB_id)
-{
-
-
-  LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
-  LTE_UE_PDCCH **pdcch_vars = &ue->pdcch_vars[ue->current_thread_id[subframe]][eNB_id];
-
-  //  uint8_t HI;
-  uint8_t harq_pid = phich_subframe_to_harq_pid(frame_parms,proc->frame_rx,subframe);
-  LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
-  int16_t phich_d[24],*phich_d_ptr,HI16;
-  //  unsigned int i,aa;
-  int8_t d[24],*dp;
-  uint16_t reg_offset;
-
-  // scrambling
-  uint32_t x1, x2, s=0;
-  uint8_t reset = 1;
-  int16_t cs[12];
-  uint32_t i,i2,i3,phich_quad;
-  int32_t **rxdataF_comp = pdcch_vars[eNB_id]->rxdataF_comp;
-  uint8_t Ngroup_PHICH,ngroup_PHICH,nseq_PHICH;
-  uint8_t NSF_PHICH = 4;
-  uint8_t pusch_subframe;
-
-  int8_t delta_PUSCH_acc[4] = {-1,0,1,3};
-
-  // check if we're expecting a PHICH in this subframe
-  LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d PHICH RX\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe);
-
-  if (!ulsch)
-    return;
-
-  LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d PHICH RX Status: %d \n",ue->Mod_id,harq_pid,proc->frame_rx,subframe, ulsch->harq_processes[harq_pid]->status);
-
-  if (ulsch->harq_processes[harq_pid]->status == ACTIVE) {
-     LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe);
-    Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
-
-    if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
-      Ngroup_PHICH++;
-
-    if (frame_parms->Ncp == 1)
-      NSF_PHICH = 2;
-
-
-    ngroup_PHICH = (ulsch->harq_processes[harq_pid]->first_rb +
-                    ulsch->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH;
-
-    if ((frame_parms->tdd_config == 0) && (frame_parms->frame_type == TDD) ) {
-      pusch_subframe = phich_subframe2_pusch_subframe(frame_parms,subframe);
-
-      if ((pusch_subframe == 4) || (pusch_subframe == 9))
-        ngroup_PHICH += Ngroup_PHICH;
-    }
-
-    nseq_PHICH = ((ulsch->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) +
-                  ulsch->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH);
-  } else {
-    LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d PHICH RX %s\n",
-        ue->Mod_id,
-        harq_pid,
-        proc->frame_rx,
-        subframe,
-        (ulsch->harq_processes[harq_pid]->status==SCH_IDLE?   "SCH_IDLE"  :
-        (ulsch->harq_processes[harq_pid]->status==ACTIVE?     "ACTIVE"    :
-        (ulsch->harq_processes[harq_pid]->status==CBA_ACTIVE? "CBA_ACTIVE":
-        (ulsch->harq_processes[harq_pid]->status==DISABLED?   "DISABLED"  : "UNKNOWN")))));
-
-    return;
-  }
-
-  memset(d,0,24*sizeof(int8_t));
-  phich_d_ptr = phich_d;
-
-  // x1 is set in lte_gold_generic
-  x2 = (((subframe+1)*((frame_parms->Nid_cell<<1)+1))<<9) + frame_parms->Nid_cell;
-
-  s = lte_gold_generic(&x1, &x2, reset);
-
-  // compute scrambling sequence
-  for (i=0; i<12; i++) {
-    cs[i] = 1-(((s>>(i&0x1f))&1)<<1);
-  }
-
-  if (frame_parms->Ncp == 0) { // Normal Cyclic Prefix
-
-
-    // 12 output symbols (Msymb)
-
-    for (i=0,i2=0,i3=0; i<3; i++,i2+=4,i3+=8) {
-      switch (nseq_PHICH) {
-      case 0: // +1 +1 +1 +1
-        d[i3]   = cs[i2];
-        d[1+i3] = cs[i2];
-        d[2+i3] = cs[1+i2];
-        d[3+i3] = cs[1+i2];
-        d[4+i3] = cs[2+i2];
-        d[5+i3] = cs[2+i2];
-        d[6+i3] = cs[3+i2];
-        d[7+i3] = cs[3+i2];
-        break;
-
-      case 1: // +1 -1 +1 -1
-        d[i3] = cs[i2];
-        d[1+i3] = cs[i2];
-        d[2+i3] = -cs[1+i2];
-        d[3+i3] = -cs[1+i2];
-        d[4+i3] = cs[2+i2];
-        d[5+i3] = cs[2+i2];
-        d[6+i3] = -cs[3+i2];
-        d[7+i3] = -cs[3+i2];
-        break;
-
-      case 2: // +1 +1 -1 -1
-        d[i3]   = cs[i2];
-        d[1+i3]   = cs[i2];
-        d[2+i3] = cs[1+i2];
-        d[3+i3] = cs[1+i2];
-        d[4+i3] = -cs[2+i2];
-        d[5+i3] = -cs[2+i2];
-        d[6+i3] = -cs[3+i2];
-        d[7+i3] = -cs[3+i2];
-        break;
-
-      case 3: // +1 -1 -1 +1
-        d[i3]   = cs[i2];
-        d[1+i3]   = cs[i2];
-        d[2+i3] = -cs[1+i2];
-        d[3+i3] = -cs[1+i2];
-        d[4+i3] = -cs[2+i2];
-        d[5+i3] = -cs[2+i2];
-        d[6+i3] = cs[3+i2];
-        d[7+i3] = cs[3+i2];
-        break;
-
-      case 4: // +j +j +j +j
-        d[i3]   = -cs[i2];
-        d[1+i3] = cs[i2];
-        d[2+i3] = -cs[1+i2];
-        d[3+i3] = cs[1+i2];
-        d[4+i3] = -cs[2+i2];
-        d[5+i3] = cs[2+i2];
-        d[6+i3] = -cs[3+i2];
-        d[7+i3] = cs[3+i2];
-        break;
-
-      case 5: // +j -j +j -j
-        d[1+i3] = cs[i2];
-        d[3+i3] = -cs[1+i2];
-        d[5+i3] = cs[2+i2];
-        d[7+i3] = -cs[3+i2];
-        d[i3]   = -cs[i2];
-        d[2+i3] = cs[1+i2];
-        d[4+i3] = -cs[2+i2];
-        d[6+i3] = cs[3+i2];
-        break;
-
-      case 6: // +j +j -j -j
-        d[1+i3] = cs[i2];
-        d[3+i3] = cs[1+i2];
-        d[5+i3] = -cs[2+i2];
-        d[7+i3] = -cs[3+i2];
-        d[i3]   = -cs[i2];
-        d[2+i3] = -cs[1+i2];
-        d[4+i3] = cs[2+i2];
-        d[6+i3] = cs[3+i2];
-        break;
-
-      case 7: // +j -j -j +j
-        d[1+i3] = cs[i2];
-        d[3+i3] = -cs[1+i2];
-        d[5+i3] = -cs[2+i2];
-        d[7+i3] = cs[3+i2];
-        d[i3]   = -cs[i2];
-        d[2+i3] = cs[1+i2];
-        d[4+i3] = cs[2+i2];
-        d[6+i3] = -cs[3+i2];
-        break;
-
-      default:
-        AssertFatal(1==0,"phich_coding.c: Illegal PHICH Number\n");
-      } // nseq_PHICH
-    }
-
-#ifdef DEBUG_PHICH
-    LOG_D(PHY,"PHICH =>");
-
-    for (i=0; i<24; i++) {
-      LOG_D(PHY,"%2d,",d[i]);
-    }
-
-    LOG_D(PHY,"\n");
-#endif
-    // demodulation here
-
-
-  } else { // extended prefix
-
-    // 6 output symbols
-    if ((ngroup_PHICH & 1) == 1)
-      dp = &d[4];
-    else
-      dp = d;
-
-    switch (nseq_PHICH) {
-    case 0: // +1 +1
-      dp[0]  = cs[0];
-      dp[2]  = cs[1];
-      dp[8]  = cs[2];
-      dp[10] = cs[3];
-      dp[16] = cs[4];
-      dp[18] = cs[5];
-      dp[1]  = cs[0];
-      dp[3]  = cs[1];
-      dp[9]  = cs[2];
-      dp[11] = cs[3];
-      dp[17] = cs[4];
-      dp[19] = cs[5];
-      break;
-
-    case 1: // +1 -1
-      dp[0]  = cs[0];
-      dp[2]  = -cs[1];
-      dp[8]  = cs[2];
-      dp[10] = -cs[3];
-      dp[16] = cs[4];
-      dp[18] = -cs[5];
-      dp[1]  = cs[0];
-      dp[3]  = -cs[1];
-      dp[9]  = cs[2];
-      dp[11] = -cs[3];
-      dp[17] = cs[4];
-      dp[19] = -cs[5];
-      break;
-
-    case 2: // +j +j
-      dp[1]  = cs[0];
-      dp[3]  = cs[1];
-      dp[9]  = cs[2];
-      dp[11] = cs[3];
-      dp[17] = cs[4];
-      dp[19] = cs[5];
-      dp[0]  = -cs[0];
-      dp[2]  = -cs[1];
-      dp[8]  = -cs[2];
-      dp[10] = -cs[3];
-      dp[16] = -cs[4];
-      dp[18] = -cs[5];
-
-      break;
-
-    case 3: // +j -j
-      dp[1]  = cs[0];
-      dp[3]  = -cs[1];
-      dp[9]  = cs[2];
-      dp[11] = -cs[3];
-      dp[17] = cs[4];
-      dp[19] = -cs[5];
-      dp[0]  = -cs[0];
-      dp[2]  = cs[1];
-      dp[8]  = -cs[2];
-      dp[10] = cs[3];
-      dp[16] = -cs[4];
-      dp[18] = cs[5];
-      break;
-
-    default:
-      AssertFatal(1==0,"phich_coding.c: Illegal PHICH Number\n");
-    }
-  }
-
-  HI16 = 0;
-
-  //#ifdef DEBUG_PHICH
-
-  //#endif
-  /*
-  for (i=0;i<200;i++)
-    printf("re %d: %d %d\n",i,((int16_t*)&rxdataF_comp[0][i])[0],((int16_t*)&rxdataF_comp[0][i])[1]);
-  */
-  for (phich_quad=0; phich_quad<3; phich_quad++) {
-    if (frame_parms->Ncp == 1)
-      reg_offset = (frame_parms->phich_reg[ngroup_PHICH][phich_quad]*4)+ (phich_quad*frame_parms->N_RB_DL*12);
-    else
-      reg_offset = (frame_parms->phich_reg[ngroup_PHICH][phich_quad]*4);
-
-    //    msg("\n[PUSCH 0]PHICH (RX) quad %d (%d)=>",phich_quad,reg_offset);
-    dp = &d[phich_quad*8];;
-
-    for (i=0; i<8; i++) {
-      phich_d_ptr[i] = ((int16_t*)&rxdataF_comp[0][reg_offset])[i];
-
-#ifdef DEBUG_PHICH
-      LOG_D(PHY,"%d,",((int16_t*)&rxdataF_comp[0][reg_offset])[i]);
-#endif
-
-      HI16 += (phich_d_ptr[i] * dp[i]);
-    }
-  }
-
-#ifdef DEBUG_PHICH
-  LOG_D(PHY,"\n");
-  LOG_D(PHY,"HI16 %d\n",HI16);
-#endif
-
-  if (HI16>0) {   //NACK
-    if (ue->ulsch_Msg3_active[eNB_id] == 1) {
-      LOG_D(PHY,"[UE  %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received NAK (%d) nseq %d, ngroup %d\n",
-            ue->Mod_id,harq_pid,
-            proc->frame_rx,
-            subframe,
-            HI16,
-            nseq_PHICH,
-            ngroup_PHICH);
-
-      ulsch->f_pusch += delta_PUSCH_acc[ulsch->harq_processes[harq_pid]->TPC];
-
-      LOG_D(PHY,"[PUSCH %d] AbsSubframe %d.%d: f_pusch (ACC) %d, adjusting by %d (TPC %d)\n",
-                 harq_pid,proc->frame_rx,subframe,ulsch->f_pusch,
-                    delta_PUSCH_acc[ulsch->harq_processes[harq_pid]->TPC],
-                    ulsch->harq_processes[harq_pid]->TPC);
-
-
-      ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
-      //      ulsch->harq_processes[harq_pid]->Ndi = 0;
-      ulsch->harq_processes[harq_pid]->round++;
-      ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3];
-
-      if (ulsch->harq_processes[harq_pid]->round>=ue->frame_parms.maxHARQ_Msg3Tx) {
-        ulsch->harq_processes[harq_pid]->subframe_scheduling_flag =0;
-        ulsch->harq_processes[harq_pid]->status = SCH_IDLE;
-        // inform MAC that Msg3 transmission has failed
-        ue->ulsch_Msg3_active[eNB_id] = 0;
-      }
-    } else {
-#ifdef UE_DEBUG_TRACE
-      LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d PHICH, received NAK (%d) nseq %d, ngroup %d round %d (Mlimit %d)\n",
-            ue->Mod_id,harq_pid,
-            proc->frame_rx%1024,
-            subframe,
-            HI16,
-            nseq_PHICH,
-            ngroup_PHICH,
-            ulsch->harq_processes[harq_pid]->round,
-            ulsch->Mlimit);
-#endif
-
-      //      ulsch->harq_processes[harq_pid]->Ndi = 0;
-      ulsch->harq_processes[harq_pid]->round++;
-      
-      if ( ulsch->harq_processes[harq_pid]->round >= (ulsch->Mlimit - 1) )
-      {
-          // this is last push re transmission
-          ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3];
-          ulsch->O_RI = 0;
-          ulsch->O    = 0;
-          ulsch->uci_format = HLC_subband_cqi_nopmi;
-
-          // disable phich decoding since it is the last retransmission
-          ulsch->harq_processes[harq_pid]->status = SCH_IDLE;
-
-          //ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
-          //ulsch->harq_processes[harq_pid]->round  = 0;
-
-          //LOG_I(PHY,"PUSCH MAX Retransmission acheived ==> flush harq buff (%d) \n",harq_pid);
-          //LOG_I(PHY,"[HARQ-UL harqId: %d] PHICH NACK MAX RETRANS(%d) ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->Mlimit, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag, ulsch->harq_processes[harq_pid]->round);
-      }
-      else
-      {
-          // ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
-          ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3];
-          ulsch->O_RI = 0;
-          ulsch->O    = 0;
-          ulsch->uci_format = HLC_subband_cqi_nopmi;
-          //LOG_I(PHY,"[HARQ-UL harqId: %d] PHICH NACK ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag,ulsch->harq_processes[harq_pid]->round);
-      }
-    }
-#if T_TRACER
-    T(T_UE_PHY_ULSCH_UE_NACK, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(subframe), T_INT(ulsch->rnti),
-      T_INT(harq_pid));
-#endif
-
-  } else {  //ACK
-    if (ue->ulsch_Msg3_active[eNB_id] == 1) {
-      LOG_D(PHY,"[UE  %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received ACK (%d) nseq %d, ngroup %d\n\n",
-            ue->Mod_id,harq_pid,
-            proc->frame_rx,
-            subframe,
-            HI16,
-            nseq_PHICH,ngroup_PHICH);
-    } else {
-#ifdef UE_DEBUG_TRACE
-      LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d PHICH, received ACK (%d) nseq %d, ngroup %d\n\n",
-            ue->Mod_id,harq_pid,
-            proc->frame_rx%1024,
-            subframe, HI16,
-            nseq_PHICH,ngroup_PHICH);
-#endif
-    }
-
-   // LOG_I(PHY,"[HARQ-UL harqId: %d] subframe_scheduling_flag = %d \n",harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag);
-
-    // Incase of adaptive retransmission, PHICH is always decoded as ACK (at least with OAI-eNB)
-    // Workaround:
-    // rely only on DCI0 decoding and check if NDI has toggled
-    //   save current harq_processes content in temporary struct
-    //   harqId-8 corresponds to the temporary struct. In total we have 8 harq process(0 ..7) + 1 temporary harq process()
-    //ulsch->harq_processes[8] = ulsch->harq_processes[harq_pid];
-
-
-    ulsch->harq_processes[harq_pid]->status                   = SCH_IDLE;
-    ulsch->harq_processes[harq_pid]->round                    = 0;
-    ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
-    // inform MAC?
-    ue->ulsch_Msg3_active[eNB_id] = 0;
-
-#if T_TRACER
-    T(T_UE_PHY_ULSCH_UE_ACK, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(subframe), T_INT(ulsch->rnti),
-      T_INT(harq_pid));
-#endif
-
-  }
-
-}
 
 void generate_phich_top(PHY_VARS_eNB *eNB,
                         eNB_rxtx_proc_t *proc,
diff --git a/openair1/PHY/LTE_TRANSPORT/pilots.c b/openair1/PHY/LTE_TRANSPORT/pilots.c
index 01b4bb7a8e..72d8d0cbfc 100644
--- a/openair1/PHY/LTE_TRANSPORT/pilots.c
+++ b/openair1/PHY/LTE_TRANSPORT/pilots.c
@@ -29,8 +29,7 @@
 * \note
 * \warning
 */
-//#include "defs.h"
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
 
 void generate_pilots(PHY_VARS_eNB *eNB,
                      int32_t **txdataF,
diff --git a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c
index 90e9ae329c..7b8cc068ce 100644
--- a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c
+++ b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c
@@ -29,8 +29,8 @@
 * \note
 * \warning
 */
-//#include "defs.h"
-#include "PHY/defs.h"
+
+#include "PHY/defs_eNB.h"
 
 
 int generate_mbsfn_pilot(PHY_VARS_eNB *eNB,
diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c
index e6b364c74d..23bc07f174 100644
--- a/openair1/PHY/LTE_TRANSPORT/pmch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pmch.c
@@ -19,10 +19,11 @@
  *      contact@openairinterface.org
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "PHY/sse_intrin.h"
-
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "transport_eNB.h"
+#include "transport_proto.h"
+#include "transport_common_proto.h"
 // Mask for identifying subframe for MBMS
 #define MBSFN_TDD_SF3 0x80// for TDD
 #define MBSFN_TDD_SF4 0x40
@@ -30,7 +31,7 @@
 #define MBSFN_TDD_SF8 0x10
 #define MBSFN_TDD_SF9 0x08
 
-#include "PHY/defs.h"
+
 
 #define MBSFN_FDD_SF1 0x80// for FDD
 #define MBSFN_FDD_SF2 0x40
@@ -41,101 +42,6 @@
 
 
 
-int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parms)
-{
-
-  uint32_t period;
-  uint8_t i;
-
-  //  LOG_D(PHY,"is_pmch_subframe: frame %d, subframe %d, num_MBSFN_config %d\n",
-  //  frame,subframe,frame_parms->num_MBSFN_config);
-
-  for (i=0; i<frame_parms->num_MBSFN_config; i++) {  // we have at least one MBSFN configuration
-    period = 1<<frame_parms->MBSFN_config[i].radioframeAllocationPeriod;
-
-    if ((frame % period) == frame_parms->MBSFN_config[i].radioframeAllocationOffset) {
-      if (frame_parms->MBSFN_config[i].fourFrames_flag == 0) {
-        if (frame_parms->frame_type == FDD) {
-          switch (subframe) {
-
-          case 1:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_FDD_SF1) > 0)
-              return(1);
-
-            break;
-
-          case 2:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_FDD_SF2) > 0)
-              return(1);
-
-            break;
-
-          case 3:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_FDD_SF3) > 0)
-              return(1);
-
-            break;
-
-          case 6:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_FDD_SF6) > 0)
-              return(1);
-
-            break;
-
-          case 7:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_FDD_SF7) > 0)
-              return(1);
-
-            break;
-
-          case 8:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_FDD_SF8) > 0)
-              return(1);
-
-            break;
-          }
-        } else  {
-          switch (subframe) {
-          case 3:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_TDD_SF3) > 0)
-              return(1);
-
-            break;
-
-          case 4:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_TDD_SF4) > 0)
-              return(1);
-
-            break;
-
-          case 7:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_TDD_SF7) > 0)
-              return(1);
-
-            break;
-
-          case 8:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_TDD_SF8) > 0)
-              return(1);
-
-            break;
-
-          case 9:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_TDD_SF9) > 0)
-              return(1);
-
-            break;
-          }
-        }
-
-      } else { // handle 4 frames case
-
-      }
-    }
-  }
-
-  return(0);
-}
 
 void fill_eNB_dlsch_MCH(PHY_VARS_eNB *eNB,int mcs,int ndi,int rvidx)
 {
@@ -174,17 +80,6 @@ void fill_eNB_dlsch_MCH(PHY_VARS_eNB *eNB,int mcs,int ndi,int rvidx)
     break;
   }
 
-  if (eNB->abstraction_flag) {
-    eNB_transport_info[eNB->Mod_id][eNB->CC_id].cntl.pmch_flag=1;
-    eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_pmch=1; // assumption: there is always one pmch in each SF
-    eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_common_dci=0;
-    eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_ue_spec_dci=0;
-    eNB_transport_info[eNB->Mod_id][eNB->CC_id].dlsch_type[0]=5;// put at the reserved position for PMCH
-    eNB_transport_info[eNB->Mod_id][eNB->CC_id].harq_pid[0]=0;
-    eNB_transport_info[eNB->Mod_id][eNB->CC_id].ue_id[0]=255;//broadcast
-    eNB_transport_info[eNB->Mod_id][eNB->CC_id].tbs[0]=dlsch->harq_processes[0]->TBS>>3;
-  }
-
 }
 
 
@@ -195,53 +90,36 @@ void generate_mch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t *a)
   int subframe = proc->subframe_tx;
   int frame    = proc->frame_tx;
 
-  if (eNB->abstraction_flag != 0) {
-    if (eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]!=0)
-      printf("[PHY][EMU] PMCH transport block position is different than zero %d \n", eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]);
-
-    memcpy(eNB->dlsch_MCH->harq_processes[0]->b,
-           a,
-           eNB->dlsch_MCH->harq_processes[0]->TBS>>3);
-    LOG_D(PHY, "[eNB %d] dlsch_encoding_emul pmch , tbs is %d \n",
-          eNB->Mod_id,
-          eNB->dlsch_MCH->harq_processes[0]->TBS>>3);
-
-    memcpy(&eNB_transport_info[eNB->Mod_id][eNB->CC_id].transport_blocks[eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]],
-           a,
-           eNB->dlsch_MCH->harq_processes[0]->TBS>>3);
-    eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]+= eNB->dlsch_MCH->harq_processes[0]->TBS>>3;//=eNB_transport_info[eNB->Mod_id].tbs[0];
-  } else {
-    G = get_G(&eNB->frame_parms,
-              eNB->frame_parms.N_RB_DL,
-              eNB->dlsch_MCH->harq_processes[0]->rb_alloc,
-              get_Qm(eNB->dlsch_MCH->harq_processes[0]->mcs),1,
-              2,proc->frame_tx,subframe,0);
-
-    generate_mbsfn_pilot(eNB,proc,
-                         eNB->common_vars.txdataF,
-                         AMP);
-
-
-    AssertFatal(dlsch_encoding(eNB,
-		       a,
-                       1,
-                       eNB->dlsch_MCH,
-                       proc->frame_tx,
-                       subframe,
-                       &eNB->dlsch_rate_matching_stats,
-                       &eNB->dlsch_turbo_encoding_stats,
-                       &eNB->dlsch_interleaving_stats)==0,
-		"problem in dlsch_encoding");
-
-    dlsch_scrambling(&eNB->frame_parms,1,eNB->dlsch_MCH,0,G,0,frame,subframe<<1);
-
-
-    mch_modulation(eNB->common_vars.txdataF,
-                   AMP,
-                   subframe,
-                   &eNB->frame_parms,
-                   eNB->dlsch_MCH);
-  }
+  G = get_G(&eNB->frame_parms,
+	    eNB->frame_parms.N_RB_DL,
+	    eNB->dlsch_MCH->harq_processes[0]->rb_alloc,
+	    get_Qm(eNB->dlsch_MCH->harq_processes[0]->mcs),1,
+	    2,proc->frame_tx,subframe,0);
+  
+  generate_mbsfn_pilot(eNB,proc,
+		       eNB->common_vars.txdataF,
+		       AMP);
+  
+  
+  AssertFatal(dlsch_encoding(eNB,
+			     a,
+			     1,
+			     eNB->dlsch_MCH,
+			     proc->frame_tx,
+			     subframe,
+			     &eNB->dlsch_rate_matching_stats,
+			     &eNB->dlsch_turbo_encoding_stats,
+			     &eNB->dlsch_interleaving_stats)==0,
+	      "problem in dlsch_encoding");
+  
+  dlsch_scrambling(&eNB->frame_parms,1,eNB->dlsch_MCH,0,G,0,frame,subframe<<1);
+  
+  
+  mch_modulation(eNB->common_vars.txdataF,
+		 AMP,
+		 subframe,
+		 &eNB->frame_parms,
+		 eNB->dlsch_MCH);
 
 }
 
diff --git a/openair1/PHY/LTE_TRANSPORT/power_control.c b/openair1/PHY/LTE_TRANSPORT/power_control.c
index 36b2bfbeab..32273015ce 100644
--- a/openair1/PHY/LTE_TRANSPORT/power_control.c
+++ b/openair1/PHY/LTE_TRANSPORT/power_control.c
@@ -19,7 +19,8 @@
  *      contact@openairinterface.org
  */
 
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
 #include "PHY/impl_defs_lte.h"
 
 //#define DEBUG_PC 0
@@ -94,7 +95,6 @@ double computeRhoB_eNB(uint8_t pa,
   return(rho_b_dB);
 }
 
-
 double computeRhoA_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
                       LTE_UE_DLSCH_t *dlsch_ue,
                       unsigned char dl_power_off,
@@ -150,3 +150,4 @@ double computeRhoB_UE(PDSCH_CONFIG_DEDICATED  *pdsch_config_dedicated,
 #endif
   return(rho_b_dB);
 }
+
diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c
index 9c74738013..1eb66f8338 100644
--- a/openair1/PHY/LTE_TRANSPORT/prach.c
+++ b/openair1/PHY/LTE_TRANSPORT/prach.c
@@ -30,14 +30,13 @@
  * \warning
  */
 #include "PHY/sse_intrin.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
 //#include "prach.h"
 #include "PHY/LTE_TRANSPORT/if4_tools.h"
-#include "SCHED/defs.h"
-#include "SCHED/extern.h"
+#include "SCHED/sched_eNB.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
-#include "prach_common.c"
+#include "prach_extern.h"
 
 //#define PRACH_DEBUG 1
 //#define PRACH_WRITE_OUTPUT_DEBUG 1
diff --git a/openair1/PHY/LTE_TRANSPORT/prach_common.c b/openair1/PHY/LTE_TRANSPORT/prach_common.c
index 97de04a630..2f39346be2 100644
--- a/openair1/PHY/LTE_TRANSPORT/prach_common.c
+++ b/openair1/PHY/LTE_TRANSPORT/prach_common.c
@@ -30,16 +30,11 @@
  * \warning
  */
 #include "PHY/sse_intrin.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-//#include "prach.h"
-#include "PHY/LTE_TRANSPORT/if4_tools.h"
-#include "SCHED/defs.h"
-#include "SCHED/extern.h"
+#include "PHY/defs_common.h"
+#include "PHY/phy_extern.h"
+#include "PHY/phy_extern_ue.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
-//#define PRACH_DEBUG 1
-//#define PRACH_WRITE_OUTPUT_DEBUG 1
 
 uint16_t NCS_unrestricted[16] = {0,13,15,18,22,26,32,38,46,59,76,93,119,167,279,419};
 uint16_t NCS_restricted[15]   = {15,18,22,26,32,38,46,55,68,82,100,128,158,202,237}; // high-speed case
@@ -49,17 +44,6 @@ int16_t ru[2*839]; // quantized roots of unity
 uint32_t ZC_inv[839]; // multiplicative inverse for roots u
 uint16_t du[838];
 
-typedef struct {
-  uint8_t f_ra;
-  uint8_t t0_ra;
-  uint8_t t1_ra;
-  uint8_t t2_ra;
-} PRACH_TDD_PREAMBLE_MAP_elem;
-typedef struct {
-  uint8_t num_prach;
-  PRACH_TDD_PREAMBLE_MAP_elem map[6];
-} PRACH_TDD_PREAMBLE_MAP;
-
 // This is table 5.7.1-4 from 36.211
 PRACH_TDD_PREAMBLE_MAP tdd_preamble_map[64][7] = {
   // TDD Configuration Index 0
@@ -747,3 +731,41 @@ void compute_prach_seq(uint16_t rootSequenceIndex,
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_COMPUTE_PRACH, VCD_FUNCTION_OUT);
 
 }
+
+void init_prach_tables(int N_ZC)
+{
+
+  int i,m;
+
+  // Compute the modular multiplicative inverse 'iu' of u s.t. iu*u = 1 mod N_ZC
+  ZC_inv[0] = 0;
+  ZC_inv[1] = 1;
+
+  for (i=2; i<N_ZC; i++) {
+    for (m=2; m<N_ZC; m++)
+      if (((i*m)%N_ZC) == 1) {
+        ZC_inv[i] = m;
+        break;
+      }
+
+#ifdef PRACH_DEBUG
+
+    if (i<16)
+      printf("i %d : inv %d\n",i,ZC_inv[i]);
+
+#endif
+  }
+
+  // Compute quantized roots of unity
+  for (i=0; i<N_ZC; i++) {
+    ru[i<<1]     = (int16_t)(floor(32767.0*cos(2*M_PI*(double)i/N_ZC)));
+    ru[1+(i<<1)] = (int16_t)(floor(32767.0*sin(2*M_PI*(double)i/N_ZC)));
+#ifdef PRACH_DEBUG
+
+    if (i<16)
+      printf("i %d : runity %d,%d\n",i,ru[i<<1],ru[1+(i<<1)]);
+
+#endif
+  }
+}
+
diff --git a/openair1/PHY/LTE_TRANSPORT/pss.c b/openair1/PHY/LTE_TRANSPORT/pss.c
index c746a331db..c02d08750b 100644
--- a/openair1/PHY/LTE_TRANSPORT/pss.c
+++ b/openair1/PHY/LTE_TRANSPORT/pss.c
@@ -36,8 +36,8 @@
 */
 
 //#include "defs.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
 
 int generate_pss(int32_t **txdataF,
                  short amp,
@@ -105,10 +105,3 @@ int generate_pss(int32_t **txdataF,
   return(0);
 }
 
-int generate_pss_emul(PHY_VARS_eNB *phy_vars_eNb,uint8_t sect_id)
-{
-
-  LOG_D(PHY,"EMUL eNB generate_pss_emul eNB %d, sect_id %d\n",phy_vars_eNb->Mod_id,sect_id);
-  eNB_transport_info[phy_vars_eNb->Mod_id][phy_vars_eNb->CC_id].cntl.pss=sect_id;
-  return(0);
-}
diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c
index 6d6eff8c59..c46aba4d81 100644
--- a/openair1/PHY/LTE_TRANSPORT/pucch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pucch.c
@@ -29,9 +29,9 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "PHY/extern.h" 
-#include "LAYER2/MAC/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h" 
+#include "LAYER2/MAC/mac.h"
 
 #include "UTIL/LOG/log.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
@@ -42,7 +42,7 @@
 //#define DEBUG_PUCCH_TXS
 //#define DEBUG_PUCCH_RX
 
-#include "pucch_common.c"
+#include "pucch_extern.h"
 
 int16_t cfo_pucch_np[24*7] = {20787,-25330,27244,-18205,31356,-9512,32767,0,31356,9511,27244,18204,20787,25329,
                               27244,-18205,30272,-12540,32137,-6393,32767,0,32137,6392,30272,12539,27244,18204,
diff --git a/openair1/PHY/LTE_TRANSPORT/pucch_common.c b/openair1/PHY/LTE_TRANSPORT/pucch_common.c
index 3000af97e6..f5aeacd098 100644
--- a/openair1/PHY/LTE_TRANSPORT/pucch_common.c
+++ b/openair1/PHY/LTE_TRANSPORT/pucch_common.c
@@ -29,9 +29,9 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "PHY/extern.h" 
-#include "LAYER2/MAC/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h" 
+#include "LAYER2/MAC/mac.h"
 
 #include "UTIL/LOG/log.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
@@ -100,17 +100,7 @@ char *pucch_format_string[] = {
   "pucch_format3"
 };
 
-/* PUCCH format3 >> */
-#define D_I             0
-#define D_Q             1
-#define D_IQDATA        2
-#define D_NSLT1SF       2
-#define D_NSYM1SLT      7
-#define D_NSYM1SF       2*7
-#define D_NSC1RB        12
-#define D_NRB1PUCCH     2
-#define D_NPUCCH_SF5    5
-#define D_NPUCCH_SF4    4
+
 
 uint8_t chcod_tbl[128][48] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
   {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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
@@ -241,6 +231,9 @@ uint8_t chcod_tbl[128][48] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   {1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0},
   {0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1} };
 
+int16_t alpha_re[12] = {32767, 28377, 16383,     0,-16384,  -28378,-32768,-28378,-16384,    -1, 16383, 28377};
+int16_t alpha_im[12] = {0,     16383, 28377, 32767, 28377,   16383,     0,-16384,-28378,-32768,-28378,-16384};
+
 // W5_TBL
 int16_t W5_fmt3_re[5][5] = { {32767, 32767, 32767, 32767, 32767},
   {32767, 10125, -26509, -26509, 10125},
diff --git a/openair1/PHY/LTE_TRANSPORT/rar_tools.c b/openair1/PHY/LTE_TRANSPORT/rar_tools.c
index 9934b71d78..f8bb01fd9b 100644
--- a/openair1/PHY/LTE_TRANSPORT/rar_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/rar_tools.c
@@ -20,7 +20,7 @@
  */
 
 /*! \file PHY/LTE_TRANSPORT/rar_tools.c
-* \brief Routine for filling the PUSCH/ULSCH data structures based on a random-access response (RAR) SDU from MAC.  Note this is both for UE and eNB. V8.6 2009-03
+* \brief Routine for filling the PUSCH/ULSCH data structures based on a random-access response (RAR) SDU from MAC.  Note this is for eNB. 
 * \author R. Knopp
 * \date 2011
 * \version 0.1
@@ -29,12 +29,10 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "SCHED/extern.h"
-#include "LAYER2/MAC/defs.h"
-#include "SCHED/defs.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "SCHED/sched_eNB.h"
+#include "LAYER2/MAC/mac.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
 #include "assertions.h"
@@ -194,159 +192,3 @@ int generate_eNB_ulsch_params_from_rar(PHY_VARS_eNB *eNB,
   return(0);
 }
 
-int8_t delta_PUSCH_msg2[8] = {-6,-4,-2,0,2,4,6,8};
-
-int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue,
-				      UE_rxtx_proc_t *proc,
-                                      unsigned char eNB_id )
-{
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_RAR,VCD_FUNCTION_IN);
-
-  //  RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)rar_pdu;
-  uint8_t transmission_mode = ue->transmission_mode[eNB_id];
-  unsigned char *rar_pdu = ue->dlsch_ra[eNB_id]->harq_processes[0]->b;
-  unsigned char subframe = ue->ulsch_Msg3_subframe[eNB_id];
-  LTE_UE_ULSCH_t *ulsch  = ue->ulsch[eNB_id];
-  PHY_MEASUREMENTS *meas = &ue->measurements;
-
-  LTE_DL_FRAME_PARMS *frame_parms =  &ue->frame_parms;
-  //  int current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id];
-
-  uint8_t *rar = (uint8_t *)(rar_pdu+1);
-  uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe);
-  uint16_t rballoc;
-  uint8_t cqireq;
-  uint16_t *RIV2nb_rb_LUT, *RIV2first_rb_LUT;
-  uint16_t RIV_max = 0;
-
-  LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",proc->frame_tx,subframe,harq_pid);
-
-  switch (frame_parms->N_RB_DL) {
-  case 6:
-    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT6[0];
-    RIV2first_rb_LUT  = &RIV2first_rb_LUT6[0];
-    RIV_max           = RIV_max6;
-    break;
-
-  case 25:
-    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT25[0];
-    RIV2first_rb_LUT  = &RIV2first_rb_LUT25[0];
-    RIV_max           = RIV_max25;
-    break;
-
-  case 50:
-    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT50[0];
-    RIV2first_rb_LUT  = &RIV2first_rb_LUT50[0];
-    RIV_max           = RIV_max50;
-    break;
-
-  case 100:
-    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT100[0];
-    RIV2first_rb_LUT  = &RIV2first_rb_LUT100[0];
-    RIV_max           = RIV_max100;
-    break;
-
-  default:
-    DevParam(frame_parms->N_RB_DL, eNB_id, harq_pid);
-    break;
-  }
-
-
-
-  ulsch->harq_processes[harq_pid]->TPC                                   = (rar[3]>>2)&7;//rar->TPC;
-
-  rballoc = (((uint16_t)(rar[1]&7))<<7)|(rar[2]>>1);
-  cqireq=rar[3]&1;
-
-  if (rballoc>RIV_max) {
-    LOG_D(PHY,"rar_tools.c: ERROR: rb_alloc (%x) > RIV_max\n",rballoc);
-    return(-1);
-  }
-
-  ulsch->harq_processes[harq_pid]->first_rb                              = RIV2first_rb_LUT[rballoc];
-  ulsch->harq_processes[harq_pid]->nb_rb                                 = RIV2nb_rb_LUT[rballoc];
-
-  AssertFatal(ulsch->harq_processes[harq_pid]->nb_rb >0, "nb_rb == 0\n");
-
-  ulsch->power_offset = ue_power_offsets[ulsch->harq_processes[harq_pid]->nb_rb];
-
-  AssertFatal(ulsch->harq_processes[harq_pid]->nb_rb <= 6,"unlikely rb count for RAR grant : nb_rb > 6\n");
-
-  //  ulsch->harq_processes[harq_pid]->Ndi                                   = 1;
-  if (ulsch->harq_processes[harq_pid]->round == 0)
-    ulsch->harq_processes[harq_pid]->status = ACTIVE;
-
-  if (cqireq==1) {
-    ulsch->O_RI                                  = 1;
-
-    if (meas->rank[eNB_id] == 1) {
-      ulsch->uci_format                          = wideband_cqi_rank2_2A;
-      ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_5MHz;
-      ulsch->o_RI[0]                             = 1;
-    } else {
-      ulsch->uci_format                          = wideband_cqi_rank1_2A;
-      ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_5MHz;
-      ulsch->o_RI[0]                             = 0;
-    }
-
-    ulsch->uci_format = HLC_subband_cqi_nopmi;
-    fill_CQI(ulsch,meas,eNB_id,0,ue->frame_parms.N_RB_DL,0, transmission_mode,ue->sinr_eff);
-
-    if (((proc->frame_tx % 100) == 0) || (proc->frame_tx < 10))
-      print_CQI(ulsch->o,ulsch->uci_format,eNB_id,ue->frame_parms.N_RB_DL);
-  } else {
-    ulsch->O_RI                                = 0;
-    ulsch->O                                   = 0;
-  }
-
-  ulsch->harq_processes[harq_pid]->O_ACK                                  = 0;//2;
-
-  ulsch->beta_offset_cqi_times8                  = 18;
-  ulsch->beta_offset_ri_times8                   = 10;
-  ulsch->beta_offset_harqack_times8              = 16;
-
-  ulsch->Nsymb_pusch                             = 12-(frame_parms->Ncp<<1);
-  ulsch->rnti = (((uint16_t)rar[4])<<8)+rar[5];  //rar->t_crnti;
-
-  if (ulsch->harq_processes[harq_pid]->round == 0) {
-    ulsch->harq_processes[harq_pid]->status = ACTIVE;
-    ulsch->harq_processes[harq_pid]->rvidx = 0;
-    ulsch->harq_processes[harq_pid]->mcs         = ((rar[2]&1)<<3)|(rar[3]>>5);
-    ulsch->harq_processes[harq_pid]->TPC         = (rar[3]>>2)&7;
-    //ulsch->harq_processes[harq_pid]->TBS         = dlsch_tbs25[ulsch->harq_processes[harq_pid]->mcs][ulsch->harq_processes[harq_pid]->nb_rb-1];
-    ulsch->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1];
-    ulsch->harq_processes[harq_pid]->Msc_initial   = 12*ulsch->harq_processes[harq_pid]->nb_rb;
-    ulsch->harq_processes[harq_pid]->Nsymb_initial = 9;
-    ulsch->harq_processes[harq_pid]->round = 0;
-  } else {
-    ulsch->harq_processes[harq_pid]->rvidx = 0;
-    ulsch->harq_processes[harq_pid]->round++;
-  }
-
-  // initialize power control based on PRACH power
-  ulsch->f_pusch = delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC] +
-                   get_deltaP_rampup(ue->Mod_id,ue->CC_id);
-  LOG_D(PHY,"[UE %d][PUSCH PC] Initializing f_pusch to %d dB, TPC %d (delta_PUSCH_msg2 %d dB), deltaP_rampup %d dB\n",
-        ue->Mod_id,ulsch->f_pusch,ulsch->harq_processes[harq_pid]->TPC,delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC],
-        get_deltaP_rampup(ue->Mod_id,ue->CC_id));
-
-
-  //#ifdef DEBUG_RAR
-  LOG_D(PHY,"ulsch ra (UE): harq_pid %d\n",harq_pid);
-  LOG_D(PHY,"ulsch ra (UE): NBRB     %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
-  LOG_D(PHY,"ulsch ra (UE): first_rb %x\n",ulsch->harq_processes[harq_pid]->first_rb);
-  LOG_D(PHY,"ulsch ra (UE): nb_rb    %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
-  LOG_D(PHY,"ulsch ra (UE): round    %d\n",ulsch->harq_processes[harq_pid]->round);
-  LOG_D(PHY,"ulsch ra (UE): TBS      %d\n",ulsch->harq_processes[harq_pid]->TBS);
-  LOG_D(PHY,"ulsch ra (UE): mcs      %d\n",ulsch->harq_processes[harq_pid]->mcs);
-  LOG_D(PHY,"ulsch ra (UE): TPC      %d\n",ulsch->harq_processes[harq_pid]->TPC);
-  LOG_D(PHY,"ulsch ra (UE): O        %d\n",ulsch->O);
-  LOG_D(PHY,"ulsch ra (UE): ORI      %d\n",ulsch->O_RI);
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_RAR,VCD_FUNCTION_OUT);
-
-  //#endif
-  return(0);
-}
-
diff --git a/openair1/PHY/LTE_TRANSPORT/sss.c b/openair1/PHY/LTE_TRANSPORT/sss.c
index 6ca393c0f2..bf03c185ef 100644
--- a/openair1/PHY/LTE_TRANSPORT/sss.c
+++ b/openair1/PHY/LTE_TRANSPORT/sss.c
@@ -29,9 +29,9 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_eNB.h"
+#include "transport_eNB.h"
+#include "PHY/phy_extern.h"
 
 //#define DEBUG_SSS
 
diff --git a/openair1/PHY/LTE_TRANSPORT/transport_common.h b/openair1/PHY/LTE_TRANSPORT/transport_common.h
index 0f8a9889ed..a236fa5f55 100644
--- a/openair1/PHY/LTE_TRANSPORT/transport_common.h
+++ b/openair1/PHY/LTE_TRANSPORT/transport_common.h
@@ -172,6 +172,16 @@ typedef enum {
   DCI_UE_SPACE
 } dci_space_t;
 
+typedef struct {
+  uint8_t f_ra;
+  uint8_t t0_ra;
+  uint8_t t1_ra;
+  uint8_t t2_ra;
+} PRACH_TDD_PREAMBLE_MAP_elem;
+typedef struct {
+  uint8_t num_prach;
+  PRACH_TDD_PREAMBLE_MAP_elem map[6];
+} PRACH_TDD_PREAMBLE_MAP;
 
 /**@}*/
 #endif
diff --git a/openair1/PHY/LTE_TRANSPORT/transport_eNB.h b/openair1/PHY/LTE_TRANSPORT/transport_eNB.h
index be89f0c13c..a54353c022 100644
--- a/openair1/PHY/LTE_TRANSPORT/transport_eNB.h
+++ b/openair1/PHY/LTE_TRANSPORT/transport_eNB.h
@@ -32,7 +32,7 @@
 #ifndef __TRANSPORT_ENB__H__
 #define __TRANSPORT_ENB__H__
 #include "transport_common.h"
-#include "PHY/defs_eNB.h"
+//#include "PHY/defs_eNB.h"
 #include "PHY/impl_defs_lte.h"
 #include "dci.h"
 #include "mdci.h"
diff --git a/openair1/PHY/LTE_TRANSPORT/extern.h b/openair1/PHY/LTE_TRANSPORT/transport_extern.h
similarity index 98%
rename from openair1/PHY/LTE_TRANSPORT/extern.h
rename to openair1/PHY/LTE_TRANSPORT/transport_extern.h
index e791bec9a0..f3c10b26ca 100644
--- a/openair1/PHY/LTE_TRANSPORT/extern.h
+++ b/openair1/PHY/LTE_TRANSPORT/transport_extern.h
@@ -48,3 +48,5 @@ extern int16_t d0_sss[504*62],d5_sss[504*62];
 
 extern uint8_t wACK[5][4];
 extern int8_t wACK_RX[5][4];
+
+extern uint32_t bitrev_cc_dci[32];
diff --git a/openair1/PHY/LTE_TRANSPORT/transport_proto.h b/openair1/PHY/LTE_TRANSPORT/transport_proto.h
index 2e7d63bab7..3fd01a8bd1 100644
--- a/openair1/PHY/LTE_TRANSPORT/transport_proto.h
+++ b/openair1/PHY/LTE_TRANSPORT/transport_proto.h
@@ -31,7 +31,7 @@
  */
 #ifndef __LTE_TRANSPORT_PROTO__H__
 #define __LTE_TRANSPORT_PROTO__H__
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
 #include <math.h>
 #include "nfapi_interface.h"
 
@@ -106,15 +106,6 @@ int32_t dlsch_encoding(PHY_VARS_eNB *eNB,
                        time_stats_t *te_stats,
                        time_stats_t *i_stats);
 
-int32_t dlsch_encoding_SIC(PHY_VARS_UE *ue,
-                       uint8_t *a,
-                       uint8_t num_pdcch_symbols,
-                       LTE_eNB_DLSCH_t *dlsch,
-                       int frame,
-                       uint8_t subframe,
-                       time_stats_t *rm_stats,
-                       time_stats_t *te_stats,
-                       time_stats_t *i_stats);
 
 
 
diff --git a/openair1/PHY/LTE_TRANSPORT/vars.h b/openair1/PHY/LTE_TRANSPORT/transport_vars.h
similarity index 89%
rename from openair1/PHY/LTE_TRANSPORT/vars.h
rename to openair1/PHY/LTE_TRANSPORT/transport_vars.h
index 4b6fa920ea..5ab7df1ade 100644
--- a/openair1/PHY/LTE_TRANSPORT/vars.h
+++ b/openair1/PHY/LTE_TRANSPORT/transport_vars.h
@@ -78,3 +78,11 @@ char dci_format_strings[15][13] = {"0","1","1A","1B","1C","1D","1E_2A_M10PRB",
 
 uint8_t wACK[5][4] = {{1,1,1,1},{1,0,1,0},{1,1,0,0},{1,0,0,1},{0,0,0,0}};
 int8_t wACK_RX[5][4] = {{-1,-1,-1,-1},{-1,1,-1,1},{-1,-1,1,1},{-1,1,1,-1},{1,1,1,1}};
+
+uint32_t bitrev_cc_dci[32] = {1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31,0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30};
+
+uint8_t pcfich_b[4][32]= {{0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1},
+  {1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0},
+  {1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1},
+  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+};
diff --git a/openair1/PHY/LTE_TRANSPORT/uci_common.h b/openair1/PHY/LTE_TRANSPORT/uci_common.h
index c7741533da..78555d4928 100644
--- a/openair1/PHY/LTE_TRANSPORT/uci_common.h
+++ b/openair1/PHY/LTE_TRANSPORT/uci_common.h
@@ -19,6 +19,8 @@
  *      contact@openairinterface.org
  */
 
+#ifndef __UCI_COMMON__H
+#define __UCI_COMMON__H
 #include "PHY/types.h"
 
 
@@ -318,3 +320,5 @@ HLC_subband_cqi_mcs_CBA_20MHz;
 #define MAX_CQI_BYTES (sizeof(HLC_subband_cqi_rank2_2A_20MHz))
 #define MAX_ACK_PAYLOAD 18
 #define MAX_RI_PAYLOAD 6
+
+#endif
diff --git a/openair1/PHY/LTE_TRANSPORT/uci_tools.c b/openair1/PHY/LTE_TRANSPORT/uci_tools.c
index ef06386002..539d5476ab 100644
--- a/openair1/PHY/LTE_TRANSPORT/uci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/uci_tools.c
@@ -29,8 +29,7 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_eNB.h"
 #ifdef DEBUG_UCI_TOOLS
 #include "PHY/vars.h"
 #endif
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index 0d9bf8fd76..dc202ab488 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -30,19 +30,14 @@
 * \warning
 */
 
-//#include "defs.h"
-
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "PHY/CODING/extern.h"
-#include "extern.h"
-#include "SCHED/extern.h"
-#ifdef OPENAIR2
-#include "LAYER2/MAC/defs.h"
-#include "LAYER2/MAC/extern.h"
-#include "RRC/LITE/extern.h"
-#include "PHY_INTERFACE/extern.h"
-#endif
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "PHY/CODING/coding_extern.h"
+#include "SCHED/sched_eNB.h"
+#include "LAYER2/MAC/mac.h"
+#include "RRC/LTE/rrc_extern.h"
+#include "PHY_INTERFACE/phy_interface.h"
+
 
 #include "UTIL/LOG/vcd_signal_dumper.h"
 //#define DEBUG_ULSCH_DECODING
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
index 920d8ff3fd..cd80728b7c 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
@@ -30,10 +30,9 @@
 * \warning
 */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "defs.h"
-#include "extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "transport_eNB.h"
 //#define DEBUG_ULSCH
 #include "PHY/sse_intrin.h"
 
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c
index 4b73de6fcc..406a46b845 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c
@@ -19,7 +19,7 @@
  *      contact@openairinterface.org
  */
 
-/*! \file PHY/LTE_TRANSPORT/dci_tools.c
+/*! \file PHY/LTE_UE_TRANSPORT/dci_tools_ue.c
  * \brief PHY Support routines (eNB/UE) for filling PDSCH/PUSCH/DLSCH/ULSCH data structures based on DCI PDUs generated by eNB MAC scheduler.
  * \author R. Knopp
  * \date 2011
@@ -30,3795 +30,31 @@
  * \warning
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
+#include "SCHED_UE/sched_UE.h"
 #ifdef DEBUG_DCI_TOOLS
-#include "PHY/vars.h"
+#include "PHY/phy_vars.h"
 #endif
 #include "assertions.h"
-#include "nfapi_interface.h"
 
-//#define DEBUG_HARQ
-
-#include "LAYER2/MAC/extern.h"
-#include "LAYER2/MAC/defs.h"
-
-//#define DEBUG_DCI
-
-uint32_t localRIV2alloc_LUT6[32];
-uint32_t distRIV2alloc_even_LUT6[32];
-uint32_t distRIV2alloc_odd_LUT6[32];
-uint16_t RIV2nb_rb_LUT6[32];
-uint16_t RIV2first_rb_LUT6[32];
-uint16_t RIV_max6=0;
-
-uint32_t localRIV2alloc_LUT25[512];
-uint32_t distRIV2alloc_even_LUT25[512];
-uint32_t distRIV2alloc_odd_LUT25[512];
-uint16_t RIV2nb_rb_LUT25[512];
-uint16_t RIV2first_rb_LUT25[512];
-uint16_t RIV_max25=0;
-
-
-uint32_t localRIV2alloc_LUT50_0[1600];
-uint32_t localRIV2alloc_LUT50_1[1600];
-uint32_t distRIV2alloc_gap0_even_LUT50_0[1600];
-uint32_t distRIV2alloc_gap0_odd_LUT50_0[1600];
-uint32_t distRIV2alloc_gap0_even_LUT50_1[1600];
-uint32_t distRIV2alloc_gap0_odd_LUT50_1[1600];
-uint32_t distRIV2alloc_gap1_even_LUT50_0[1600];
-uint32_t distRIV2alloc_gap1_odd_LUT50_0[1600];
-uint32_t distRIV2alloc_gap1_even_LUT50_1[1600];
-uint32_t distRIV2alloc_gap1_odd_LUT50_1[1600];
-uint16_t RIV2nb_rb_LUT50[1600];
-uint16_t RIV2first_rb_LUT50[1600];
-uint16_t RIV_max50=0;
-
-uint32_t localRIV2alloc_LUT100_0[6000];
-uint32_t localRIV2alloc_LUT100_1[6000];
-uint32_t localRIV2alloc_LUT100_2[6000];
-uint32_t localRIV2alloc_LUT100_3[6000];
-uint32_t distRIV2alloc_gap0_even_LUT100_0[6000];
-uint32_t distRIV2alloc_gap0_odd_LUT100_0[6000];
-uint32_t distRIV2alloc_gap0_even_LUT100_1[6000];
-uint32_t distRIV2alloc_gap0_odd_LUT100_1[6000];
-uint32_t distRIV2alloc_gap0_even_LUT100_2[6000];
-uint32_t distRIV2alloc_gap0_odd_LUT100_2[6000];
-uint32_t distRIV2alloc_gap0_even_LUT100_3[6000];
-uint32_t distRIV2alloc_gap0_odd_LUT100_3[6000];
-uint32_t distRIV2alloc_gap1_even_LUT100_0[6000];
-uint32_t distRIV2alloc_gap1_odd_LUT100_0[6000];
-uint32_t distRIV2alloc_gap1_even_LUT100_1[6000];
-uint32_t distRIV2alloc_gap1_odd_LUT100_1[6000];
-uint32_t distRIV2alloc_gap1_even_LUT100_2[6000];
-uint32_t distRIV2alloc_gap1_odd_LUT100_2[6000];
-uint32_t distRIV2alloc_gap1_even_LUT100_3[6000];
-uint32_t distRIV2alloc_gap1_odd_LUT100_3[6000];
-uint16_t RIV2nb_rb_LUT100[6000];
-uint16_t RIV2first_rb_LUT100[6000];
-uint16_t RIV_max100=0;
-
-
-extern uint32_t current_dlsch_cqi;
-
-// Table 8.6.3-3 36.213
-uint16_t beta_cqi[16] = {0,   //reserved
-                         0,   //reserved
-                         9,   //1.125
-                         10,  //1.250
-                         11,  //1.375
-                         13,  //1.625
-                         14,  //1.750
-                         16,  //2.000
-                         18,  //2.250
-                         20,  //2.500
-                         23,  //2.875
-                         25,  //3.125
-                         28,  //3.500
-                         32,  //4.000
-                         40,  //5.000
-                         50
-                        }; //6.250
-
-// Table 8.6.3-2 36.213
-uint16_t beta_ri[16] = {10,   //1.250
-                        13,   //1.625
-                        16,   //2.000
-                        20,   //2.500
-                        25,   //3.125
-                        32,   //4.000
-                        40,   //5.000
-                        50,   //6.250
-                        64,   //8.000
-                        80,   //10.000
-                        101,  //12.625
-                        127,  //15.875
-                        160,  //20.000
-                        0,    //reserved
-                        0,    //reserved
-                        0
-                       };   //reserved
-
-// Table 8.6.3-2 36.213
-uint16_t beta_ack[16] = {16,  //2.000
-                         20,  //2.500
-                         25,  //3.125
-                         32,  //4.000
-                         40,  //5.000
-                         50,  //6.250
-                         64,  //8.000
-                         80,  //10.000
-                         101, //12.625
-                         127, //15.875
-                         160, //20.000
-                         248, //31.000
-                         400, //50.000
-                         640, //80.000
-                         808
-                        };//126.00
-
-int8_t delta_PUSCH_abs[4] = {-4,-1,1,4};
-int8_t delta_PUSCH_acc[4] = {-1,0,1,3};
-
-int8_t *delta_PUCCH_lut = delta_PUSCH_acc;
-
-void conv_eMTC_rballoc(uint16_t resource_block_coding,
-		       uint32_t N_RB_DL,
-		       uint32_t *rb_alloc) {
-
-   
-  int narrowband = resource_block_coding>>5;
-  int RIV        = resource_block_coding&31;
-  int N_NB_DL    = N_RB_DL/6;
-  int i0         = (N_RB_DL>>1) - (3*N_NB_DL);
-  int first_rb   = (6*narrowband)+i0;
-  int alloc      = localRIV2alloc_LUT6[RIV];
-  int ind        = first_rb>>5;
-  int ind_mod    = first_rb&31;
-
-  if (((N_RB_DL&1) > 0) && (narrowband>=(N_NB_DL>>1))) first_rb++;
-  rb_alloc[0]                        = 0;
-  rb_alloc[1]                        = 0;
-  rb_alloc[2]                        = 0;
-  rb_alloc[3]                        = 0;
-  rb_alloc[ind]                      = alloc<<ind_mod;
-  if (ind_mod > 26)  rb_alloc[ind+1] = alloc>>(6-(ind_mod-26)); 
-}
-
-void conv_rballoc(uint8_t ra_header,uint32_t rb_alloc,uint32_t N_RB_DL,uint32_t *rb_alloc2)
-{
-
-  uint32_t i,shift,subset;
-  rb_alloc2[0] = 0;
-  rb_alloc2[1] = 0;
-  rb_alloc2[2] = 0;
-  rb_alloc2[3] = 0;
-
-  //  printf("N_RB_DL %d, ra_header %d, rb_alloc %x\n",N_RB_DL,ra_header,rb_alloc);
-
-  switch (N_RB_DL) {
-
-  case 6:
-    rb_alloc2[0] = rb_alloc&0x3f;
-    break;
-
-  case 25:
-    if (ra_header == 0) {// Type 0 Allocation
-
-      for (i=12; i>0; i--) {
-        if ((rb_alloc&(1<<i)) != 0)
-          rb_alloc2[0] |= (3<<((2*(12-i))));
-
-        //      printf("rb_alloc2 (type 0) %x\n",rb_alloc2);
-      }
-
-      if ((rb_alloc&1) != 0)
-        rb_alloc2[0] |= (1<<24);
-    } else {
-      subset = rb_alloc&1;
-      shift  = (rb_alloc>>1)&1;
-
-      for (i=0; i<11; i++) {
-        if ((rb_alloc&(1<<(i+2))) != 0)
-          rb_alloc2[0] |= (1<<(2*i));
-
-        //printf("rb_alloc2 (type 1) %x\n",rb_alloc2);
-      }
-
-      if ((shift == 0) && (subset == 1))
-        rb_alloc2[0]<<=1;
-      else if ((shift == 1) && (subset == 0))
-        rb_alloc2[0]<<=4;
-      else if ((shift == 1) && (subset == 1))
-        rb_alloc2[0]<<=3;
-    }
-
-    break;
-
-  case 50:
-    AssertFatal(ra_header==0,"resource type 1 not supported for  N_RB_DL=50\n");
-
-    for (i=16; i>0; i--) {
-      if ((rb_alloc&(1<<i)) != 0)
-	rb_alloc2[(3*(16-i))>>5] |= (7<<((3*(16-i))%32));
-    }
-
-    // bit mask across
-    if ((rb_alloc2[0]>>31)==1)
-      rb_alloc2[1] |= 1;
-    
-    if ((rb_alloc&1) != 0)
-      rb_alloc2[1] |= (3<<16);
-    break;
-
-  case 100:
-    AssertFatal(ra_header==0,"resource type 1 not supported for  N_RB_DL=100\n");
-    for (i=0; i<25; i++) {
-      if ((rb_alloc&(1<<(24-i))) != 0)
-	rb_alloc2[(4*i)>>5] |= (0xf<<((4*i)%32));
-      
-      //  printf("rb_alloc2[%d] (type 0) %x (%d)\n",(4*i)>>5,rb_alloc2[(4*i)>>5],rb_alloc&(1<<i));
-    }
-
-    break;
-
-  default:
-    LOG_E(PHY,"Invalid N_RB_DL %d\n", N_RB_DL);
-    DevParam (N_RB_DL, 0, 0);
-    break;
-  }
-
-}
-
-
-
-uint32_t conv_nprb(uint8_t ra_header,uint32_t rb_alloc,int N_RB_DL)
-{
-
-  uint32_t nprb=0,i;
-
-  switch (N_RB_DL) {
-  case 6:
-    for (i=0; i<6; i++) {
-      if ((rb_alloc&(1<<i)) != 0)
-        nprb += 1;
-    }
-
-    break;
-
-  case 25:
-    if (ra_header == 0) {// Type 0 Allocation
-
-      for (i=12; i>0; i--) {
-        if ((rb_alloc&(1<<i)) != 0)
-          nprb += 2;
-      }
-
-      if ((rb_alloc&1) != 0)
-        nprb += 1;
-    } else {
-      for (i=0; i<11; i++) {
-        if ((rb_alloc&(1<<(i+2))) != 0)
-          nprb += 1;
-      }
-    }
-
-    break;
-
-  case 50:
-    if (ra_header == 0) {// Type 0 Allocation
-
-      for (i=0; i<16; i++) {
-        if ((rb_alloc&(1<<(16-i))) != 0)
-          nprb += 3;
-      }
-
-      if ((rb_alloc&1) != 0)
-        nprb += 2;
-
-    } else {
-      for (i=0; i<17; i++) {
-        if ((rb_alloc&(1<<(i+2))) != 0)
-          nprb += 1;
-      }
-    }
-
-    break;
-
-  case 100:
-    if (ra_header == 0) {// Type 0 Allocation
-
-      for (i=0; i<25; i++) {
-        if ((rb_alloc&(1<<(24-i))) != 0)
-          nprb += 4;
-      }
-    } else {
-      for (i=0; i<25; i++) {
-        if ((rb_alloc&(1<<(i+2))) != 0)
-          nprb += 1;
-      }
-    }
-
-    break;
-
-  default:
-    LOG_E(PHY,"Invalide N_RB_DL %d\n", N_RB_DL);
-    DevParam (N_RB_DL, 0, 0);
-    break;
-  }
-
-  return(nprb);
-}
-
-uint16_t computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs)
-{
-
-  uint16_t RIV;
-
-  if (Lcrbs<=(1+(N_RB_DL>>1)))
-    RIV = (N_RB_DL*(Lcrbs-1)) + RBstart;
-  else
-    RIV = (N_RB_DL*(N_RB_DL+1-Lcrbs)) + (N_RB_DL-1-RBstart);
-
-  return(RIV);
-}
-
-// Convert a DCI Format 1C RIV to a Format 1A RIV
-// This extracts the start and length in PRBs from the 1C rballoc and
-// recomputes the RIV as if it were the 1A rballoc
-
-uint32_t conv_1C_RIV(int32_t rballoc,uint32_t N_RB_DL) {
-
-  int NpDLVRB,N_RB_step,LpCRBsm1,RBpstart;
-
-  switch (N_RB_DL) {
-
-  case 6: // N_RB_step = 2, NDLVRB = 6, NpDLVRB = 3
-    NpDLVRB   = 3;
-    N_RB_step = 2;
-    break;
-  case 25: // N_RB_step = 2, NDLVRB = 24, NpDLVRB = 12
-    NpDLVRB   = 12;
-    N_RB_step = 2;
-    break;
-  case 50: // N_RB_step = 4, NDLVRB = 46, NpDLVRB = 11
-    NpDLVRB   = 11;
-    N_RB_step = 4;
-    break;
-  case 100: // N_RB_step = 4, NDLVRB = 96, NpDLVRB = 24
-    NpDLVRB   = 24;
-    N_RB_step = 4;
-    break;
-  default:
-    NpDLVRB   = 24;
-    N_RB_step = 4;
-    break;
-  }
-
-  // This is the 1C part from 7.1.6.3 in 36.213
-  LpCRBsm1 = rballoc/NpDLVRB;
-  //  printf("LpCRBs = %d\n",LpCRBsm1+1);
-
-  if (LpCRBsm1 <= (NpDLVRB/2)) {
-    RBpstart = rballoc % NpDLVRB;
-  }
-  else {
-    LpCRBsm1 = NpDLVRB-LpCRBsm1;
-    RBpstart = NpDLVRB-(rballoc%NpDLVRB);
-  }
-  //  printf("RBpstart %d\n",RBpstart);
-  return(computeRIV(N_RB_DL,N_RB_step*RBpstart,N_RB_step*(LpCRBsm1+1)));
-
-}
-
-uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
-
-  int offset;
-
-  switch (N_RB_DL) {
-
-  case 6:
-  // N_RB_DL = tildeN_RB_DL = 6
-  // Ngap = 4 , P=1, Nrow = 2, Nnull = 2
-
-    switch (vrb) {
-    case 0:  // even: 0->0, 1->2, odd: 0->3, 1->5
-    case 1:
-      return ((3*odd_slot) + 2*(vrb&3))%6;
-      break;
-    case 2:  // even: 2->3, 3->5, odd: 2->0, 3->2
-    case 3:
-      return ((3*odd_slot) + 2*(vrb&3) + 5)%6;
-      break;
-    case 4:  // even: 4->1, odd: 4->4
-      return ((3*odd_slot) + 1)%6;
-    case 5:  // even: 5->4, odd: 5->1
-      return ((3*odd_slot) + 4)%6;
-      break;
-    }
-    break;
-
-  case 15:
-    if (vrb<12) {
-      if ((vrb&3) < 2)     // even: 0->0, 1->4, 4->1, 5->5, 8->2, 9->6 odd: 0->7, 1->11
-  return(((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14);
-      else if (vrb < 12) // even: 2->7, 3->11, 6->8, 7->12, 10->9, 11->13
-  return (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14);
-    }
-    if (vrb==12)
-      return (3+(7*odd_slot)) % 14;
-    if (vrb==13)
-      return (10+(7*odd_slot)) % 14;
-    return 14;
-    break;
-
-  case 25:
-    return (((12*odd_slot) + 6*(vrb&3) + (vrb>>2))%24) + 24*(vrb/24);
-    break;
-
-  case 50: // P=3
-    if (Ngap==0) {
-      // Nrow=12,Nnull=2,NVRBDL=46,Ngap1= 27
-      if (vrb>=23)
-  offset=4;
-      else
-  offset=0;
-      if (vrb<44) {
-  if ((vrb&3)>=2)
-    return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46;
-  else
-    return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46;
-      }
-      if (vrb==44)  // even: 44->11, odd: 45->34
-  return offset+((23*odd_slot) + 22-12+1);
-      if (vrb==45)  // even: 45->10, odd: 45->33
-  return offset+((23*odd_slot) + 22+12);
-      if (vrb==46)
-  return offset+46+((23*odd_slot) + 23-12+1) % 46;
-      if (vrb==47)
-  return offset+46+((23*odd_slot) + 23+12) % 46;
-      if (vrb==48)
-  return offset+46+((23*odd_slot) + 23-12+1) % 46;
-      if (vrb==49)
-  return offset+46+((23*odd_slot) + 23+12) % 46;
-    }
-    else {
-      // Nrow=6,Nnull=6,NVRBDL=18,Ngap1= 27
-      if (vrb>=9)
-  offset=18;
-      else
-  offset=0;
-
-      if (vrb<12) {
-  if ((vrb&3)>=2)
-    return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18;
-  else
-    return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18;
-      }
-      else {
-  return offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18);
-      }
-    }
-    break;
-  case 75:
-    // Ngap1 = 32, NVRBRL=64, P=4, Nrow= 16, Nnull=0
-    if (Ngap ==0) {
-      return ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64);
-    } else {
-      // Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
-      return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
-    }
-    break;
-  case 100:
-    // Ngap1 = 48, NVRBDL=96, Nrow=24, Nnull=0
-    if (Ngap ==0) {
-      return ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96);
-    } else {
-      // Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
-      return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
-    }
-    break;
-  default:
-    LOG_E(PHY,"Unknown N_RB_DL %d\n",N_RB_DL);
-    return 0;
-  }
-  return 0;
-
-}
-
-
-void generate_RIV_tables()
-{
-
-  // 6RBs localized RIV
-  uint8_t Lcrbs,RBstart;
-  uint16_t RIV;
-  uint32_t alloc0,allocdist0_0_even,allocdist0_0_odd,allocdist0_1_even,allocdist0_1_odd;
-  uint32_t alloc1,allocdist1_0_even,allocdist1_0_odd,allocdist1_1_even,allocdist1_1_odd;
-  uint32_t alloc2,allocdist2_0_even,allocdist2_0_odd,allocdist2_1_even,allocdist2_1_odd;
-  uint32_t alloc3,allocdist3_0_even,allocdist3_0_odd,allocdist3_1_even,allocdist3_1_odd;
-  uint32_t nVRB,nVRB_even_dist,nVRB_odd_dist;
-
-  for (RBstart=0; RBstart<6; RBstart++) {
-    alloc0 = 0;
-    allocdist0_0_even = 0;
-    allocdist0_0_odd  = 0;
-    for (Lcrbs=1; Lcrbs<=(6-RBstart); Lcrbs++) {
-      //printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
-      nVRB             = Lcrbs-1+RBstart;
-      alloc0          |= (1<<nVRB);
-      allocdist0_0_even |= (1<<get_prb(6,0,nVRB,0));
-      allocdist0_0_odd  |= (1<<get_prb(6,1,nVRB,0));
-      RIV=computeRIV(6,RBstart,Lcrbs);
-
-      if (RIV>RIV_max6)
-        RIV_max6 = RIV;
-
-      //      printf("RIV %d (%d) : first_rb %d NBRB %d\n",RIV,localRIV2alloc_LUT25[RIV],RBstart,Lcrbs);
-      localRIV2alloc_LUT6[RIV] = alloc0;
-      distRIV2alloc_even_LUT6[RIV]  = allocdist0_0_even;
-      distRIV2alloc_odd_LUT6[RIV]  = allocdist0_0_odd;
-      RIV2nb_rb_LUT6[RIV]      = Lcrbs;
-      RIV2first_rb_LUT6[RIV]   = RBstart;
-    }
-  }
-
-
-  for (RBstart=0; RBstart<25; RBstart++) {
-    alloc0 = 0;
-    allocdist0_0_even = 0;
-    allocdist0_0_odd  = 0;
-    for (Lcrbs=1; Lcrbs<=(25-RBstart); Lcrbs++) {
-      nVRB = Lcrbs-1+RBstart;
-      //printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
-      alloc0     |= (1<<nVRB);
-      allocdist0_0_even |= (1<<get_prb(25,0,nVRB,0));
-      allocdist0_0_odd  |= (1<<get_prb(25,1,nVRB,0));
-
-      //printf("alloc 0 %x, allocdist0_even %x, allocdist0_odd %x\n",alloc0,allocdist0_0_even,allocdist0_0_odd);
-      RIV=computeRIV(25,RBstart,Lcrbs);
-
-      if (RIV>RIV_max25)
-        RIV_max25 = RIV;;
-
-
-      localRIV2alloc_LUT25[RIV]      = alloc0;
-      distRIV2alloc_even_LUT25[RIV]  = allocdist0_0_even;
-      distRIV2alloc_odd_LUT25[RIV]   = allocdist0_0_odd;
-      RIV2nb_rb_LUT25[RIV]           = Lcrbs;
-      RIV2first_rb_LUT25[RIV]        = RBstart;
-    }
-  }
-
-
-  for (RBstart=0; RBstart<50; RBstart++) {
-    alloc0 = 0;
-    alloc1 = 0;
-    allocdist0_0_even=0;
-    allocdist1_0_even=0;
-    allocdist0_0_odd=0;
-    allocdist1_0_odd=0;
-    allocdist0_1_even=0;
-    allocdist1_1_even=0;
-    allocdist0_1_odd=0;
-    allocdist1_1_odd=0;
-
-    for (Lcrbs=1; Lcrbs<=(50-RBstart); Lcrbs++) {
-
-      nVRB = Lcrbs-1+RBstart;
-
-
-      if (nVRB<32)
-        alloc0 |= (1<<nVRB);
-      else
-        alloc1 |= (1<<(nVRB-32));
-
-      // Distributed Gap1, even slot
-      nVRB_even_dist = get_prb(50,0,nVRB,0);
-      if (nVRB_even_dist<32)
-        allocdist0_0_even |= (1<<nVRB_even_dist);
-      else
-        allocdist1_0_even |= (1<<(nVRB_even_dist-32));
-
-      // Distributed Gap1, odd slot
-      nVRB_odd_dist = get_prb(50,1,nVRB,0);
-      if (nVRB_odd_dist<32)
-        allocdist0_0_odd |= (1<<nVRB_odd_dist);
-      else
-        allocdist1_0_odd |= (1<<(nVRB_odd_dist-32));
-
-      // Distributed Gap2, even slot
-      nVRB_even_dist = get_prb(50,0,nVRB,1);
-      if (nVRB_even_dist<32)
-        allocdist0_1_even |= (1<<nVRB_even_dist);
-      else
-        allocdist1_1_even |= (1<<(nVRB_even_dist-32));
-
-      // Distributed Gap2, odd slot
-      nVRB_odd_dist = get_prb(50,1,nVRB,1);
-      if (nVRB_odd_dist<32)
-        allocdist0_1_odd |= (1<<nVRB_odd_dist);
-      else
-        allocdist1_1_odd |= (1<<(nVRB_odd_dist-32));
-
-      RIV=computeRIV(50,RBstart,Lcrbs);
-
-      if (RIV>RIV_max50)
-        RIV_max50 = RIV;
-
-      //      printf("RIV %d : first_rb %d NBRB %d\n",RIV,RBstart,Lcrbs);
-      localRIV2alloc_LUT50_0[RIV]      = alloc0;
-      localRIV2alloc_LUT50_1[RIV]      = alloc1;
-      distRIV2alloc_gap0_even_LUT50_0[RIV]  = allocdist0_0_even;
-      distRIV2alloc_gap0_even_LUT50_1[RIV]  = allocdist1_0_even;
-      distRIV2alloc_gap0_odd_LUT50_0[RIV]   = allocdist0_0_odd;
-      distRIV2alloc_gap0_odd_LUT50_1[RIV]   = allocdist1_0_odd;
-      distRIV2alloc_gap1_even_LUT50_0[RIV]  = allocdist0_1_even;
-      distRIV2alloc_gap1_even_LUT50_1[RIV]  = allocdist1_1_even;
-      distRIV2alloc_gap1_odd_LUT50_0[RIV]   = allocdist0_1_odd;
-      distRIV2alloc_gap1_odd_LUT50_1[RIV]   = allocdist1_1_odd;
-      RIV2nb_rb_LUT50[RIV]        = Lcrbs;
-      RIV2first_rb_LUT50[RIV]     = RBstart;
-    }
-  }
-
-
-  for (RBstart=0; RBstart<100; RBstart++) {
-    alloc0 = 0;
-    alloc1 = 0;
-    alloc2 = 0;
-    alloc3 = 0;
-    allocdist0_0_even=0;
-    allocdist1_0_even=0;
-    allocdist2_0_even=0;
-    allocdist3_0_even=0;
-    allocdist0_0_odd=0;
-    allocdist1_0_odd=0;
-    allocdist2_0_odd=0;
-    allocdist3_0_odd=0;
-    allocdist0_1_even=0;
-    allocdist1_1_even=0;
-    allocdist2_1_even=0;
-    allocdist3_1_even=0;
-    allocdist0_1_odd=0;
-    allocdist1_1_odd=0;
-    allocdist2_1_odd=0;
-    allocdist3_1_odd=0;
-
-    for (Lcrbs=1; Lcrbs<=(100-RBstart); Lcrbs++) {
-
-      nVRB = Lcrbs-1+RBstart;
-
-      if (nVRB<32)
-        alloc0 |= (1<<nVRB);
-      else if (nVRB<64)
-        alloc1 |= (1<<(nVRB-32));
-      else if (nVRB<96)
-        alloc2 |= (1<<(nVRB-64));
-      else
-        alloc3 |= (1<<(nVRB-96));
-
-      // Distributed Gap1, even slot
-      nVRB_even_dist = get_prb(100,0,nVRB,0);
-
-//      if ((RBstart==0) && (Lcrbs<=8))
-//  printf("nVRB %d => nVRB_even_dist %d\n",nVRB,nVRB_even_dist);
-
-
-      if (nVRB_even_dist<32)
-        allocdist0_0_even |= (1<<nVRB_even_dist);
-      else if (nVRB_even_dist<64)
-        allocdist1_0_even |= (1<<(nVRB_even_dist-32));
-      else if (nVRB_even_dist<96)
-  allocdist2_0_even |= (1<<(nVRB_even_dist-64));
-      else
-  allocdist3_0_even |= (1<<(nVRB_even_dist-96));
-/*      if ((RBstart==0) && (Lcrbs<=8))
-  printf("rballoc =>(%08x.%08x.%08x.%08x)\n",
-         allocdist0_0_even,
-         allocdist1_0_even,
-         allocdist2_0_even,
-         allocdist3_0_even
-         );
-*/
-      // Distributed Gap1, odd slot
-      nVRB_odd_dist = get_prb(100,1,nVRB,0);
-      if (nVRB_odd_dist<32)
-        allocdist0_0_odd |= (1<<nVRB_odd_dist);
-      else if (nVRB_odd_dist<64)
-        allocdist1_0_odd |= (1<<(nVRB_odd_dist-32));
-      else if (nVRB_odd_dist<96)
-  allocdist2_0_odd |= (1<<(nVRB_odd_dist-64));
-      else
-  allocdist3_0_odd |= (1<<(nVRB_odd_dist-96));
-
-
-      // Distributed Gap2, even slot
-      nVRB_even_dist = get_prb(100,0,nVRB,1);
-      if (nVRB_even_dist<32)
-        allocdist0_1_even |= (1<<nVRB_even_dist);
-      else if (nVRB_even_dist<64)
-        allocdist1_1_even |= (1<<(nVRB_even_dist-32));
-      else if (nVRB_even_dist<96)
-  allocdist2_1_even |= (1<<(nVRB_even_dist-64));
-      else
-  allocdist3_1_even |= (1<<(nVRB_even_dist-96));
-
-
-      // Distributed Gap2, odd slot
-      nVRB_odd_dist = get_prb(100,1,nVRB,1);
-      if (nVRB_odd_dist<32)
-        allocdist0_1_odd |= (1<<nVRB_odd_dist);
-      else if (nVRB_odd_dist<64)
-        allocdist1_1_odd |= (1<<(nVRB_odd_dist-32));
-      else if (nVRB_odd_dist<96)
-  allocdist2_1_odd |= (1<<(nVRB_odd_dist-64));
-      else
-  allocdist3_1_odd |= (1<<(nVRB_odd_dist-96));
-
-
-      RIV=computeRIV(100,RBstart,Lcrbs);
-
-      if (RIV>RIV_max100)
-        RIV_max100 = RIV;
-
-      //      printf("RIV %d : first_rb %d NBRB %d\n",RIV,RBstart,Lcrbs);
-      localRIV2alloc_LUT100_0[RIV] = alloc0;
-      localRIV2alloc_LUT100_1[RIV] = alloc1;
-      localRIV2alloc_LUT100_2[RIV] = alloc2;
-      localRIV2alloc_LUT100_3[RIV] = alloc3;
-      distRIV2alloc_gap0_even_LUT100_0[RIV]  = allocdist0_0_even;
-      distRIV2alloc_gap0_even_LUT100_1[RIV]  = allocdist1_0_even;
-      distRIV2alloc_gap0_even_LUT100_2[RIV]  = allocdist2_0_even;
-      distRIV2alloc_gap0_even_LUT100_3[RIV]  = allocdist3_0_even;
-      distRIV2alloc_gap0_odd_LUT100_0[RIV]   = allocdist0_0_odd;
-      distRIV2alloc_gap0_odd_LUT100_1[RIV]   = allocdist1_0_odd;
-      distRIV2alloc_gap0_odd_LUT100_2[RIV]   = allocdist2_0_odd;
-      distRIV2alloc_gap0_odd_LUT100_3[RIV]   = allocdist3_0_odd;
-      distRIV2alloc_gap1_even_LUT100_0[RIV]  = allocdist0_1_even;
-      distRIV2alloc_gap1_even_LUT100_1[RIV]  = allocdist1_1_even;
-      distRIV2alloc_gap1_even_LUT100_2[RIV]  = allocdist2_1_even;
-      distRIV2alloc_gap1_even_LUT100_3[RIV]  = allocdist3_1_even;
-      distRIV2alloc_gap1_odd_LUT100_0[RIV]   = allocdist0_1_odd;
-      distRIV2alloc_gap1_odd_LUT100_1[RIV]   = allocdist1_1_odd;
-      distRIV2alloc_gap1_odd_LUT100_2[RIV]   = allocdist2_1_odd;
-      distRIV2alloc_gap1_odd_LUT100_3[RIV]   = allocdist3_1_odd;
-
-      RIV2nb_rb_LUT100[RIV]      = Lcrbs;
-      RIV2first_rb_LUT100[RIV]   = RBstart;
-    }
-  }
-}
-
-// Ngap = 3, N_VRB_DL=6, P=1, N_row=2, N_null=4*2-6=2
-// permutation for even slots :
-//    n_PRB'(0,2,4) = (0,1,2), n_PRB'(1,3,5) = (4,5,6)
-//    n_PRB''(0,1,2,3) = (0,2,4,6)
-//    => n_tilde_PRB(5) = (4)
-//       n_tilde_PRB(4) = (1)
-//       n_tilde_PRB(2,3) = (3,5)
-//       n_tilde_PRB(0,1) = (0,2)
-
-
-int8_t find_dlsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type)
-{
-  uint8_t i;
-  int8_t first_free_index=-1;
-
-  AssertFatal(eNB!=NULL,"eNB is null\n");
-  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
-    AssertFatal(eNB->dlsch[i]!=NULL,"eNB->dlsch[%d] is null\n",i);
-    AssertFatal(eNB->dlsch[i]!=NULL,"eNB->dlsch[%d][0] is null\n",i);
-    LOG_D(PHY,"searching for rnti %x : UE index %d=> harq_mask %x, rnti %x, first_free_index %d\n", rnti,i,eNB->dlsch[i][0]->harq_mask,eNB->dlsch[i][0]->rnti,first_free_index);
-    if ((eNB->dlsch[i][0]->harq_mask >0) &&
-        (eNB->dlsch[i][0]->rnti==rnti))       return i;
-    else if ((eNB->dlsch[i][0]->harq_mask == 0) && (first_free_index==-1)) first_free_index=i;
-  }
-  if (type == SEARCH_EXIST) return -1;
-  if (first_free_index != -1)
-    eNB->dlsch[first_free_index][0]->rnti = 0;
-  return first_free_index;
-}
-
-int8_t find_ulsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type)
-{
-  uint8_t i;
-  int8_t first_free_index=-1;
-
-  AssertFatal(eNB!=NULL,"eNB is null\n");
-  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
-    AssertFatal(eNB->ulsch[i]!=NULL,"eNB->ulsch[%d] is null\n",i);
-    if ((eNB->ulsch[i]->harq_mask >0) &&
-        (eNB->ulsch[i]->rnti==rnti))       return i;
-    else if ((eNB->ulsch[i]->harq_mask == 0) && (first_free_index==-1)) first_free_index=i;
-  }
-  if (type == SEARCH_EXIST) return -1;
-  if (first_free_index != -1)
-    eNB->ulsch[first_free_index]->rnti = 0;
-  return first_free_index;
-}
-
-
-uint32_t get_rballoc(vrb_t vrb_type,uint16_t rb_alloc_dci)
-{
-
-  return(localRIV2alloc_LUT25[rb_alloc_dci]);
-
-}
-
-/*
-uint8_t get_transmission_mode(module_id_t Mod_id, uint8_t CC_id, rnti_t rnti)
-{
-  unsigned char UE_id;
-
-  // find the UE_index corresponding to rnti
-  UE_id = find_ue(rnti,RC.eNB[Mod_id][CC_id]);
-  DevAssert( UE_id != (unsigned char)-1 );
-
-  return(RC.eNB[Mod_id][CC_id]->transmission_mode[UE_id]);
-}
-*/
-
-void fill_pdcch_order(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_dl_config_dci_dl_pdu *pdu)
-{
-  LTE_DL_FRAME_PARMS                *fp      = &eNB->frame_parms;
-  uint8_t                           *dci_pdu = &dci_alloc->dci_pdu[0];
-  nfapi_dl_config_dci_dl_pdu_rel8_t *rel8    = &pdu->dci_dl_pdu_rel8;
-
-  dci_alloc->firstCCE = rel8->cce_idx;
-  dci_alloc->L        = rel8->aggregation_level;
-  dci_alloc->rnti     = rel8->rnti;
-  dci_alloc->harq_pid = rel8->harq_process;
-  dci_alloc->ra_flag  = 0;
-  dci_alloc->format   = format1A;
-
-  LOG_D(PHY,"NFAPI: DCI format %d, nCCE %d, L %d, rnti %x,harq_pid %d\n",
-        rel8->dci_format,rel8->cce_idx,rel8->aggregation_level,rel8->rnti,rel8->harq_process);
-
-  switch (fp->N_RB_DL) {
-  case 6:
-    if (fp->frame_type == TDD) {
-      dci_alloc->dci_length                         = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
-      ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->type     = 1;
-      ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag;
-      ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs      = rel8->mcs_1;
-      ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi      = rel8->new_data_indicator_1;
-      ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc  = rel8->resource_block_coding;
-      ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rv       = rel8->redundancy_version_1;
-      ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC      = rel8->tpc;
-      ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid = rel8->harq_process;
-      ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->dai      = rel8->downlink_assignment_index;
-      ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->padding  = 0;
-    } else {
-      dci_alloc->dci_length                         = sizeof_DCI1A_1_5MHz_FDD_t;
-      ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->type         = 1;
-      ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->vrb_type     = rel8->virtual_resource_block_assignment_flag;
-      ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->mcs          = rel8->mcs_1;
-      ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->ndi          = rel8->new_data_indicator_1;
-      ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rballoc      = rel8->resource_block_coding;
-      ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rv           = rel8->redundancy_version_1;
-      ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->TPC          = rel8->tpc;
-      ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->harq_pid     = rel8->harq_process;
-      ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->padding      = 0;
-      //      printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-    }
-    break;
-  case 25:
-    if (fp->frame_type == TDD) {
-      dci_alloc->dci_length                         = sizeof_DCI1A_5MHz_TDD_1_6_t;
-      ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->type       = 1;
-      ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type   = rel8->virtual_resource_block_assignment_flag;
-      ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->mcs        = rel8->mcs_1;
-      ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->ndi        = rel8->new_data_indicator_1;
-      ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rballoc    = rel8->resource_block_coding;
-      ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rv         = rel8->redundancy_version_1;
-      ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->TPC        = rel8->tpc;
-      ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid   = rel8->harq_process;
-      ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->dai        = rel8->downlink_assignment_index;
-      ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->padding    = 0;
-       //        printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-    } else {
-      dci_alloc->dci_length                         = sizeof_DCI1A_5MHz_FDD_t;
-      ((DCI1A_5MHz_FDD_t *)dci_pdu)->type           = 1;
-      ((DCI1A_5MHz_FDD_t *)dci_pdu)->vrb_type       = rel8->virtual_resource_block_assignment_flag;
-      ((DCI1A_5MHz_FDD_t *)dci_pdu)->mcs            = rel8->mcs_1;
-      ((DCI1A_5MHz_FDD_t *)dci_pdu)->ndi            = rel8->new_data_indicator_1;
-      ((DCI1A_5MHz_FDD_t *)dci_pdu)->rballoc        = rel8->resource_block_coding;
-      ((DCI1A_5MHz_FDD_t *)dci_pdu)->rv             = rel8->redundancy_version_1;
-      ((DCI1A_5MHz_FDD_t *)dci_pdu)->TPC            = rel8->tpc;
-      ((DCI1A_5MHz_FDD_t *)dci_pdu)->harq_pid       = rel8->harq_process;
-      ((DCI1A_5MHz_FDD_t *)dci_pdu)->padding        = 0;
-      //      printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-    }
-    break;
-  case 50:
-    if (fp->frame_type == TDD) {
-      dci_alloc->dci_length                         = sizeof_DCI1A_10MHz_TDD_1_6_t;
-      ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->type      = 1;
-      ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->vrb_type  = rel8->virtual_resource_block_assignment_flag;
-      ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->mcs       = rel8->mcs_1;
-      ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->ndi       = rel8->new_data_indicator_1;
-      ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rballoc   = rel8->resource_block_coding;
-      ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rv        = rel8->redundancy_version_1;
-      ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->TPC       = rel8->tpc;
-      ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->harq_pid  = rel8->harq_process;
-      ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->dai       = rel8->downlink_assignment_index;
-      ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->padding   = 0;
-      //        printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-    } else {
-      dci_alloc->dci_length                         = sizeof_DCI1A_10MHz_FDD_t;
-      ((DCI1A_10MHz_FDD_t *)dci_pdu)->type          = 1;
-      ((DCI1A_10MHz_FDD_t *)dci_pdu)->vrb_type      = rel8->virtual_resource_block_assignment_flag;
-      ((DCI1A_10MHz_FDD_t *)dci_pdu)->mcs           = rel8->mcs_1;
-      ((DCI1A_10MHz_FDD_t *)dci_pdu)->ndi           = rel8->new_data_indicator_1;
-      ((DCI1A_10MHz_FDD_t *)dci_pdu)->rballoc       = rel8->resource_block_coding;
-      ((DCI1A_10MHz_FDD_t *)dci_pdu)->rv            = rel8->redundancy_version_1;
-      ((DCI1A_10MHz_FDD_t *)dci_pdu)->TPC           = rel8->tpc;
-      ((DCI1A_10MHz_FDD_t *)dci_pdu)->harq_pid      = rel8->harq_process;
-      ((DCI1A_10MHz_FDD_t *)dci_pdu)->padding       = 0;
-      //      printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-    }
-    break;
-  case 100:
-    if (fp->frame_type == TDD) {
-      dci_alloc->dci_length                         = sizeof_DCI1A_20MHz_TDD_1_6_t;
-      ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->type      = 1;
-      ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->vrb_type  = rel8->virtual_resource_block_assignment_flag;
-      ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->mcs       = rel8->mcs_1;
-      ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->ndi       = rel8->new_data_indicator_1;
-      ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rballoc   = rel8->resource_block_coding;
-      ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rv        = rel8->redundancy_version_1;
-      ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->TPC       = rel8->tpc;
-      ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid  = rel8->harq_process;
-      ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->dai       = rel8->downlink_assignment_index;
-      ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->padding   = 0;
-      //        printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-    } else {
-      dci_alloc->dci_length                         = sizeof_DCI1A_20MHz_FDD_t;
-      ((DCI1A_20MHz_FDD_t *)dci_pdu)->type          = 1;
-      ((DCI1A_20MHz_FDD_t *)dci_pdu)->vrb_type      = rel8->virtual_resource_block_assignment_flag;
-      ((DCI1A_20MHz_FDD_t *)dci_pdu)->mcs           = rel8->mcs_1;
-      ((DCI1A_20MHz_FDD_t *)dci_pdu)->ndi           = rel8->new_data_indicator_1;
-      ((DCI1A_20MHz_FDD_t *)dci_pdu)->rballoc       = rel8->resource_block_coding;
-      ((DCI1A_20MHz_FDD_t *)dci_pdu)->rv            = rel8->redundancy_version_1;
-      ((DCI1A_20MHz_FDD_t *)dci_pdu)->TPC           = rel8->tpc;
-      ((DCI1A_20MHz_FDD_t *)dci_pdu)->harq_pid      = rel8->harq_process;
-      ((DCI1A_20MHz_FDD_t *)dci_pdu)->padding       = 0;
-      //      printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-    }
-    break;
-  }
-
-  LOG_I(PHY,"%d.%d: DCI 1A: rnti %x, PDCCH order to do PRACH\n",
-        proc->frame_tx, proc->subframe_tx, rel8->rnti);
-}
-
-void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_dl_config_dci_dl_pdu *pdu)
-{
-  LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
-  uint8_t *dci_pdu = &dci_alloc->dci_pdu[0];
-  nfapi_dl_config_dci_dl_pdu_rel8_t *rel8 = &pdu->dci_dl_pdu_rel8;
-
-  /* check if this is a DCI 1A PDCCH order for RAPROC */
-  if (rel8->dci_format == NFAPI_DL_DCI_FORMAT_1A && rel8->rnti_type == 1) {
-    int full_rb;
-    switch (fp->N_RB_DL) {
-    case 6:   full_rb = 63;   break;
-    case 25:  full_rb = 511;  break;
-    case 50:  full_rb = 2047; break;
-    case 100: full_rb = 8191; break;
-    default:  abort();
-    }
-    if (rel8->resource_block_coding == full_rb)
-      return fill_pdcch_order(eNB, proc, dci_alloc, pdu);
-  }
-
-  LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
-  LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
-  int beamforming_mode = 0;
-  int UE_id=-1;
-  int NPRB;
-  int TB0_active;
-  int TB1_active;
-  uint16_t DL_pmi_single=0; // This should be taken from DLSCH parameters for PUSCH precoding
-  uint8_t I_mcs = 0;
- 
-  dci_alloc->firstCCE = rel8->cce_idx;
-  dci_alloc->L        = rel8->aggregation_level;
-  dci_alloc->rnti     = rel8->rnti;
-  dci_alloc->harq_pid = rel8->harq_process;
-  dci_alloc->ra_flag  = 0;
-
-  LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[SFN/SF:%04d%d] DCI format %d, nCCE %d, L %d, rnti %x, harq_pid %d\n",
-	frame,subframe,proc->frame_tx,proc->subframe_tx,rel8->dci_format,rel8->cce_idx,rel8->aggregation_level,rel8->rnti,rel8->harq_process);
-  if ((rel8->rnti_type == 2 ) && (rel8->rnti != SI_RNTI) && (rel8->rnti != P_RNTI)) dci_alloc->ra_flag = 1;
-
-  UE_id = find_dlsch(rel8->rnti,eNB,SEARCH_EXIST_OR_FREE);
-  AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n");
-  AssertFatal(UE_id<NUMBER_OF_UE_MAX,"returned UE_id %d >= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);
-  dlsch0 = eNB->dlsch[UE_id][0];
-  dlsch1 = eNB->dlsch[UE_id][1];
-
-    
-  beamforming_mode                          = eNB->transmission_mode[(uint8_t)UE_id]<7?0:eNB->transmission_mode[(uint8_t)UE_id];
-  dlsch0_harq                               = dlsch0->harq_processes[rel8->harq_process];
-  dlsch0_harq->codeword                     = 0;
-  dlsch1_harq                               = dlsch1->harq_processes[rel8->harq_process];
-  dlsch1_harq->codeword                     = 1;
-  dlsch0->subframe_tx[subframe]             = 1;
-
-  LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:SFN/SF:%04d%d dlsch0[rnti:%x harq_mask:%04x] dci_pdu[rnti:%x rnti_type:%d harq_process:%d ndi1:%d] dlsch0_harq[round:%d harq_mask:%x ndi:%d]\n", 
-      frame,subframe,
-      proc->frame_tx,proc->subframe_tx,
-      dlsch0->rnti,dlsch0->harq_mask,
-      rel8->rnti, rel8->rnti_type, rel8->harq_process, rel8->new_data_indicator_1,
-      dlsch0_harq->round, dlsch0->harq_mask, dlsch0_harq->ndi);
-
-  if (dlsch0->rnti != rel8->rnti) { // if rnti of dlsch is not the same as in the config, this is a new entry
-    dlsch0_harq->round=0;
-    dlsch0->harq_mask=0;
-  }
-  if ((dlsch0->harq_mask & (1<<rel8->harq_process)) > 0 ) {
-    if (rel8->new_data_indicator_1 != dlsch0_harq->ndi)
-      dlsch0_harq->round=0;
-  }
-  else  { // process is inactive, so activate and set round to 0
-    dlsch0_harq->round=0;
-  }
-  dlsch0_harq->ndi = rel8->new_data_indicator_1;
-
-  dlsch0->active        = 1;
-  if (rel8->rnti_type == 2)
-      dlsch0_harq->round    = 0;
-
-  LOG_D(PHY,"NFAPI: rel8[rnti %x dci_format %d harq_process %d ndi1 %d rnti type %d] dlsch0[rnti %x harq_mask %x] dlsch0_harq[round %d ndi %d]\n",
-      rel8->rnti,rel8->dci_format,rel8->harq_process, rel8->new_data_indicator_1, rel8->rnti_type,
-      dlsch0->rnti,dlsch0->harq_mask,
-      dlsch0_harq->round,dlsch0_harq->ndi
-      );
-
-  switch (rel8->dci_format) {
-
-  case NFAPI_DL_DCI_FORMAT_1A:
-
-      AssertFatal(rel8->resource_block_coding < 8192, "SFN/SF:%04d%d proc:TX:SFN/SF:%04d%d: rel8->resource_block_coding (%p) %u >= 8192 (rnti %x, rnti_type %d, format %d, harq_id %d\n",
-                frame,subframe,proc->frame_tx,subframe,
-                &rel8->resource_block_coding,rel8->resource_block_coding,rel8->rnti,rel8->rnti_type,rel8->dci_format,rel8->harq_process);
-  
-
-    dci_alloc->format     = format1A;
-
-    switch (fp->N_RB_DL) {
-    case 6:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                         = sizeof_DCI1A_1_5MHz_TDD_1_6_t; 
-        ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->type     = 1;
-        ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag;
-        ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs      = rel8->mcs_1;
-        ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi      = rel8->new_data_indicator_1;
-        ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc  = rel8->resource_block_coding;
-        ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rv       = rel8->redundancy_version_1;
-        ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC      = rel8->tpc;
-        ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid = rel8->harq_process;
-        ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->dai      = rel8->downlink_assignment_index;
-        ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->padding  = 0;
-	
-      } else {
-	dci_alloc->dci_length                         = sizeof_DCI1A_1_5MHz_FDD_t; 
-	((DCI1A_1_5MHz_FDD_t *)dci_pdu)->type         = 1;
-        ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->vrb_type     = rel8->virtual_resource_block_assignment_flag;
-        ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->mcs          = rel8->mcs_1;
-        ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->ndi          = rel8->new_data_indicator_1;
-        ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rballoc      = rel8->resource_block_coding;
-        ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rv           = rel8->redundancy_version_1;
-        ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->TPC          = rel8->tpc;
-        ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->harq_pid     = rel8->harq_process;
-        ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->padding      = 0;
-        //      printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      }
-      AssertFatal(rel8->virtual_resource_block_assignment_flag==LOCALIZED,"Distributed RB allocation not done yet\n");
-      dlsch0_harq->rb_alloc[0]    = localRIV2alloc_LUT6[rel8->resource_block_coding];
-      dlsch0_harq->vrb_type           =  rel8->virtual_resource_block_assignment_flag;
-      dlsch0_harq->nb_rb          = RIV2nb_rb_LUT6[rel8->resource_block_coding];//NPRB;
-      break;
-    case 25:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                         = sizeof_DCI1A_5MHz_TDD_1_6_t; 
-        ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->type       = 1;
-        ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type   = rel8->virtual_resource_block_assignment_flag;
-        ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->mcs        = rel8->mcs_1;
-        ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->ndi        = rel8->new_data_indicator_1;
-        ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rballoc    = rel8->resource_block_coding;
-        ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rv         = rel8->redundancy_version_1;
-        ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->TPC        = rel8->tpc;
-        ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid   = rel8->harq_process;
-        ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->dai        = rel8->downlink_assignment_index;
-        ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->padding    = 0;
-         //        printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                         = sizeof_DCI1A_5MHz_FDD_t; 
-	((DCI1A_5MHz_FDD_t *)dci_pdu)->type           = 1;
-        ((DCI1A_5MHz_FDD_t *)dci_pdu)->vrb_type       = rel8->virtual_resource_block_assignment_flag;
-        ((DCI1A_5MHz_FDD_t *)dci_pdu)->mcs            = rel8->mcs_1;
-        ((DCI1A_5MHz_FDD_t *)dci_pdu)->ndi            = rel8->new_data_indicator_1;
-        ((DCI1A_5MHz_FDD_t *)dci_pdu)->rballoc        = rel8->resource_block_coding;
-        ((DCI1A_5MHz_FDD_t *)dci_pdu)->rv             = rel8->redundancy_version_1;
-        ((DCI1A_5MHz_FDD_t *)dci_pdu)->TPC            = rel8->tpc;
-        ((DCI1A_5MHz_FDD_t *)dci_pdu)->harq_pid       = rel8->harq_process;
-        ((DCI1A_5MHz_FDD_t *)dci_pdu)->padding        = 0;
-        //      printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      }
-      AssertFatal(rel8->virtual_resource_block_assignment_flag==LOCALIZED,"Distributed RB allocation not done yet\n");
-      dlsch0_harq->rb_alloc[0]    = localRIV2alloc_LUT25[rel8->resource_block_coding];
-      dlsch0_harq->vrb_type           =  rel8->virtual_resource_block_assignment_flag;
-      dlsch0_harq->nb_rb          = RIV2nb_rb_LUT25[rel8->resource_block_coding];//NPRB;
-      break;
-    case 50:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                         = sizeof_DCI1A_10MHz_TDD_1_6_t; 
-        ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->type      = 1;
-        ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->vrb_type  = rel8->virtual_resource_block_assignment_flag;
-        ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->mcs       = rel8->mcs_1;
-        ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->ndi       = rel8->new_data_indicator_1;
-        ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rballoc   = rel8->resource_block_coding;
-        ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rv        = rel8->redundancy_version_1;
-        ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->TPC       = rel8->tpc;
-        ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->harq_pid  = rel8->harq_process;
-        ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->dai       = rel8->downlink_assignment_index;
-        ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->padding   = 0;
-        //        printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                         = sizeof_DCI1A_10MHz_FDD_t; 
-	((DCI1A_10MHz_FDD_t *)dci_pdu)->type          = 1;
-        ((DCI1A_10MHz_FDD_t *)dci_pdu)->vrb_type      = rel8->virtual_resource_block_assignment_flag;
-        ((DCI1A_10MHz_FDD_t *)dci_pdu)->mcs           = rel8->mcs_1;
-        ((DCI1A_10MHz_FDD_t *)dci_pdu)->ndi           = rel8->new_data_indicator_1;
-        ((DCI1A_10MHz_FDD_t *)dci_pdu)->rballoc       = rel8->resource_block_coding;
-        ((DCI1A_10MHz_FDD_t *)dci_pdu)->rv            = rel8->redundancy_version_1;
-        ((DCI1A_10MHz_FDD_t *)dci_pdu)->TPC           = rel8->tpc;
-        ((DCI1A_10MHz_FDD_t *)dci_pdu)->harq_pid      = rel8->harq_process;
-        ((DCI1A_10MHz_FDD_t *)dci_pdu)->padding       = 0;
-	//      printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      }
-      AssertFatal(rel8->virtual_resource_block_assignment_flag==LOCALIZED,"Distributed RB allocation not done yet\n");
-      dlsch0_harq->rb_alloc[0]     = localRIV2alloc_LUT50_0[rel8->resource_block_coding];
-      dlsch0_harq->rb_alloc[1]     = localRIV2alloc_LUT50_1[rel8->resource_block_coding];
-      dlsch0_harq->vrb_type           =  rel8->virtual_resource_block_assignment_flag;
-      dlsch0_harq->nb_rb              = RIV2nb_rb_LUT50[rel8->resource_block_coding];//NPRB;
-      break;
-    case 100:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                         = sizeof_DCI1A_20MHz_TDD_1_6_t; 
-        ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->type      = 1;
-        ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->vrb_type  = rel8->virtual_resource_block_assignment_flag;
-        ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->mcs       = rel8->mcs_1;
-        ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->ndi       = rel8->new_data_indicator_1;
-        ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rballoc   = rel8->resource_block_coding;
-        ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rv        = rel8->redundancy_version_1;
-        ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->TPC       = rel8->tpc;
-        ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid  = rel8->harq_process;
-        ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->dai       = rel8->downlink_assignment_index;
-        ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->padding   = 0;
-        //        printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                         = sizeof_DCI1A_20MHz_FDD_t; 
-	((DCI1A_20MHz_FDD_t *)dci_pdu)->type          = 1;
-        ((DCI1A_20MHz_FDD_t *)dci_pdu)->vrb_type      = rel8->virtual_resource_block_assignment_flag;
-        ((DCI1A_20MHz_FDD_t *)dci_pdu)->mcs           = rel8->mcs_1;
-        ((DCI1A_20MHz_FDD_t *)dci_pdu)->ndi           = rel8->new_data_indicator_1;
-        ((DCI1A_20MHz_FDD_t *)dci_pdu)->rballoc       = rel8->resource_block_coding;
-        ((DCI1A_20MHz_FDD_t *)dci_pdu)->rv            = rel8->redundancy_version_1;
-        ((DCI1A_20MHz_FDD_t *)dci_pdu)->TPC           = rel8->tpc;
-        ((DCI1A_20MHz_FDD_t *)dci_pdu)->harq_pid      = rel8->harq_process;
-        ((DCI1A_20MHz_FDD_t *)dci_pdu)->padding       = 0;
-	//      printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      }
-      AssertFatal(rel8->virtual_resource_block_assignment_flag==LOCALIZED,"Distributed RB allocation not done yet\n");
-      dlsch0_harq->rb_alloc[0]      = localRIV2alloc_LUT100_0[rel8->resource_block_coding];
-      dlsch0_harq->rb_alloc[1]      = localRIV2alloc_LUT100_1[rel8->resource_block_coding];
-      dlsch0_harq->rb_alloc[2]      = localRIV2alloc_LUT100_2[rel8->resource_block_coding];
-      dlsch0_harq->rb_alloc[3]      = localRIV2alloc_LUT100_3[rel8->resource_block_coding];
-      dlsch0_harq->vrb_type         =  rel8->virtual_resource_block_assignment_flag;
-      dlsch0_harq->nb_rb            = RIV2nb_rb_LUT100[rel8->resource_block_coding];//NPRB;
-      break;
-    }
-
-    if (rel8->rnti_type == 2 ) {
-      // see 36-212 V8.6.0 p. 45
-      NPRB      = (rel8->tpc&1)+2;
-      // 36-213 sec.7.1.7.2 p.26
-      I_mcs     = rel8->mcs_1;
-    }
-    else {
-      NPRB      = dlsch0_harq->nb_rb;
-      I_mcs     = get_I_TBS(rel8->mcs_1);
-    }
-    AssertFatal(NPRB>0,"DCI 1A: NPRB = 0 (rnti %x, rnti type %d, tpc %d, round %d, resource_block_coding %d, harq process %d)\n",rel8->rnti,rel8->rnti_type,rel8->tpc,dlsch0_harq->round,rel8->resource_block_coding,rel8->harq_process);
-    dlsch0_harq->rvidx         = rel8->redundancy_version_1;
-    dlsch0_harq->Nl            = 1;
-    dlsch0_harq->mimo_mode     = (fp->nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI;
-    dlsch0_harq->dl_power_off  = 1;
-    
-    
-
-    dlsch0_harq->mcs             = rel8->mcs_1;
-    dlsch0_harq->Qm              = 2;
-    dlsch0_harq->TBS             = TBStable[I_mcs][NPRB-1];
-    dlsch0->harq_ids[subframe]   = rel8->harq_process;
-    dlsch0->active               = 1;
-    dlsch0->rnti                 = rel8->rnti;
-    dlsch0->harq_ids[subframe]   = rel8->harq_process;
-    if (dlsch0_harq->round == 0)
-      dlsch0_harq->status = ACTIVE;
-
-    dlsch0->harq_mask            |= (1<<rel8->harq_process);
-
-    if (rel8->rnti_type == 1) LOG_I(PHY,"DCI 1A: round %d, mcs %d, rballoc %x, rv %d, rnti %x, harq process %d\n",dlsch0_harq->round,rel8->mcs_1,rel8->resource_block_coding,rel8->redundancy_version_1,rel8->rnti,rel8->harq_process);
-
-    break;
-  case NFAPI_DL_DCI_FORMAT_1:
-
-    dci_alloc->format           = format1;
-    dlsch0->active              = 1;
-
-    LOG_D(PHY,"SFN/SF:%04d%d proc:TX:SFN/SF:%04d%d: Programming DLSCH for Format 1 DCI, harq_pid %d\n",frame,subframe,proc->frame_tx,subframe,rel8->harq_process);
-
-    switch (fp->N_RB_DL) {
-    case 6:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                     = sizeof_DCI1_1_5MHz_TDD_t; 
-        ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rah       = rel8->resource_allocation_type;
-        ((DCI1_1_5MHz_TDD_t *)dci_pdu)->mcs       = rel8->mcs_1;
-        ((DCI1_1_5MHz_TDD_t *)dci_pdu)->ndi       = rel8->new_data_indicator_1;
-        ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rballoc   = rel8->resource_block_coding;
-        ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rv        = rel8->redundancy_version_1;
-        ((DCI1_1_5MHz_TDD_t *)dci_pdu)->TPC       = rel8->tpc;
-        ((DCI1_1_5MHz_TDD_t *)dci_pdu)->harq_pid  = rel8->harq_process;
-        ((DCI1_1_5MHz_TDD_t *)dci_pdu)->dai       = rel8->downlink_assignment_index;
-        ((DCI1_1_5MHz_TDD_t *)dci_pdu)->padding   = 0;
-        //        printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                         = sizeof_DCI1_1_5MHz_FDD_t; 
-        ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rah           = rel8->resource_allocation_type;
-        ((DCI1_1_5MHz_FDD_t *)dci_pdu)->mcs           = rel8->mcs_1;
-        ((DCI1_1_5MHz_FDD_t *)dci_pdu)->ndi       = rel8->new_data_indicator_1;
-        ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rballoc       = rel8->resource_block_coding;
-        ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rv            = rel8->redundancy_version_1;
-        ((DCI1_1_5MHz_FDD_t *)dci_pdu)->TPC           = rel8->tpc;
-        ((DCI1_1_5MHz_FDD_t *)dci_pdu)->harq_pid      = rel8->harq_process;
-        ((DCI1_1_5MHz_FDD_t *)dci_pdu)->padding       = 0;
-        //      printf("FDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      }
-      break;
-    case 25:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                      = sizeof_DCI1_5MHz_TDD_t; 
-        ((DCI1_5MHz_TDD_t *)dci_pdu)->rah      = rel8->resource_allocation_type;
-        ((DCI1_5MHz_TDD_t *)dci_pdu)->mcs      = rel8->mcs_1;
-        ((DCI1_5MHz_TDD_t *)dci_pdu)->ndi      = rel8->new_data_indicator_1;
-        ((DCI1_5MHz_TDD_t *)dci_pdu)->rballoc  = rel8->resource_block_coding;
-        ((DCI1_5MHz_TDD_t *)dci_pdu)->rv       = rel8->redundancy_version_1;
-        ((DCI1_5MHz_TDD_t *)dci_pdu)->TPC      = rel8->tpc;
-        ((DCI1_5MHz_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process;
-        ((DCI1_5MHz_TDD_t *)dci_pdu)->dai      = rel8->downlink_assignment_index;
-        ((DCI1_5MHz_TDD_t *)dci_pdu)->padding  = 0;
-        //        printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                  = sizeof_DCI1_5MHz_FDD_t; 
-        ((DCI1_5MHz_FDD_t *)dci_pdu)->rah      = rel8->resource_allocation_type;
-        ((DCI1_5MHz_FDD_t *)dci_pdu)->mcs      = rel8->mcs_1;
-        ((DCI1_5MHz_FDD_t *)dci_pdu)->ndi      = rel8->new_data_indicator_1;
-        ((DCI1_5MHz_FDD_t *)dci_pdu)->rballoc  = rel8->resource_block_coding;
-        ((DCI1_5MHz_FDD_t *)dci_pdu)->rv       = rel8->redundancy_version_1;
-        ((DCI1_5MHz_FDD_t *)dci_pdu)->TPC      = rel8->tpc;
-        ((DCI1_5MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process;
-        ((DCI1_5MHz_FDD_t *)dci_pdu)->padding  = 0;
-        //      printf("FDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      }
-      break;
-    case 50:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                       = sizeof_DCI1_10MHz_TDD_t; 
-        ((DCI1_10MHz_TDD_t *)dci_pdu)->rah      = rel8->resource_allocation_type;
-        ((DCI1_10MHz_TDD_t *)dci_pdu)->mcs      = rel8->mcs_1;
-        ((DCI1_10MHz_TDD_t *)dci_pdu)->ndi      = rel8->new_data_indicator_1;
-        ((DCI1_10MHz_TDD_t *)dci_pdu)->rballoc  = rel8->resource_block_coding;
-        ((DCI1_10MHz_TDD_t *)dci_pdu)->rv       = rel8->redundancy_version_1;
-        ((DCI1_10MHz_TDD_t *)dci_pdu)->TPC      = rel8->tpc;
-        ((DCI1_10MHz_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process;
-        ((DCI1_10MHz_TDD_t *)dci_pdu)->dai      = rel8->downlink_assignment_index;
-        ((DCI1_10MHz_TDD_t *)dci_pdu)->padding  = 0;
-        //        printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                   = sizeof_DCI1_10MHz_FDD_t; 
-        ((DCI1_10MHz_FDD_t *)dci_pdu)->rah      = rel8->resource_allocation_type;
-        ((DCI1_10MHz_FDD_t *)dci_pdu)->mcs      = rel8->mcs_1;
-        ((DCI1_10MHz_FDD_t *)dci_pdu)->ndi      = rel8->new_data_indicator_1;
-        ((DCI1_10MHz_FDD_t *)dci_pdu)->rballoc  = rel8->resource_block_coding;
-        ((DCI1_10MHz_FDD_t *)dci_pdu)->rv       = rel8->redundancy_version_1;
-        ((DCI1_10MHz_FDD_t *)dci_pdu)->TPC      = rel8->tpc;
-        ((DCI1_10MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process;
-        ((DCI1_10MHz_FDD_t *)dci_pdu)->padding  = 0;
-      }
-      break;
-    case 100:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                       = sizeof_DCI1_20MHz_TDD_t; 
-        ((DCI1_20MHz_TDD_t *)dci_pdu)->rah      = rel8->resource_allocation_type;
-        ((DCI1_20MHz_TDD_t *)dci_pdu)->mcs      = rel8->mcs_1;
-        ((DCI1_20MHz_TDD_t *)dci_pdu)->ndi      = rel8->new_data_indicator_1;
-        ((DCI1_20MHz_TDD_t *)dci_pdu)->rballoc  = rel8->resource_block_coding;
-        ((DCI1_20MHz_TDD_t *)dci_pdu)->rv       = rel8->redundancy_version_1;
-        ((DCI1_20MHz_TDD_t *)dci_pdu)->TPC      = rel8->tpc;
-        ((DCI1_20MHz_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process;
-        ((DCI1_20MHz_TDD_t *)dci_pdu)->dai      = rel8->downlink_assignment_index;
-        ((DCI1_20MHz_TDD_t *)dci_pdu)->padding  = 0;
-        //        printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                   = sizeof_DCI1_20MHz_FDD_t; 
-        ((DCI1_20MHz_FDD_t *)dci_pdu)->rah      = rel8->resource_allocation_type;
-        ((DCI1_20MHz_FDD_t *)dci_pdu)->mcs      = rel8->mcs_1;
-        ((DCI1_20MHz_FDD_t *)dci_pdu)->ndi      = rel8->new_data_indicator_1;
-        ((DCI1_20MHz_FDD_t *)dci_pdu)->rballoc  = rel8->resource_block_coding;
-        ((DCI1_20MHz_FDD_t *)dci_pdu)->rv       = rel8->redundancy_version_1;
-        ((DCI1_20MHz_FDD_t *)dci_pdu)->TPC      = rel8->tpc;
-        ((DCI1_20MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process;
-        ((DCI1_20MHz_FDD_t *)dci_pdu)->padding  = 0;
-      }
-      break;
-    }
-
-    AssertFatal(rel8->harq_process<8,"Format 1: harq_pid=%d >= 8\n", rel8->harq_process);
-
-
-    dlsch0_harq = dlsch0->harq_processes[rel8->harq_process];
-    dlsch0_harq->codeword=0;
-
-    // printf("DCI: Setting subframe_tx for subframe %d\n",subframe);
-    dlsch0->subframe_tx[subframe] = 1;
-
-    conv_rballoc(rel8->resource_allocation_type,
-                 rel8->resource_block_coding,
-		 fp->N_RB_DL,
-                 dlsch0_harq->rb_alloc);
-
-    dlsch0_harq->nb_rb = conv_nprb(rel8->resource_allocation_type,
-                                   rel8->resource_block_coding,
-                                   fp->N_RB_DL);
-
-    NPRB      = dlsch0_harq->nb_rb;
-
-
-    AssertFatal(NPRB>0,"NPRB == 0\n");
-
-    dlsch0_harq->rvidx       = rel8->redundancy_version_1;
-
-    dlsch0_harq->Nl          = 1;
-    //    dlsch[0]->layer_index = 0;
-    if (beamforming_mode == 0)
-      dlsch0_harq->mimo_mode = (fp->nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI;
-    else if (beamforming_mode == 7)
-      dlsch0_harq->mimo_mode = TM7;
-    else
-      LOG_E(PHY,"Invalid beamforming mode %dL\n", beamforming_mode);
-
-    dlsch0_harq->dl_power_off = 1;
-
-    dlsch0->active = 1;
-
-
-
-    if (dlsch0_harq->round == 0) {
-      dlsch0_harq->status = ACTIVE;
-
-      //            printf("Setting DLSCH process %d to ACTIVE\n",rel8->harq_process);
-      // MCS and TBS don't change across HARQ rounds
-      dlsch0_harq->mcs         = rel8->mcs_1;
-      dlsch0_harq->Qm          = get_Qm(rel8->mcs_1);
-      dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][NPRB-1];
-
-    }
-
-    LOG_D(PHY,"DCI: Set harq_ids[%d] to %d (%p)\n",subframe,rel8->harq_process,dlsch0);
-    dlsch0->harq_ids[subframe] = rel8->harq_process;
-
-    dlsch0->harq_mask          |= (1<<rel8->harq_process);
-
-
-    dlsch0->rnti = rel8->rnti;
-
-
-    break;
-  case NFAPI_DL_DCI_FORMAT_2A:
-
-    dci_alloc->format     = format2A;
-    switch (fp->N_RB_DL) {
-    case 6:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                         = sizeof_DCI2A_1_5MHz_2A_TDD_t; 
-        ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rah      = rel8->resource_allocation_type;
-        ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1     = rel8->mcs_1;
-        ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2     = rel8->mcs_2;
-        ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->ndi1     = rel8->new_data_indicator_1;
-        ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->ndi2     = rel8->new_data_indicator_2;
-        ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc  = rel8->resource_block_coding;
-        ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv1      = rel8->redundancy_version_1;
-        ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv2      = rel8->redundancy_version_2;
-        ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->TPC      = rel8->tpc;
-        ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process;
-	((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap  = rel8->transport_block_to_codeword_swap_flag;
-        ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->dai      = rel8->downlink_assignment_index;
-        /* there is no padding in this structure, it is exactly 32 bits */
-        //        printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                         = sizeof_DCI2A_1_5MHz_2A_FDD_t; 
-        ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rah          = rel8->resource_allocation_type;
-        ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1         = rel8->mcs_1;
-        ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2         = rel8->mcs_2;
-        ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->ndi1         = rel8->new_data_indicator_1;
-        ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->ndi2         = rel8->new_data_indicator_2;
-        ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc      = rel8->resource_block_coding;
-        ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv1          = rel8->redundancy_version_1;
-        ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv2          = rel8->redundancy_version_2;
-        ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->TPC          = rel8->tpc;
-        ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid     = rel8->harq_process;
-	((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap      = rel8->transport_block_to_codeword_swap_flag;
-	((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->padding      = 0;
-        //      printf("FDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      }
-      break;
-    case 25:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                        = sizeof_DCI2A_5MHz_2A_TDD_t; 
-        ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rah       = rel8->resource_allocation_type;
-        ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs1      = rel8->mcs_1;
-        ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs2      = rel8->mcs_2;
-        ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->ndi1      = rel8->new_data_indicator_1;
-        ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->ndi2      = rel8->new_data_indicator_2;
-        ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rballoc   = rel8->resource_block_coding;
-        ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv1       = rel8->redundancy_version_1;
-        ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv2       = rel8->redundancy_version_2;
-        ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->TPC       = rel8->tpc;
-        ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->harq_pid  = rel8->harq_process;
-	((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->tb_swap   = rel8->transport_block_to_codeword_swap_flag;
-        ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->dai       = rel8->downlink_assignment_index;
-        ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->padding   = 0;
-        //        printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                           = sizeof_DCI2A_5MHz_2A_FDD_t; 
-        ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rah           = rel8->resource_allocation_type;
-        ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs1          = rel8->mcs_1;
-        ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs2          = rel8->mcs_2;
-        ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->ndi1          = rel8->new_data_indicator_1;
-        ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->ndi2          = rel8->new_data_indicator_2;
-        ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rballoc       = rel8->resource_block_coding;
-        ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv1           = rel8->redundancy_version_1;
-        ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv2           = rel8->redundancy_version_2;
-        ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->TPC           = rel8->tpc;
-        ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->harq_pid      = rel8->harq_process;
-	((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->tb_swap       = rel8->transport_block_to_codeword_swap_flag;	
-	((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->padding       = 0;
-        //      printf("FDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      }
-      break;
-    case 50:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                        = sizeof_DCI2A_10MHz_2A_TDD_t; 
-        ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rah      = rel8->resource_allocation_type;
-        ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs1     = rel8->mcs_1;
-        ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs2     = rel8->mcs_2;
-        ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->ndi1     = rel8->new_data_indicator_1;
-        ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->ndi2     = rel8->new_data_indicator_2;
-        ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rballoc  = rel8->resource_block_coding;
-        ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv1      = rel8->redundancy_version_1;
-        ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv2      = rel8->redundancy_version_2;
-        ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->TPC      = rel8->tpc;
-        ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process;
-	((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->tb_swap  = rel8->transport_block_to_codeword_swap_flag;
-        ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->dai      = rel8->downlink_assignment_index;
-        ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->padding  = 0;
-        //        printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                        = sizeof_DCI2A_10MHz_2A_FDD_t; 
-        ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rah       = rel8->resource_allocation_type;
-        ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs1      = rel8->mcs_1;
-        ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs2      = rel8->mcs_2;
-        ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->ndi1      = rel8->new_data_indicator_1;
-        ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->ndi2      = rel8->new_data_indicator_2;
-        ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rballoc   = rel8->resource_block_coding;
-        ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv1       = rel8->redundancy_version_1;
-        ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv2       = rel8->redundancy_version_2;
-        ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->TPC       = rel8->tpc;
-        ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->harq_pid  = rel8->harq_process;
-	((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->tb_swap   = rel8->transport_block_to_codeword_swap_flag;
-	((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->padding   = 0;
-      }
-      break;
-    case 100:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                        = sizeof_DCI2A_20MHz_2A_TDD_t; 
-        ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rah       = rel8->resource_allocation_type;
-        ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs1      = rel8->mcs_1;
-        ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs2      = rel8->mcs_2;
-        ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->ndi1      = rel8->new_data_indicator_1;
-        ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->ndi2      = rel8->new_data_indicator_2;
-        ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rballoc   = rel8->resource_block_coding;
-        ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv1       = rel8->redundancy_version_1;
-        ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv2       = rel8->redundancy_version_2;
-        ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->TPC       = rel8->tpc;
-        ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->harq_pid  = rel8->harq_process;
-	((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->tb_swap   = rel8->transport_block_to_codeword_swap_flag;
-        ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->dai       = rel8->downlink_assignment_index;
-        ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->padding   = 0;
-        //        printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                           = sizeof_DCI2A_20MHz_2A_FDD_t; 
-        ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rah          = rel8->resource_allocation_type;
-        ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs1         = rel8->mcs_1;
-        ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs2         = rel8->mcs_2;
-        ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->ndi1         = rel8->new_data_indicator_1;
-        ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->ndi2         = rel8->new_data_indicator_2;
-        ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rballoc      = rel8->resource_block_coding;
-        ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv1          = rel8->redundancy_version_1;
-        ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv2          = rel8->redundancy_version_2;
-        ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->TPC          = rel8->tpc;
-        ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->harq_pid     = rel8->harq_process;
-	((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->tb_swap      = rel8->transport_block_to_codeword_swap_flag;
-	((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->padding      = 0;
-      }
-      break;
-
-    }
-
-    AssertFatal(rel8->harq_process<8,"Format 2_2A: harq_pid=%d >= 8\n", rel8->harq_process);
-
-
-    // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
-    // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
-
-    // This must be set as in TM4, does not work properly now.
-    if (rel8->transport_block_to_codeword_swap_flag == 1) {
-      dlsch0 = eNB->dlsch[UE_id][1];
-      dlsch1 = eNB->dlsch[UE_id][0];
-    }
-
-    dlsch0_harq = dlsch0->harq_processes[rel8->harq_process];
-    dlsch1_harq = dlsch1->harq_processes[rel8->harq_process];
-
-    dlsch0->subframe_tx[subframe] = 1;
-
-    dlsch0->harq_ids[subframe] = rel8->harq_process;
-    dlsch1->harq_ids[subframe] = rel8->harq_process;
-    //    printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
-
-
-    conv_rballoc(rel8->resource_allocation_type,
-                 rel8->resource_block_coding,
-                 fp->N_RB_DL,
-                 dlsch0_harq->rb_alloc);
-
-    dlsch1_harq->rb_alloc[0]                         = dlsch0_harq->rb_alloc[0];
-    dlsch0_harq->nb_rb                               = conv_nprb(rel8->resource_allocation_type,
-								 rel8->resource_block_coding,
-								 fp->N_RB_DL);
-    dlsch1_harq->nb_rb                               = dlsch0_harq->nb_rb;
-
-    AssertFatal(dlsch0_harq->nb_rb > 0,"nb_rb=0\n");
-
-    dlsch0_harq->mcs       = rel8->mcs_1;
-    dlsch1_harq->mcs       = rel8->mcs_2;
-    dlsch0_harq->Qm        = get_Qm(rel8->mcs_1);
-    dlsch1_harq->Qm        = get_Qm(rel8->mcs_2);
-    dlsch0_harq->rvidx     = rel8->redundancy_version_1;
-    dlsch1_harq->rvidx     = rel8->redundancy_version_2;
-
-    // assume both TBs are active
-    dlsch0_harq->Nl        = 1;
-    dlsch1_harq->Nl        = 1;
-    dlsch0->active = 1;
-    dlsch1->active = 1;
-    dlsch0->harq_mask                         |= (1<<rel8->harq_process);
-    dlsch1->harq_mask                         |= (1<<rel8->harq_process);
-
-    // check if either TB is disabled (see 36-213 V11.3 Section )
-    if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
-      dlsch0->active = 0;
-      dlsch0->harq_mask                         &= ~(1<<rel8->harq_process);
-    }
-
-    if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
-      dlsch1->active = 0;
-      dlsch1->harq_mask                         &= ~(1<<rel8->harq_process);
-    }
-
-   // dlsch0_harq->dl_power_off = 0;
-   // dlsch1_harq->dl_power_off = 0;
-
-
-    if (fp->nb_antenna_ports_eNB == 2) {
-      dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
-      dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1];
-
-      if ((dlsch0->active==1) && (dlsch1->active==1)) {
-
-        dlsch0_harq->mimo_mode = LARGE_CDD;
-        dlsch1_harq->mimo_mode = LARGE_CDD;
-        dlsch0_harq->dl_power_off = 1;
-        dlsch1_harq->dl_power_off = 1;
-      } else {
-        dlsch0_harq->mimo_mode   = ALAMOUTI;
-        dlsch1_harq->mimo_mode   = ALAMOUTI;
-      }
-    } else if (fp->nb_antenna_ports_eNB == 4) { // 4 antenna case
-      if ((dlsch0->active==1) && (dlsch1->active==1)) {
-        switch (rel8->precoding_information) {
-        case 0: // one layer per transport block
-          dlsch0_harq->mimo_mode   = LARGE_CDD;
-          dlsch1_harq->mimo_mode   = LARGE_CDD;
-          dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
-          dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
-          dlsch0_harq->dl_power_off = 1;
-          dlsch1_harq->dl_power_off = 1;
-          break;
-
-        case 1: // one-layers on TB 0, two on TB 1
-          dlsch0_harq->mimo_mode   = LARGE_CDD;
-          dlsch1_harq->mimo_mode   = LARGE_CDD;
-          dlsch1_harq->Nl          = 2;
-          dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
-          dlsch0_harq->dl_power_off = 1;
-          dlsch1_harq->dl_power_off = 1;
-          break;
-
-        case 2: // two-layers on TB 0, two on TB 1
-          dlsch0_harq->mimo_mode   = LARGE_CDD;
-          dlsch1_harq->mimo_mode   = LARGE_CDD;
-          dlsch0_harq->Nl          = 2;
-          dlsch0_harq->dl_power_off = 1;
-          dlsch1_harq->dl_power_off = 1;
-
-          if (fp->N_RB_DL <= 56) {
-            dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
-            dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
-          } else {
-            LOG_E(PHY,"Add implementation of Table 7.1.7.2.2-1 for two-layer TBS conversion with N_RB_DL > 56\n");
-          }
-
-          break;
-
-        case 3: //
-          LOG_E(PHY,"Illegal value (3) for TPMI in Format 2A DCI\n");
-          break;
-        }
-      } else if (dlsch0->active == 1) {
-        switch (rel8->precoding_information) {
-        case 0: // one layer per transport block
-          dlsch0_harq->mimo_mode   = ALAMOUTI;
-          dlsch1_harq->mimo_mode   = ALAMOUTI;
-          dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
-          break;
-
-        case 1: // two-layers on TB 0
-          dlsch0_harq->mimo_mode   = LARGE_CDD;
-          dlsch0_harq->Nl          = 2;
-          dlsch0_harq->dl_power_off = 1;
-          dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
-          break;
-
-        case 2: // two-layers on TB 0, two on TB 1
-        case 3: //
-          LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",rel8->precoding_information);
-          break;
-        }
-      } else if (dlsch1->active == 1) {
-        switch (rel8->precoding_information) {
-        case 0: // one layer per transport block
-          dlsch0_harq->mimo_mode   = ALAMOUTI;
-          dlsch1_harq->mimo_mode   = ALAMOUTI;
-          dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
-          break;
-
-        case 1: // two-layers on TB 0
-          dlsch1_harq->mimo_mode   = LARGE_CDD;
-          dlsch1_harq->Nl          = 2;
-          dlsch1_harq->dl_power_off = 1;
-          dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
-          break;
-
-        case 2: // two-layers on TB 0, two on TB 1
-        case 3: //
-          LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",rel8->precoding_information);
-          break;
-        }
-      }
-    } else {
-      LOG_E(PHY,"Illegal number of antennas for eNB %d\n",fp->nb_antenna_ports_eNB);
-    }
-
-    // reset HARQ process if this is the first transmission
-    if ((dlsch0->active==1) && (dlsch0_harq->round == 0))
-      dlsch0_harq->status = ACTIVE;
-
-    if ((dlsch1->active==1) && (dlsch1_harq->round == 0))
-      dlsch1_harq->status = ACTIVE;
-
-    dlsch0->rnti = rel8->rnti;
-    dlsch1->rnti = rel8->rnti;
-
-
-    break;
-      
-  case NFAPI_DL_DCI_FORMAT_2:
-
-    dci_alloc->format     = format2;
-    switch (fp->N_RB_DL) {
-    case 6:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                       = sizeof_DCI2_1_5MHz_2A_TDD_t; 
-        ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1     = rel8->mcs_1;
-        ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2     = rel8->mcs_2;
-        ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->ndi1     = rel8->new_data_indicator_1;
-        ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->ndi2     = rel8->new_data_indicator_2;
-        ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc  = rel8->resource_block_coding;
-        ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv1      = rel8->redundancy_version_1;
-        ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv2      = rel8->redundancy_version_2;
-        ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->TPC      = rel8->tpc;
-        ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process;
-	((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap  = rel8->transport_block_to_codeword_swap_flag;
-        ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->dai      = rel8->downlink_assignment_index;
-        ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tpmi     = rel8->precoding_information;
-        ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->padding  = 0;
-        //        printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                         = sizeof_DCI2_1_5MHz_2A_FDD_t; 
-        ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1         = rel8->mcs_1;
-        ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2         = rel8->mcs_2;
-        ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->ndi1         = rel8->new_data_indicator_1;
-        ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->ndi2         = rel8->new_data_indicator_2;
-        ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc      = rel8->resource_block_coding;
-        ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv1          = rel8->redundancy_version_1;
-        ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv2          = rel8->redundancy_version_2;
-        ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->TPC          = rel8->tpc;
-        ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid     = rel8->harq_process;
-	((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap      = rel8->transport_block_to_codeword_swap_flag;
-        ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tpmi         = rel8->precoding_information;
-        ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->padding      = 0;
-        //      printf("FDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      }
-      break;
-    case 25:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                        = sizeof_DCI2_5MHz_2A_TDD_t; 
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rah       = rel8->resource_allocation_type;
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1      = rel8->mcs_1;
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2      = rel8->mcs_2;
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi1      = rel8->new_data_indicator_1;
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi2      = rel8->new_data_indicator_2;
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rballoc   = rel8->resource_block_coding;
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv1       = rel8->redundancy_version_1;
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv2       = rel8->redundancy_version_2;
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->TPC       = rel8->tpc;
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->harq_pid  = rel8->harq_process;
-	((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap   = rel8->transport_block_to_codeword_swap_flag;	
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->dai       = rel8->downlink_assignment_index;	
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tpmi      = rel8->precoding_information;
-        ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->padding   = 0;
-        //        printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                           = sizeof_DCI2_5MHz_2A_FDD_t; 
-        ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rah           = rel8->resource_allocation_type;
-        ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs1          = rel8->mcs_1;
-        ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs2          = rel8->mcs_2;
-        ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi1          = rel8->new_data_indicator_1;
-        ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi2          = rel8->new_data_indicator_2;
-        ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rballoc       = rel8->resource_block_coding;
-        ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv1           = rel8->redundancy_version_1;
-        ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv2           = rel8->redundancy_version_2;
-        ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->TPC           = rel8->tpc;
-        ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->harq_pid      = rel8->harq_process;
-	((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap       = rel8->transport_block_to_codeword_swap_flag;
-        ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi          = rel8->precoding_information;
-        ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->padding       = 0;
-        //      printf("FDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      }
-      break;
-    case 50:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                        = sizeof_DCI2_10MHz_2A_TDD_t; 
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rah      = rel8->resource_allocation_type;
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs1     = rel8->mcs_1;
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs2     = rel8->mcs_2;
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->ndi1     = rel8->new_data_indicator_1;
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->ndi2     = rel8->new_data_indicator_2;
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rballoc  = rel8->resource_block_coding;
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv1      = rel8->redundancy_version_1;
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv2      = rel8->redundancy_version_2;
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->TPC      = rel8->tpc;
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process;
-	((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tb_swap  = rel8->transport_block_to_codeword_swap_flag;	
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->dai      = rel8->downlink_assignment_index;	
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tpmi     = rel8->precoding_information;
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->padding  = 0;
-        //        printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                        = sizeof_DCI2_10MHz_2A_FDD_t; 
-        ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rah       = rel8->resource_allocation_type;
-        ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs1      = rel8->mcs_1;
-        ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs2      = rel8->mcs_2;
-        ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->ndi1      = rel8->new_data_indicator_1;
-        ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->ndi2      = rel8->new_data_indicator_2;
-        ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rballoc   = rel8->resource_block_coding;
-        ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv1       = rel8->redundancy_version_1;
-        ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv2       = rel8->redundancy_version_2;
-        ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->TPC       = rel8->tpc;
-        ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->harq_pid  = rel8->harq_process;
-	((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tb_swap   = rel8->transport_block_to_codeword_swap_flag;
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tpmi      = rel8->precoding_information;
-        ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->padding   = 0;
-      }
-      break;
-    case 100:
-      if (fp->frame_type == TDD) {
-	dci_alloc->dci_length                        = sizeof_DCI2_20MHz_2A_TDD_t;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rah       = rel8->resource_allocation_type;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs1      = rel8->mcs_1;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs2      = rel8->mcs_2;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->ndi1      = rel8->new_data_indicator_1;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->ndi2      = rel8->new_data_indicator_2;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rballoc   = rel8->resource_block_coding;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv1       = rel8->redundancy_version_1;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv2       = rel8->redundancy_version_2;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->TPC       = rel8->tpc;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->harq_pid  = rel8->harq_process;
-	((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tb_swap   = rel8->transport_block_to_codeword_swap_flag;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->dai       = rel8->downlink_assignment_index;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tpmi      = rel8->precoding_information;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->padding   = 0;
-        //        printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
-      } else {
-	dci_alloc->dci_length                           = sizeof_DCI2_20MHz_2A_FDD_t;
-        ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rah          = rel8->resource_allocation_type;
-        ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs1         = rel8->mcs_1;
-        ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs2         = rel8->mcs_2;
-        ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->ndi1         = rel8->new_data_indicator_1;
-        ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->ndi2         = rel8->new_data_indicator_2;
-        ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rballoc      = rel8->resource_block_coding;
-        ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv1          = rel8->redundancy_version_1;
-        ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv2          = rel8->redundancy_version_2;
-        ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->TPC          = rel8->tpc;
-        ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->harq_pid     = rel8->harq_process;
-	((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tb_swap      = rel8->transport_block_to_codeword_swap_flag;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tpmi         = rel8->precoding_information;
-        ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->padding      = 0;
-      }
-      break;
-
-    }
-
-    AssertFatal(rel8->harq_process>=8, "Format 2_2A: harq_pid=%d >= 8\n", rel8->harq_process);
-
-
-    // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
-    // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
-    TB0_active = 1;
-    TB1_active = 1;
-
-    if ((rel8->redundancy_version_1 == 1) && (rel8->mcs_1 == 0)) {
-      TB0_active=0;
-    }
-    if ((rel8->redundancy_version_2 == 1) && (rel8->mcs_2 == 0)) {
-      TB1_active=0;
-    }
-#ifdef DEBUG_HARQ
-    printf("RV0 = %d, RV1 = %d. MCS0 = %d, MCS1=%d\n", rel8->redundancy_version_1, rel8->redundancy_version_2, rel8->mcs_1, rel8->mcs_2);
-#endif
-    if (TB0_active && TB1_active && rel8->transport_block_to_codeword_swap_flag==0) {
-      dlsch0->active = 1;
-      dlsch1->active = 1;
-      dlsch0->harq_mask                         |= (1<<rel8->harq_process);
-      dlsch1->harq_mask                         |= (1<<rel8->harq_process);
-      dlsch0_harq = dlsch0->harq_processes[rel8->harq_process];
-      dlsch1_harq = dlsch1->harq_processes[rel8->harq_process];
-      dlsch0_harq->mcs = rel8->mcs_1;
-      dlsch1_harq->mcs = rel8->mcs_2;
-      dlsch0_harq->Qm  = get_Qm(rel8->mcs_1);
-      dlsch1_harq->Qm  = get_Qm(rel8->mcs_2);
-      dlsch0_harq->rvidx = rel8->redundancy_version_1;
-      dlsch1_harq->rvidx = rel8->redundancy_version_2;
-      dlsch0_harq->status = ACTIVE;
-      dlsch1_harq->status = ACTIVE;
-      dlsch0_harq->codeword=0;
-      dlsch1_harq->codeword=1;
-#ifdef DEBUG_HARQ
-      printf("\n ENB: BOTH ACTIVE\n");
-#endif
-    }
-    else if (TB0_active && TB1_active && rel8->transport_block_to_codeword_swap_flag==1) {
-      dlsch0 = eNB->dlsch[UE_id][1];
-      dlsch1 = eNB->dlsch[UE_id][0];
-      dlsch0->active = 1;
-      dlsch1->active = 1;
-
-      dlsch0->harq_mask                         |= (1<<rel8->harq_process);
-      dlsch1->harq_mask                         |= (1<<rel8->harq_process);
-
-      dlsch1_harq = dlsch1->harq_processes[rel8->harq_process];
-      dlsch0_harq->mcs = rel8->mcs_1;
-      dlsch1_harq->mcs = rel8->mcs_2;
-      dlsch0_harq->Qm  = get_Qm(rel8->mcs_1);
-      dlsch1_harq->Qm  = get_Qm(rel8->mcs_2);
-      dlsch0_harq->rvidx = rel8->redundancy_version_1;
-      dlsch1_harq->rvidx = rel8->redundancy_version_2;
-      dlsch0_harq->status = ACTIVE;
-      dlsch1_harq->status = ACTIVE;
-      dlsch0_harq->codeword=1;
-      dlsch1_harq->codeword=0;
-    }
-    else if (TB0_active && (TB1_active==0)) {
-      dlsch0->active = 1;
-      dlsch0->harq_mask                         |= (1<<rel8->harq_process);
-      dlsch0_harq = dlsch0->harq_processes[rel8->harq_process];
-      dlsch0_harq->mcs = rel8->mcs_1;
-      dlsch0_harq->Qm  = get_Qm(rel8->mcs_1);
-      dlsch0_harq->rvidx = rel8->redundancy_version_1;
-      dlsch0_harq->status = ACTIVE;
-      dlsch0_harq->codeword = 0;
-      dlsch1=NULL;
-      dlsch1_harq = NULL;
-#ifdef DEBUG_HARQ
-      printf("\n ENB: TB1 is deactivated, retransmit TB0 transmit in TM6\n");
-#endif
-    }
-    else if ((TB0_active==0) && TB1_active) {
-      dlsch1->active = 1;
-      dlsch1->harq_mask                         |= (1<<rel8->harq_process);
-      dlsch1_harq = dlsch1->harq_processes[rel8->harq_process];
-      dlsch1_harq->mcs = rel8->mcs_2;
-      dlsch1_harq->Qm  = get_Qm(rel8->mcs_2);
-      dlsch1_harq->rvidx = rel8->redundancy_version_2;
-      dlsch1_harq->status = ACTIVE;
-      dlsch1_harq->codeword = 0;
-      dlsch0=NULL;
-      dlsch0_harq = NULL;
-#ifdef DEBUG_HARQ
-      printf("\n ENB: TB0 is deactivated, retransmit TB1 transmit in TM6\n");
-#endif
-    }
-
-    if (dlsch0 != NULL){
-      dlsch0->subframe_tx[subframe] = 1;
-
-      dlsch0->harq_ids[subframe] = rel8->harq_process;
-    }
-
-    if (dlsch1_harq != NULL){
-      dlsch1->harq_ids[subframe] = rel8->harq_process;
-    }
-
-
-    if (dlsch0 != NULL ){
-      conv_rballoc(rel8->resource_allocation_type,
-                   rel8->resource_block_coding,
-                   fp->N_RB_DL,
-                   dlsch0_harq->rb_alloc);
-
-      dlsch0_harq->nb_rb = conv_nprb(rel8->resource_allocation_type, rel8->resource_block_coding, fp->N_RB_DL);
-
-      if (dlsch1 != NULL){
-        dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0];
-        dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
-      }
-    } else if ((dlsch0 == NULL ) && (dlsch1 != NULL )){
-        conv_rballoc(rel8->resource_allocation_type,
-                     rel8->resource_block_coding,
-                     fp->N_RB_DL,
-                     dlsch1_harq->rb_alloc);
-
-        dlsch1_harq->nb_rb = conv_nprb(rel8->resource_allocation_type, rel8->resource_block_coding, fp->N_RB_DL);
-    }
-
-
-    // assume both TBs are active
-    if (dlsch0_harq != NULL)
-      dlsch0_harq->Nl        = 1;
-    if (dlsch1_harq != NULL)
-      dlsch1_harq->Nl        = 1;
-
-
-    // check if either TB is disabled (see 36-213 V11.3 Section )
-
-    if (fp->nb_antenna_ports_eNB == 2) {
-      if ((dlsch0 != NULL) && (dlsch1 != NULL)) {  //two CW active
-
-        dlsch0_harq->dl_power_off = 1;
-        dlsch1_harq->dl_power_off = 1;
-        dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
-        dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
-        switch (rel8->precoding_information) {
-        case 0:
-          dlsch0_harq->mimo_mode   = DUALSTREAM_UNIFORM_PRECODING1;
-          dlsch1_harq->mimo_mode   = DUALSTREAM_UNIFORM_PRECODING1;
-          dlsch0_harq->pmi_alloc   = pmi_extend(fp,0,1);
-          dlsch1_harq->pmi_alloc   = pmi_extend(fp,0,1);
-          break;
-        case 1:
-          dlsch0_harq->mimo_mode   = DUALSTREAM_UNIFORM_PRECODINGj;
-          dlsch1_harq->mimo_mode   = DUALSTREAM_UNIFORM_PRECODINGj;
-          dlsch0_harq->pmi_alloc   = pmi_extend(fp,1,1);
-          dlsch0_harq->pmi_alloc   = pmi_extend(fp,1,1);
-
-          break;
-        case 2: // PUSCH precoding
-          dlsch0_harq->mimo_mode   = DUALSTREAM_PUSCH_PRECODING;
-          dlsch0_harq->pmi_alloc   = DL_pmi_single;
-          dlsch1_harq->mimo_mode   = DUALSTREAM_PUSCH_PRECODING;
-          dlsch1_harq->pmi_alloc   = DL_pmi_single;
-          break;
-        default:
-          break;
-        }
-      } else if ((dlsch0 != NULL) && (dlsch1 == NULL))  { // only CW 0 active
-        dlsch0_harq->dl_power_off = 1;
-        dlsch0_harq->TBS= TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
-        switch (rel8->precoding_information) {
-        case 0 :
-          dlsch0_harq->mimo_mode   = ALAMOUTI;
-          break;
-        case 1:
-          dlsch0_harq->mimo_mode   = UNIFORM_PRECODING11;
-          dlsch0_harq->pmi_alloc   = pmi_extend(fp,0,0);
-          break;
-        case 2:
-          dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1m1;
-          dlsch0_harq->pmi_alloc   = pmi_extend(fp,1,0);
-          break;
-        case 3:
-          dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1j;
-          dlsch0_harq->pmi_alloc   = pmi_extend(fp,2,0);
-          break;
-        case 4:
-          dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1mj;
-          dlsch0_harq->pmi_alloc   = pmi_extend(fp,3,0);
-          break;
-        case 5:
-          dlsch0_harq->mimo_mode   = PUSCH_PRECODING0;
-          dlsch0_harq->pmi_alloc   = DL_pmi_single;
-          break;
-        case 6:
-          dlsch0_harq->mimo_mode   = PUSCH_PRECODING1;
-          dlsch0_harq->pmi_alloc   = DL_pmi_single;
-          break;
-        }
-      } else if ((dlsch0 == NULL) && (dlsch1 != NULL))  {
-          dlsch1_harq->dl_power_off = 1;
-          dlsch1_harq->TBS= TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
-          switch (rel8->precoding_information) {
-          case 0 :
-            dlsch1_harq->mimo_mode   = ALAMOUTI;
-            break;
-          case 1:
-            dlsch1_harq->mimo_mode   = UNIFORM_PRECODING11;
-            dlsch1_harq->pmi_alloc   = pmi_extend(fp,0,0);
-            break;
-          case 2:
-            dlsch1_harq->mimo_mode   = UNIFORM_PRECODING1m1;
-            dlsch1_harq->pmi_alloc   = pmi_extend(fp,1,0);
-            break;
-          case 3:
-            dlsch1_harq->mimo_mode   = UNIFORM_PRECODING1j;
-            dlsch1_harq->pmi_alloc   = pmi_extend(fp,2,0);
-            break;
-          case 4:
-            dlsch1_harq->mimo_mode   = UNIFORM_PRECODING1mj;
-            dlsch1_harq->pmi_alloc   = pmi_extend(fp,3,0);
-            break;
-          case 5:
-            dlsch1_harq->mimo_mode   = PUSCH_PRECODING0;
-            dlsch1_harq->pmi_alloc   = DL_pmi_single;
-            break;
-          case 6:
-            dlsch1_harq->mimo_mode   = PUSCH_PRECODING1;
-            dlsch1_harq->pmi_alloc   = DL_pmi_single;
-            break;
-          }
-        }
-
-    } else if (fp->nb_antenna_ports_eNB == 4) {
-      // fill in later
-    }
-
-    // reset HARQ process if this is the first transmission
-   /* if (dlsch0_harq->round == 0)
-      dlsch0_harq->status = ACTIVE;
-
-    if (dlsch1_harq->round == 0)
-      dlsch1_harq->status = ACTIVE;*/
-    if (dlsch0_harq != NULL)
-      dlsch0->rnti = rel8->rnti;
-    if (dlsch1 != NULL)
-      dlsch1->rnti = rel8->rnti;
-
-    break;
-  }
-
-  if (dlsch0_harq) {
-    dlsch0_harq->frame    = frame;
-    dlsch0_harq->subframe = subframe;
-  }
-  if (dlsch1_harq) {
-    dlsch1_harq->frame    = frame;
-    dlsch1_harq->subframe = subframe;
-  }
-
-#ifdef DEBUG_DCI
-
-  if (dlsch0) {
-    printf("dlsch0 eNB: dlsch0   %p\n",dlsch0);
-    printf("dlsch0 eNB: rnti     %x\n",dlsch0->rnti);
-    printf("dlsch0 eNB: NBRB     %d\n",dlsch0_harq->nb_rb);
-    printf("dlsch0 eNB: rballoc  %x\n",dlsch0_harq->rb_alloc[0]);
-    printf("dlsch0 eNB: harq_pid %d\n",harq_pid);
-    printf("dlsch0 eNB: round    %d\n",dlsch0_harq->round);
-    printf("dlsch0 eNB: rvidx    %d\n",dlsch0_harq->rvidx);
-    printf("dlsch0 eNB: TBS      %d (NPRB %d)\n",dlsch0_harq->TBS,NPRB);
-    printf("dlsch0 eNB: mcs      %d\n",dlsch0_harq->mcs);
-    printf("dlsch0 eNB: tpmi %d\n",rel8->precoding_information);
-    printf("dlsch0 eNB: mimo_mode %d\n",dlsch0_harq->mimo_mode);
-  }
-
-    if (dlsch1) {
-    printf("dlsch1 eNB: dlsch1   %p\n",dlsch1);
-    printf("dlsch1 eNB: rnti     %x\n",dlsch1->rnti);
-    printf("dlsch1 eNB: NBRB     %d\n",dlsch1_harq->nb_rb);
-    printf("dlsch1 eNB: rballoc  %x\n",dlsch1_harq->rb_alloc[0]);
-    printf("dlsch1 eNB: harq_pid %d\n",harq_pid);
-    printf("dlsch1 eNB: round    %d\n",dlsch1_harq->round);
-    printf("dlsch1 eNB: rvidx    %d\n",dlsch1_harq->rvidx);
-    printf("dlsch1 eNB: TBS      %d (NPRB %d)\n",dlsch1_harq->TBS,NPRB);
-    printf("dlsch1 eNB: mcs      %d\n",dlsch1_harq->mcs);
-    printf("dlsch1 eNB: tpmi %d\n",rel8->precoding_information);
-    printf("dlsch1 eNB: mimo_mode %d\n",dlsch1_harq->mimo_mode);
-  }
-
-#endif
-    
-#if T_TRACER
-  if (dlsch0->active)
-    T(T_ENB_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame), T_INT(subframe),
-      T_INT(rel8->rnti), T_INT(rel8->dci_format), T_INT(rel8->harq_process),
-      T_INT(rel8->mcs_1), T_INT(dlsch0_harq->TBS));
-#endif
-
-}
-
-void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,mDCI_ALLOC_t *dci_alloc,nfapi_dl_config_mpdcch_pdu *pdu) {
-
-  LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
-
-  uint8_t *dci_pdu = &dci_alloc->dci_pdu[0];
-  nfapi_dl_config_mpdcch_pdu_rel13_t *rel13 = &pdu->mpdcch_pdu_rel13;
-
-  LTE_eNB_DLSCH_t *dlsch0=NULL;
-  LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL;
-  int UE_id;
-  int subframe = proc->subframe_tx;
-
-  dci_alloc->firstCCE                   = rel13->ecce_index;
-  dci_alloc->L                          = rel13->aggregation_level;
-  dci_alloc->rnti                       = rel13->rnti;
-  dci_alloc->harq_pid                   = rel13->harq_process;
-  dci_alloc->narrowband                  = rel13->mpdcch_narrow_band;
-  dci_alloc->number_of_prb_pairs        = rel13->number_of_prb_pairs;
-  dci_alloc->resource_block_assignment  = rel13->resource_block_assignment;
-  dci_alloc->transmission_type          = rel13->mpdcch_tansmission_type;
-  dci_alloc->start_symbol               = rel13->start_symbol;
-  dci_alloc->ce_mode                    = rel13->ce_mode;
-  dci_alloc->dmrs_scrambling_init       = rel13->drms_scrambling_init;
-  dci_alloc->i0                         = rel13->initial_transmission_sf_io;
-
-  dci_alloc->ra_flag  = 0;
-  if (rel13->rnti_type == 2 ) dci_alloc->ra_flag = 1;
-
-  UE_id = find_dlsch(rel13->rnti,eNB,SEARCH_EXIST_OR_FREE);
-  AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n");
-  AssertFatal(UE_id<NUMBER_OF_UE_MAX,"returned UE_id %d >= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);
-  dlsch0 = eNB->dlsch[UE_id][0];
-  dlsch0_harq                               = dlsch0->harq_processes[rel13->harq_process];
-
-  AssertFatal(fp->frame_type==FDD,"TDD is not supported yet for eMTC\n");
-  AssertFatal(fp->N_RB_DL==25 || fp->N_RB_DL==50 ||fp->N_RB_DL==100,
-	      "eMTC only with N_RB_DL = 25,50,100\n");
-
-  switch (rel13->dci_format) {
-
-  case 10:  // Format 6-1A
-    dci_alloc->format     = format6_1A;
-    dlsch0->active       = 1;
-    switch (fp->N_RB_DL) {
-
-    case 25:
-      dci_alloc->dci_length                     = sizeof_DCI6_1A_5MHz_t; 
-      ((DCI6_1A_5MHz_t *)dci_pdu)->type         = 1;
-      ((DCI6_1A_5MHz_t *)dci_pdu)->hopping      = rel13->frequency_hopping_enabled_flag;
-      ((DCI6_1A_5MHz_t *)dci_pdu)->rballoc      = rel13->resource_block_coding;
-      ((DCI6_1A_5MHz_t *)dci_pdu)->mcs          = rel13->mcs;
-      ((DCI6_1A_5MHz_t *)dci_pdu)->rep          = (rel13->pdsch_reptition_levels-1);
-      ((DCI6_1A_5MHz_t *)dci_pdu)->harq_pid     = rel13->harq_process;
-      ((DCI6_1A_5MHz_t *)dci_pdu)->ndi          = rel13->new_data_indicator;
-      ((DCI6_1A_5MHz_t *)dci_pdu)->rv           = rel13->redundancy_version;
-      ((DCI6_1A_5MHz_t *)dci_pdu)->TPC          = rel13->tpc;
-      ((DCI6_1A_5MHz_t *)dci_pdu)->srs_req      = rel13->srs_request;
-      ((DCI6_1A_5MHz_t *)dci_pdu)->harq_ack_off = rel13->harq_resource_offset;
-      ((DCI6_1A_5MHz_t *)dci_pdu)->dci_rep      = rel13->dci_subframe_repetition_number-1;
-      ((DCI6_1A_5MHz_t *)dci_pdu)->padding      = 0;
-    
-      break;
-    case 50:
-      dci_alloc->dci_length                     = sizeof_DCI6_1A_10MHz_t; 
-      ((DCI6_1A_10MHz_t *)dci_pdu)->type         = 1;
-      ((DCI6_1A_10MHz_t *)dci_pdu)->hopping      = rel13->frequency_hopping_enabled_flag;
-      ((DCI6_1A_10MHz_t *)dci_pdu)->rballoc      = rel13->resource_block_coding;
-      ((DCI6_1A_10MHz_t *)dci_pdu)->mcs          = rel13->mcs;
-      ((DCI6_1A_10MHz_t *)dci_pdu)->rep          = (rel13->pdsch_reptition_levels-1);
-      ((DCI6_1A_10MHz_t *)dci_pdu)->harq_pid     = rel13->harq_process;
-      ((DCI6_1A_10MHz_t *)dci_pdu)->ndi          = rel13->new_data_indicator;
-      ((DCI6_1A_10MHz_t *)dci_pdu)->rv           = rel13->redundancy_version;
-      ((DCI6_1A_10MHz_t *)dci_pdu)->TPC          = rel13->tpc;
-      ((DCI6_1A_10MHz_t *)dci_pdu)->srs_req      = rel13->srs_request;
-      ((DCI6_1A_10MHz_t *)dci_pdu)->harq_ack_off = rel13->harq_resource_offset;
-      ((DCI6_1A_10MHz_t *)dci_pdu)->dci_rep      = rel13->dci_subframe_repetition_number-1;
-      ((DCI6_1A_10MHz_t *)dci_pdu)->padding      = 0;
-      break;
-    case 100:
-      dci_alloc->dci_length                     = sizeof_DCI6_1A_20MHz_t; 
-      ((DCI6_1A_20MHz_t *)dci_pdu)->type         = 1;
-      ((DCI6_1A_20MHz_t *)dci_pdu)->hopping      = rel13->frequency_hopping_enabled_flag;
-      ((DCI6_1A_20MHz_t *)dci_pdu)->rballoc      = rel13->resource_block_coding;
-      ((DCI6_1A_20MHz_t *)dci_pdu)->mcs          = rel13->mcs;
-      ((DCI6_1A_20MHz_t *)dci_pdu)->rep          = (rel13->pdsch_reptition_levels-1);
-      ((DCI6_1A_20MHz_t *)dci_pdu)->harq_pid     = rel13->harq_process;
-      ((DCI6_1A_20MHz_t *)dci_pdu)->ndi          = rel13->new_data_indicator;
-      ((DCI6_1A_20MHz_t *)dci_pdu)->rv           = rel13->redundancy_version;
-      ((DCI6_1A_20MHz_t *)dci_pdu)->TPC          = rel13->tpc;
-      ((DCI6_1A_20MHz_t *)dci_pdu)->srs_req      = rel13->srs_request;
-      ((DCI6_1A_20MHz_t *)dci_pdu)->harq_ack_off = rel13->harq_resource_offset;
-      ((DCI6_1A_20MHz_t *)dci_pdu)->dci_rep      = rel13->dci_subframe_repetition_number-1;
-      ((DCI6_1A_20MHz_t *)dci_pdu)->padding      = 0;
-      break;
-    }
-    break;
-  case 11:  // Format 6-1B
-    dci_alloc->format     = format6_1B;
-    dlsch0->active       = 1;
-    switch (fp->N_RB_DL) {
-
-    case 25:
-      dci_alloc->dci_length                     = sizeof_DCI6_1B_5MHz_t; 
-      ((DCI6_1B_5MHz_t *)dci_pdu)->type         = 1;
-      ((DCI6_1B_5MHz_t *)dci_pdu)->rballoc      = rel13->resource_block_coding;
-      ((DCI6_1B_5MHz_t *)dci_pdu)->mcs          = rel13->mcs;
-      ((DCI6_1B_5MHz_t *)dci_pdu)->rep          = (rel13->pdsch_reptition_levels-1);
-      ((DCI6_1B_5MHz_t *)dci_pdu)->harq_pid     = rel13->harq_process;
-      ((DCI6_1B_5MHz_t *)dci_pdu)->ndi          = rel13->new_data_indicator;
-      ((DCI6_1B_5MHz_t *)dci_pdu)->harq_ack_off = rel13->harq_resource_offset;
-      ((DCI6_1B_5MHz_t *)dci_pdu)->dci_rep      = rel13->dci_subframe_repetition_number-1;
-      ((DCI6_1B_5MHz_t *)dci_pdu)->padding      = 0;
-  
-      break;
-    case 50:
-      dci_alloc->dci_length                      = sizeof_DCI6_1B_10MHz_t; 
-      ((DCI6_1B_10MHz_t *)dci_pdu)->type         = 1;
-      ((DCI6_1B_10MHz_t *)dci_pdu)->rballoc      = rel13->resource_block_coding;
-      ((DCI6_1B_10MHz_t *)dci_pdu)->mcs          = rel13->mcs;
-      ((DCI6_1B_10MHz_t *)dci_pdu)->rep          = (rel13->pdsch_reptition_levels-1);
-      ((DCI6_1B_10MHz_t *)dci_pdu)->harq_pid     = rel13->harq_process;
-      ((DCI6_1B_10MHz_t *)dci_pdu)->ndi          = rel13->new_data_indicator;
-      ((DCI6_1B_10MHz_t *)dci_pdu)->harq_ack_off = rel13->harq_resource_offset;
-      ((DCI6_1B_10MHz_t *)dci_pdu)->dci_rep      = rel13->dci_subframe_repetition_number-1;
-      ((DCI6_1B_10MHz_t *)dci_pdu)->padding      = 0;
-      break;
-    case 100:
-      dci_alloc->dci_length                      = sizeof_DCI6_1B_20MHz_t; 
-      ((DCI6_1B_20MHz_t *)dci_pdu)->type         = 1;
-      ((DCI6_1B_20MHz_t *)dci_pdu)->rballoc      = rel13->resource_block_coding;
-      ((DCI6_1B_20MHz_t *)dci_pdu)->mcs          = rel13->mcs;
-      ((DCI6_1B_20MHz_t *)dci_pdu)->rep          = (rel13->pdsch_reptition_levels-1);
-      ((DCI6_1B_20MHz_t *)dci_pdu)->harq_pid     = rel13->harq_process;
-      ((DCI6_1B_20MHz_t *)dci_pdu)->ndi          = rel13->new_data_indicator;
-      ((DCI6_1B_20MHz_t *)dci_pdu)->harq_ack_off = rel13->harq_resource_offset;
-      ((DCI6_1B_20MHz_t *)dci_pdu)->dci_rep      = rel13->dci_subframe_repetition_number-1;
-      ((DCI6_1B_20MHz_t *)dci_pdu)->padding      = 0;
-      break;
-    }
-  case 12: // Format 6-2
-    dci_alloc->format     = format6_2;
-    dlsch0->active       = 1;
-    switch (fp->N_RB_DL) {
-    case 25:
-      dci_alloc->dci_length                 = sizeof_DCI6_2_5MHz_t; 
-      if (rel13->paging_direct_indication_differentiation_flag==0) {
-	((DCI6_2_di_5MHz_t *)dci_pdu)->type    = 0;
-	((DCI6_2_di_5MHz_t *)dci_pdu)->di_info = rel13->direct_indication;
-	((DCI6_2_di_5MHz_t *)dci_pdu)->padding = 0;
-      }
-      else {
-	((DCI6_2_paging_5MHz_t *)dci_pdu)->type    = 1;
-	((DCI6_2_paging_5MHz_t *)dci_pdu)->rballoc = rel13->resource_block_coding;
-	((DCI6_2_paging_5MHz_t *)dci_pdu)->mcs     = rel13->mcs;
-	((DCI6_2_paging_5MHz_t *)dci_pdu)->rep     = (rel13->pdsch_reptition_levels-1);
-	((DCI6_2_paging_5MHz_t *)dci_pdu)->dci_rep = rel13->dci_subframe_repetition_number-1;
-	((DCI6_2_paging_5MHz_t *)dci_pdu)->padding = 0;
-      }
-
-    break;
-    case 50:
-      dci_alloc->dci_length                 = sizeof_DCI6_2_10MHz_t; 
-      if (rel13->paging_direct_indication_differentiation_flag==0) {
-	((DCI6_2_di_10MHz_t *)dci_pdu)->type    = 0;
-	((DCI6_2_di_10MHz_t *)dci_pdu)->di_info = rel13->direct_indication;
-	((DCI6_2_di_10MHz_t *)dci_pdu)->padding = 0;
-      }
-      else {
-	((DCI6_2_paging_10MHz_t *)dci_pdu)->type    = 1;
-	((DCI6_2_paging_10MHz_t *)dci_pdu)->rballoc = rel13->resource_block_coding;
-	((DCI6_2_paging_10MHz_t *)dci_pdu)->mcs     = rel13->mcs;
-	((DCI6_2_paging_10MHz_t *)dci_pdu)->rep     = (rel13->pdsch_reptition_levels-1);
-	((DCI6_2_paging_10MHz_t *)dci_pdu)->dci_rep = rel13->dci_subframe_repetition_number-1;
-	((DCI6_2_paging_10MHz_t *)dci_pdu)->padding = 0;
-      }
-
-    break;
-    case 100:
-      dci_alloc->dci_length                 = sizeof_DCI6_2_20MHz_t; 
-      if (rel13->paging_direct_indication_differentiation_flag==0) {
-	((DCI6_2_di_20MHz_t *)dci_pdu)->type    = 0;
-	((DCI6_2_di_20MHz_t *)dci_pdu)->di_info = rel13->direct_indication;
-	((DCI6_2_di_20MHz_t *)dci_pdu)->padding = 0;
-      }
-      else {
-	((DCI6_2_paging_20MHz_t *)dci_pdu)->type    = 1;
-	((DCI6_2_paging_20MHz_t *)dci_pdu)->rballoc = rel13->resource_block_coding;
-	((DCI6_2_paging_20MHz_t *)dci_pdu)->mcs     = rel13->mcs;
-	((DCI6_2_paging_20MHz_t *)dci_pdu)->rep     = (rel13->pdsch_reptition_levels-1);
-	((DCI6_2_paging_20MHz_t *)dci_pdu)->dci_rep = rel13->dci_subframe_repetition_number-1;
-	((DCI6_2_paging_20MHz_t *)dci_pdu)->padding = 0;
-      }
-
-      break;
-    }
-  }
-  AssertFatal(rel13->harq_process<8,
-	      "ERROR: Format 6_1A: harq_pid=%d >= 8\n", rel13->harq_process);
-  
-  dlsch0_harq = dlsch0->harq_processes[rel13->harq_process];
-  dlsch0_harq->codeword=0;
-  
-  // printf("DCI: Setting subframe_tx for subframe %d\n",subframe);
-  dlsch0->subframe_tx[subframe] = 1;
-  
-  conv_eMTC_rballoc(rel13->resource_block_coding,
-		    fp->N_RB_DL,
-		    dlsch0_harq->rb_alloc);
-  
-  dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rel13->resource_block_coding&31]; // this is the 6PRB RIV
-  
-  
-  dlsch0_harq->rvidx       = rel13->redundancy_version;
-  
-  dlsch0_harq->Nl          = 1;
-  //    dlsch[0]->layer_index = 0;
-  //  if (beamforming_mode == 0)
-  dlsch0_harq->mimo_mode = (fp->nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI;
-    //else if (beamforming_mode == 7)
-    //  dlsch0_harq->mimo_mode = TM7;
-    //else
-    //LOG_E(PHY,"Invalid beamforming mode %dL\n", beamforming_mode);
-  
-  dlsch0_harq->dl_power_off = 1;
-  
-  dlsch0->active = 1;
-  dlsch0->harq_mask                         |= (1<<rel13->harq_process);  
-  
-  
-  if (dlsch0_harq->round == 0) {
-    dlsch0_harq->status = ACTIVE;
-    //            printf("Setting DLSCH process %d to ACTIVE\n",rel8->harq_process);
-    // MCS and TBS don't change across HARQ rounds
-    dlsch0_harq->mcs         = rel13->mcs;
-    dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
-    
-  }
-  
-  dlsch0->harq_ids[subframe] = rel13->harq_process;
-  
-  
-  
-  dlsch0->rnti = rel13->rnti;
-
-
-
-
-
-
-
-}
-
-void fill_dci0(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
-    DCI_ALLOC_t *dci_alloc,nfapi_hi_dci0_dci_pdu *pdu)
-{
-  LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
-
-  uint32_t cqi_req = pdu->dci_pdu_rel8.cqi_csi_request;
-  uint32_t dai     = pdu->dci_pdu_rel8.dl_assignment_index;
-  uint32_t cshift  = pdu->dci_pdu_rel8.cyclic_shift_2_for_drms;
-  uint32_t TPC     = pdu->dci_pdu_rel8.tpc;
-  uint32_t mcs     = pdu->dci_pdu_rel8.mcs_1;
-  uint32_t hopping = pdu->dci_pdu_rel8.frequency_hopping_enabled_flag;
-  uint32_t rballoc = computeRIV(frame_parms->N_RB_DL,
-				pdu->dci_pdu_rel8.resource_block_start,
-				pdu->dci_pdu_rel8.number_of_resource_block);
-
-  uint32_t ndi     = pdu->dci_pdu_rel8.new_data_indication_1;
-
-#ifdef T_TRACER
-  T(T_ENB_PHY_ULSCH_UE_DCI, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe),
-    T_INT(pdu->dci_pdu_rel8.rnti), T_INT(((frame*10+subframe+4) % 8) /* TODO: correct harq pid */),
-    T_INT(mcs), T_INT(-1 /* TODO: remove round? */),
-    T_INT(pdu->dci_pdu_rel8.resource_block_start),
-    T_INT(pdu->dci_pdu_rel8.number_of_resource_block),
-    T_INT(get_TBS_UL(mcs, pdu->dci_pdu_rel8.number_of_resource_block) * 8),
-    T_INT(pdu->dci_pdu_rel8.aggregation_level),
-    T_INT(pdu->dci_pdu_rel8.cce_index));
-#endif
-
-  void *dci_pdu = (void*)dci_alloc->dci_pdu;
-
-  LOG_D(PHY,"SFN/SF:%04d%d DCI0[rnti %x cqi %d mcs %d hopping %d rballoc %x (%d,%d) ndi %d TPC %d cshift %d]\n",
-        frame,subframe,
-        pdu->dci_pdu_rel8.rnti,cqi_req, mcs,hopping,rballoc,
-        pdu->dci_pdu_rel8.resource_block_start,
-        pdu->dci_pdu_rel8.number_of_resource_block, ndi,TPC,cshift);
-
-  dci_alloc->format   = format0;
-  dci_alloc->firstCCE = pdu->dci_pdu_rel8.cce_index;
-  dci_alloc->L        = pdu->dci_pdu_rel8.aggregation_level;
-  dci_alloc->rnti     = pdu->dci_pdu_rel8.rnti;
-  dci_alloc->ra_flag  = 0;
-
-  switch (frame_parms->N_RB_DL) {
-  case 6:
-    if (frame_parms->frame_type == TDD) {
-      ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->cqi_req = cqi_req;
-      ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->dai     = dai;
-      ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->cshift  = cshift;
-      ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC     = TPC;
-      ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs     = mcs;
-      ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi     = ndi;
-      ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc = rballoc;
-      ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping = hopping;
-      ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->type    = 0;
-      ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->padding = 0;
-      dci_alloc->dci_length                       = sizeof_DCI0_1_5MHz_TDD_1_6_t; 
-    } else {
-      ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cqi_req     = cqi_req;
-      ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cshift      = cshift;
-      ((DCI0_1_5MHz_FDD_t *)dci_pdu)->TPC         = TPC;
-      ((DCI0_1_5MHz_FDD_t *)dci_pdu)->mcs         = mcs;
-      ((DCI0_1_5MHz_FDD_t *)dci_pdu)->ndi         = ndi;
-      ((DCI0_1_5MHz_FDD_t *)dci_pdu)->rballoc     = rballoc;
-      ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping     = hopping;
-      ((DCI0_1_5MHz_FDD_t *)dci_pdu)->type        = 0;
-      ((DCI0_1_5MHz_FDD_t *)dci_pdu)->padding     = 0;
-      dci_alloc->dci_length                       = sizeof_DCI0_1_5MHz_FDD_t; 
-    }
-    
-    break;
-    
-  case 25:
-    if (frame_parms->frame_type == TDD) {
-      ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cqi_req = cqi_req;
-      ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->dai     = dai;
-      ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift  = cshift;
-      ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->TPC     = TPC;
-      ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->mcs     = mcs;
-      ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->ndi     = ndi;
-      ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->rballoc = rballoc;
-      ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->hopping = hopping;
-      ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->type    = 0;
-      ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->padding = 0;
-      dci_alloc->dci_length                     = sizeof_DCI0_5MHz_TDD_1_6_t; 
-    } else {
-      ((DCI0_5MHz_FDD_t *)dci_pdu)->cqi_req     = cqi_req;
-      ((DCI0_5MHz_FDD_t *)dci_pdu)->cshift      = cshift;
-      ((DCI0_5MHz_FDD_t *)dci_pdu)->TPC         = TPC;
-      ((DCI0_5MHz_FDD_t *)dci_pdu)->mcs         = mcs;
-      ((DCI0_5MHz_FDD_t *)dci_pdu)->ndi         = ndi;
-      ((DCI0_5MHz_FDD_t *)dci_pdu)->rballoc     = rballoc;
-      ((DCI0_5MHz_FDD_t *)dci_pdu)->hopping     = hopping;
-      ((DCI0_5MHz_FDD_t *)dci_pdu)->type        = 0;
-      ((DCI0_5MHz_FDD_t *)dci_pdu)->padding     = 0;
-      dci_alloc->dci_length                     = sizeof_DCI0_5MHz_FDD_t; 
-    }
-    
-    break;
-    
-  case 50:
-    if (frame_parms->frame_type == TDD) {
-      ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->cqi_req = cqi_req;
-      ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->dai     = dai;
-      ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->cshift  = cshift;
-      ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->TPC     = TPC;
-      ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->mcs     = mcs;
-      ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->ndi     = ndi;
-      ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->rballoc = rballoc;
-      ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->hopping = hopping;
-      ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->type    = 0;
-      ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->padding = 0;
-      dci_alloc->dci_length                      = sizeof_DCI0_10MHz_TDD_1_6_t; 
-    } else {
-      ((DCI0_10MHz_FDD_t *)dci_pdu)->cqi_req     = cqi_req;
-      ((DCI0_10MHz_FDD_t *)dci_pdu)->cshift      = cshift;
-      ((DCI0_10MHz_FDD_t *)dci_pdu)->TPC         = TPC;
-      ((DCI0_10MHz_FDD_t *)dci_pdu)->mcs         = mcs;
-      ((DCI0_10MHz_FDD_t *)dci_pdu)->ndi         = ndi;
-      ((DCI0_10MHz_FDD_t *)dci_pdu)->rballoc     = rballoc;
-      ((DCI0_10MHz_FDD_t *)dci_pdu)->hopping     = hopping;
-      ((DCI0_10MHz_FDD_t *)dci_pdu)->type        = 0;
-      ((DCI0_10MHz_FDD_t *)dci_pdu)->padding     = 0;
-      dci_alloc->dci_length                      = sizeof_DCI0_10MHz_FDD_t; 
-    }
-    
-    break;
-    
-  case 100:
-    if (frame_parms->frame_type == TDD) {
-      ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->cqi_req = cqi_req;
-      ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->dai     = dai;
-      ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->cshift  = cshift;
-      ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->TPC     = TPC;
-      ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->mcs     = mcs;
-      ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->ndi     = ndi;
-      ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->rballoc = rballoc;
-      ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->hopping = hopping;
-      ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->type    = 0;
-      ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->padding = 0;
-
-      dci_alloc->dci_length                      = sizeof_DCI0_20MHz_TDD_1_6_t; 
-    } else {
-      ((DCI0_20MHz_FDD_t *)dci_pdu)->cqi_req     = cqi_req;
-      ((DCI0_20MHz_FDD_t *)dci_pdu)->cshift      = cshift;
-      ((DCI0_20MHz_FDD_t *)dci_pdu)->TPC         = TPC;
-      ((DCI0_20MHz_FDD_t *)dci_pdu)->mcs         = mcs;
-      ((DCI0_20MHz_FDD_t *)dci_pdu)->ndi         = ndi;
-      ((DCI0_20MHz_FDD_t *)dci_pdu)->rballoc     = rballoc;
-      ((DCI0_20MHz_FDD_t *)dci_pdu)->hopping     = hopping;
-      ((DCI0_20MHz_FDD_t *)dci_pdu)->type        = 0;
-      ((DCI0_20MHz_FDD_t *)dci_pdu)->padding     = 0;
-      dci_alloc->dci_length                      = sizeof_DCI0_20MHz_FDD_t; 
-    }
-    
-      //printf("eNB: rb_alloc (20 MHz dci) %d\n",rballoc);
-      break;
-      
-  default:
-    LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-    DevParam (frame_parms->N_RB_DL, 0, 0);
-    break;
-  }
-}
-
-void fill_ulsch(PHY_VARS_eNB *eNB,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame,int subframe)
-{
-  uint8_t harq_pid;
-  uint8_t UE_id;
-  boolean_t new_ulsch = (find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST)==-1) ? TRUE : FALSE;
-
-  AssertFatal((UE_id=find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0,
-	      "No existing/free UE ULSCH for rnti %x\n",ulsch_pdu->ulsch_pdu_rel8.rnti);
-
-  LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id];
-  LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
-
-  int use_srs = 0;
-
-  harq_pid = ulsch_pdu->ulsch_pdu_rel8.harq_process_number;
-
-  ulsch->harq_mask |= 1 << harq_pid;
-
-  ulsch->harq_processes[harq_pid]->frame                                 = frame;
-  ulsch->harq_processes[harq_pid]->subframe                              = subframe;
-  ulsch->harq_processes[harq_pid]->handled                               = 0;
-
-  ulsch->harq_processes[harq_pid]->first_rb                              = ulsch_pdu->ulsch_pdu_rel8.resource_block_start;
-  ulsch->harq_processes[harq_pid]->nb_rb                                 = ulsch_pdu->ulsch_pdu_rel8.number_of_resource_blocks;
-
-  AssertFatal(ulsch->harq_processes[harq_pid]->nb_rb>0,"nb_rb = 0\n");
-
-  ulsch->harq_processes[harq_pid]->dci_alloc                             = 1;
-  ulsch->harq_processes[harq_pid]->rar_alloc                             = 0;
-  ulsch->harq_processes[harq_pid]->n_DMRS                                = ulsch_pdu->ulsch_pdu_rel8.cyclic_shift_2_for_drms;
-  
-  ulsch->harq_processes[harq_pid]->Nsymb_pusch                           = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1);
-  ulsch->harq_processes[harq_pid]->srs_active                            = use_srs;
-  
-  //Mapping of cyclic shift field in DCI format0 to n_DMRS2 (3GPP 36.211, Table 5.5.2.1.1-1)
-  if(ulsch->harq_processes[harq_pid]->n_DMRS == 0)
-    ulsch->harq_processes[harq_pid]->n_DMRS2 = 0;
-  else if(ulsch->harq_processes[harq_pid]->n_DMRS == 1)
-    ulsch->harq_processes[harq_pid]->n_DMRS2 = 6;
-  else if(ulsch->harq_processes[harq_pid]->n_DMRS == 2)
-    ulsch->harq_processes[harq_pid]->n_DMRS2 = 3;
-  else if(ulsch->harq_processes[harq_pid]->n_DMRS == 3)
-    ulsch->harq_processes[harq_pid]->n_DMRS2 = 4;
-  else if(ulsch->harq_processes[harq_pid]->n_DMRS == 4)
-    ulsch->harq_processes[harq_pid]->n_DMRS2 = 2;
-  else if(ulsch->harq_processes[harq_pid]->n_DMRS == 5)
-    ulsch->harq_processes[harq_pid]->n_DMRS2 = 8;
-  else if(ulsch->harq_processes[harq_pid]->n_DMRS == 6)
-    ulsch->harq_processes[harq_pid]->n_DMRS2 = 10;
-  else if(ulsch->harq_processes[harq_pid]->n_DMRS == 7)
-    ulsch->harq_processes[harq_pid]->n_DMRS2 = 9;
-  
-  LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d, Subframe %d Programming PUSCH with n_DMRS2 %d (cshift %d) ulsch:ndi:%d ulsch_pdu:ndi:%d new_ulsch:%d status:%d ulsch_pdu:rvidx:%d\n",
-	eNB->Mod_id,harq_pid,frame,subframe,
-        ulsch->harq_processes[harq_pid]->n_DMRS2,
-        ulsch->harq_processes[harq_pid]->n_DMRS,
-	ulsch->harq_processes[harq_pid]->ndi, ulsch_pdu->ulsch_pdu_rel8.new_data_indication, new_ulsch, ulsch->harq_processes[harq_pid]->status,
-	ulsch_pdu->ulsch_pdu_rel8.redundancy_version);
-  
-  ulsch->harq_processes[harq_pid]->rvidx = ulsch_pdu->ulsch_pdu_rel8.redundancy_version;
-  ulsch->harq_processes[harq_pid]->Qm    = ulsch_pdu->ulsch_pdu_rel8.modulation_type;
-  // Set O_ACK to 0 by default, will be set of DLSCH is scheduled and needs to be 
-  ulsch->harq_processes[harq_pid]->O_ACK         = 0;
-
-  if ((ulsch->harq_processes[harq_pid]->status == SCH_IDLE) ||
-      (ulsch->harq_processes[harq_pid]->ndi    != ulsch_pdu->ulsch_pdu_rel8.new_data_indication) ||
-	  (new_ulsch == TRUE)){
-    ulsch->harq_processes[harq_pid]->status        = ACTIVE;
-    
-    ulsch->harq_processes[harq_pid]->TBS           = ulsch_pdu->ulsch_pdu_rel8.size<<3;
-    
-    ulsch->harq_processes[harq_pid]->Msc_initial   = 12*ulsch_pdu->ulsch_pdu_rel8.number_of_resource_blocks;
-    ulsch->harq_processes[harq_pid]->Nsymb_initial = ulsch->harq_processes[harq_pid]->Nsymb_pusch;
-    ulsch->harq_processes[harq_pid]->round         = 0;
-    ulsch->harq_processes[harq_pid]->ndi           = ulsch_pdu->ulsch_pdu_rel8.new_data_indication;
-    // note here, the CQI bits need to be kept constant as in initial transmission
-    // set to 0 in initial transmission, and don't touch them during retransmissions
-    // will be set if MAC has activated ULSCH_CQI_RI_PDU or ULSCH_CQI_HARQ_RI_PDU
-    ulsch->harq_processes[harq_pid]->Or1           = 0;
-    ulsch->harq_processes[harq_pid]->Or2           = 0;
-  } 
-  else  ulsch->harq_processes[harq_pid]->round++;
-
-  ulsch->rnti = ulsch_pdu->ulsch_pdu_rel8.rnti;
-  LOG_D(PHY,"Filling ULSCH %x (UE_id %d) (new_ulsch %d) for Frame %d, Subframe %d : harq_pid %d, status %d, handled %d, first_rb %d, nb_rb %d, rvidx %d, Qm %d, TBS %d, round %d \n",
-	ulsch->rnti,
-        UE_id,
-        new_ulsch,
-	frame,
-	subframe,
-	harq_pid,
-	ulsch->harq_processes[harq_pid]->status,
-	ulsch->harq_processes[harq_pid]->handled,
-	ulsch->harq_processes[harq_pid]->first_rb,
-	ulsch->harq_processes[harq_pid]->nb_rb,
-	ulsch->harq_processes[harq_pid]->rvidx,
-	ulsch->harq_processes[harq_pid]->Qm,
-	ulsch->harq_processes[harq_pid]->TBS,
-	ulsch->harq_processes[harq_pid]->round);  
-}
-
-int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
-{
-  switch (dci->format) {
-
-  case format0:   // This is an UL SCH allocation so nothing here, inform MAC
-    if ((frame_parms->frame_type == TDD) &&
-        (frame_parms->tdd_config>0))
-      switch(frame_parms->N_RB_DL) {
-      case 6:
-        LOG_D(PHY,"DCI format0 (TDD, 1.5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai,
-              ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      case 25:
-        LOG_D(PHY,"DCI format0 (TDD1-6, 5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai,
-              ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      case 50:
-        LOG_D(PHY,"DCI format0 (TDD1-6, 10MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai,
-              ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      case 100:
-        LOG_D(PHY,"DCI format0 (TDD1-6, 20MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai,
-              ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      default:
-        LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-      }
-    else if (frame_parms->frame_type == FDD)
-      switch(frame_parms->N_RB_DL) {
-      case 6:
-        LOG_D(PHY,"DCI format0 (FDD, 1.5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      case 25:
-        LOG_D(PHY,"DCI format0 (FDD, 5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      case 50:
-        LOG_D(PHY,"DCI format0 (FDD, 10MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      case 100:
-        LOG_D(PHY,"DCI format0 (FDD, 20MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu[0])[0],
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->hopping,
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->cshift,
-              ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req);
-        break;
-
-      default:
-        LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-      }
-    else
-      LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
-
-    break;
-
-  case format1:
-    if ((frame_parms->frame_type == TDD) &&
-        (frame_parms->tdd_config>0))
-
-      switch(frame_parms->N_RB_DL) {
-      case 6:
-        LOG_D(PHY,"DCI format1 (TDD 1.5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      case 25:
-        LOG_D(PHY,"DCI format1 (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      case 50:
-        LOG_D(PHY,"DCI format1 (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      case 100:
-        LOG_D(PHY,"DCI format1 (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->TPC,
-              ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      default:
-        LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-      }
-    else if (frame_parms->frame_type == FDD) {
-      switch(frame_parms->N_RB_DL) {
-      case 6:
-        LOG_D(PHY,"DCI format1 (FDD, 1.5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      case 25:
-        LOG_D(PHY,"DCI format1 (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      case 50:
-        LOG_D(PHY,"DCI format1 (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      case 100:
-        LOG_D(PHY,"DCI format1 (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n",
-              dci->rnti,
-              ((uint32_t*)&dci->dci_pdu)[0],
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rah,
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs,
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi,
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rv,
-              ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      default:
-        LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-      }
-    }
-
-    else
-      LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
-
-    break;
-
-  case format1A:  // This is DLSCH allocation for control traffic
-    if ((frame_parms->frame_type == TDD) &&
-        (frame_parms->tdd_config>0)) {
-      switch (frame_parms->N_RB_DL) {
-      case 6:
-        LOG_D(PHY,"DCI format1A (TDD1-6, 1_5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
-        LOG_D(PHY,"DAI %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      case 25:
-        LOG_D(PHY,"DCI format1A (TDD1-6, 5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %d (NB_RB %d)\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
-        LOG_D(PHY,"DAI %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      case 50:
-        LOG_D(PHY,"DCI format1A (TDD1-6, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
-        LOG_D(PHY,"DAI %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      case 100:
-        LOG_D(PHY,"DCI format1A (TDD1-6, 20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT100[((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
-        LOG_D(PHY,"DAI %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
-        break;
-
-      default:
-        LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-      }
-
-    } else if (frame_parms->frame_type == FDD) {
-      switch (frame_parms->N_RB_DL) {
-      case 6:
-        LOG_D(PHY,"DCI format1A(FDD, 1.5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      case 25:
-        LOG_D(PHY,"DCI format1A(FDD, 5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      case 50:
-        LOG_D(PHY,"DCI format1A(FDD, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      case 100:
-        LOG_D(PHY,"DCI format1A(FDD, 20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT100[((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
-        break;
-
-      default:
-        LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-      }
-    }
-
-    break;
-
-  case format1C:  // This is DLSCH allocation for control traffic
-    switch (frame_parms->N_RB_DL) {
-    case 6:
-      LOG_D(PHY,"DCI format1C (1.5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-      LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",
-      ((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT6[conv_1C_RIV(((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,6)]);
-      LOG_D(PHY,"MCS %d\n",((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->mcs);
-      break;
-
-    case 25:
-      LOG_D(PHY,"DCI format1C (5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-      LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[conv_1C_RIV(((DCI1C_5MHz_t *)&dci->dci_pdu[0])->rballoc,25)]);
-      LOG_D(PHY,"MCS %d\n",((DCI1C_5MHz_t *)&dci->dci_pdu[0])->mcs);
-      break;
-
-    case 50:
-      LOG_D(PHY,"DCI format1C (10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-      LOG_D(PHY,"Ngap %d\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->Ngap);
-      LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[conv_1C_RIV(((DCI1C_10MHz_t *)&dci->dci_pdu[0])->rballoc,50)]);
-      LOG_D(PHY,"MCS %d\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->mcs);
-      break;
-
-    case 100:
-      LOG_D(PHY,"DCI format1C (20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-      LOG_D(PHY,"Ngap %d\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->Ngap);
-      LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[conv_1C_RIV(((DCI1C_20MHz_t *)&dci->dci_pdu[0])->rballoc,100)]);
-      LOG_D(PHY,"MCS %d\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->mcs);
-      break;
-
-
-    default:
-      LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-        DevParam (frame_parms->N_RB_DL, 0, 0);
-        break;
-    }
-
-
-    break;
-
-  case format2:
-
-    if ((frame_parms->frame_type == TDD) &&
-        (frame_parms->tdd_config>0)) {
-      if (frame_parms->nb_antenna_ports_eNB == 2) {
-        switch(frame_parms->N_RB_DL) {
-        case 6:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tpmi
-               );
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      } else if (frame_parms->nb_antenna_ports_eNB == 4) {
-        switch(frame_parms->N_RB_DL) {
-        case 6:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi
-               );
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
 
-        case 50:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      }
-    } else if (frame_parms->frame_type == FDD) {
-      if (frame_parms->nb_antenna_ports_eNB == 2) {
-        switch(frame_parms->N_RB_DL) {
-        case 6:
-          LOG_D(PHY,"DCI format2 2 antennas (FDD, 1.5 MHz), rnti %x (%x):  rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 25:
-
-          LOG_D(PHY,"DCI format2 2 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, swap %d, TPMI %d, TPC %d\n",
-
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2 2 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2 2 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      } else if (frame_parms->nb_antenna_ports_eNB == 4) {
-        switch(frame_parms->N_RB_DL) {
-
-        case 6:
-          LOG_D(PHY,"DCI format2 4 antennas (FDD, 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2 4 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2 4 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2 4 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      }
-    }
-
-    else
-      LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
-
-    break;
-
-  case format2A:
-
-    if ((frame_parms->frame_type == TDD) &&
-        (frame_parms->tdd_config>0)) {
-      if (frame_parms->nb_antenna_ports_eNB == 2) {
-        switch(frame_parms->N_RB_DL) {
-        case 6:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap
-               );
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      } else if (frame_parms->nb_antenna_ports_eNB == 4) {
-        switch(frame_parms->N_RB_DL) {
-        case 6:
-          LOG_D(PHY,"DCI format2A 4 antennas (TDD 1.5 MHz), rnti %x (%"PRIu64"): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi
-               );
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2A 4 antennas (TDD 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2A 4 antennas (TDD 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2A 4 antennas (TDD 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      }
-    } else if (frame_parms->frame_type == FDD) {
-      if (frame_parms->nb_antenna_ports_eNB == 2) {
-        switch(frame_parms->N_RB_DL) {
-        case 6:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD, 1.5 MHz), rnti %x (%x):  rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
-                dci->rnti,
-                ((uint32_t*)&dci->dci_pdu)[0],
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD, 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2A 2 antennas (FDD, 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      } else if (frame_parms->nb_antenna_ports_eNB == 4) {
-        switch(frame_parms->N_RB_DL) {
-
-        case 6:
-          LOG_D(PHY,"DCI format2A 4 antennas (FDD, 1.5 MHz), rnti %x (%"PRIu64"): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 25:
-          LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 50:
-          LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        case 100:
-          LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
-                dci->rnti,
-                ((uint64_t*)&dci->dci_pdu)[0],
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
-                ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
-          break;
-
-        default:
-          LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
-          DevParam (frame_parms->N_RB_DL, 0, 0);
-          break;
-        }
-      }
-    }
-
-    else
-      LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
-
-    break;
+//#define DEBUG_HARQ
 
-  case format1E_2A_M10PRB:
-
-    LOG_D(PHY,"DCI format1E_2A_M10PRB, rnti %x (%8x): harq_pid %d, rah %d, rb_alloc %x, mcs %d, rv %d, tpmi %d, ndi %d, dl_power_offset %d\n",
-          dci->rnti,
-          ((uint32_t *)&dci->dci_pdu)[0],
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->harq_pid,
-          //((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->tb_swap,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->rah,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->rballoc,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->mcs,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->rv,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->tpmi,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->ndi,
-          ((DCI1E_5MHz_2A_M10PRB_TDD_t *)&dci->dci_pdu[0])->dl_power_off
-         );
 
-    break;
+#include "LAYER2/MAC/mac.h"
 
-  default:
-    LOG_E(PHY,"dci_tools.c: dump_dci, unknown format %d\n",dci->format);
-    return(-1);
-  }
+//#define DEBUG_DCI
 
-  return(0);
-}
+#include "../LTE_TRANSPORT/dci_tools_common_extern.h"
+#include "../LTE_TRANSPORT/transport_proto.h"
+#include "transport_proto_ue.h"
+#include "../LTE_TRANSPORT/transport_common_proto.h"
+#include "SCHED/sched_common.h"
+ 
+extern uint16_t beta_cqi[16];
+extern uint16_t beta_ri[16];
+extern uint16_t beta_ack[16];
 
 void extract_dci1A_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
 {
@@ -6554,7 +2790,7 @@ uint8_t pdcch_alloc2ul_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n)
            (frame_parms->tdd_config == 6) &&
            (n==9)) // tdd_config 6 SF 9
     ul_subframe = ((n+5)%10);
-  else
+  else 
     ul_subframe = ((n+4)%10);
 
   AssertFatal(frame_parms->frame_type == FDD || subframe_select(frame_parms,ul_subframe) == SF_UL,"illegal ul_subframe %d (n %d)\n",ul_subframe,n);
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dci_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/dci_ue.c
index 70b5f735ff..bbe5bbd287 100755
--- a/openair1/PHY/LTE_UE_TRANSPORT/dci_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dci_ue.c
@@ -32,11 +32,13 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "SIMULATION/TOOLS/defs.h" // for taus
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern.h"
+#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
+#include "SCHED_UE/sched_UE.h"
+#include "SIMULATION/TOOLS/sim.h" // for taus
 #include "PHY/sse_intrin.h"
+#include "PHY/LTE_TRANSPORT/transport_extern.h"
 
 #include "assertions.h"
 #include "T.h"
@@ -49,68 +51,7 @@
 
 //#undef ALL_AGGREGATION
 
-//extern uint16_t phich_reg[MAX_NUM_PHICH_GROUPS][3];
-//extern uint16_t pcfich_reg[4];
 
-uint32_t check_phich_reg(LTE_DL_FRAME_PARMS *frame_parms,uint32_t kprime,uint8_t lprime,uint8_t mi)
-{
-
-  uint16_t i;
-  uint16_t Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
-  uint16_t mprime;
-  uint16_t *pcfich_reg = frame_parms->pcfich_reg;
-
-  if ((lprime>0) && (frame_parms->Ncp==0) )
-    return(0);
-
-  //  printf("check_phich_reg : mi %d\n",mi);
-
-  // compute REG based on symbol
-  if ((lprime == 0)||
-      ((lprime==1)&&(frame_parms->nb_antenna_ports_eNB == 4)))
-    mprime = kprime/6;
-  else
-    mprime = kprime>>2;
-
-  // check if PCFICH uses mprime
-  if ((lprime==0) &&
-      ((mprime == pcfich_reg[0]) ||
-       (mprime == pcfich_reg[1]) ||
-       (mprime == pcfich_reg[2]) ||
-       (mprime == pcfich_reg[3]))) {
-#ifdef DEBUG_DCI_ENCODING
-    printf("[PHY] REG %d allocated to PCFICH\n",mprime);
-#endif
-    return(1);
-  }
-
-  // handle Special subframe case for TDD !!!
-
-  //  printf("Checking phich_reg %d\n",mprime);
-  if (mi > 0) {
-    if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
-      Ngroup_PHICH++;
-
-    if (frame_parms->Ncp == 1) {
-      Ngroup_PHICH<<=1;
-    }
-
-
-
-    for (i=0; i<Ngroup_PHICH; i++) {
-      if ((mprime == frame_parms->phich_reg[i][0]) ||
-          (mprime == frame_parms->phich_reg[i][1]) ||
-          (mprime == frame_parms->phich_reg[i][2]))  {
-#ifdef DEBUG_DCI_ENCODING
-        printf("[PHY] REG %d (lprime %d) allocated to PHICH\n",mprime,lprime);
-#endif
-        return(1);
-      }
-    }
-  }
-
-  return(0);
-}
 
 uint16_t extract_crc(uint8_t *dci,uint8_t dci_len)
 {
@@ -163,6 +104,7 @@ void pdcch_demapping(uint16_t *llr,uint16_t *wbar,LTE_DL_FRAME_PARMS *frame_parm
   uint32_t i, lprime;
   uint16_t kprime,kprime_mod12,mprime,symbol_offset,tti_offset,tti_offset0;
   int16_t re_offset,re_offset0;
+  uint32_t Msymb=(DCI_BITS_MAX/2);
 
   // This is the REG allocation algorithm from 36-211, second part of Section 6.8.5
 
@@ -263,12 +205,13 @@ void pdcch_demapping(uint16_t *llr,uint16_t *wbar,LTE_DL_FRAME_PARMS *frame_parm
   } // kprime loop
 }
 
-static uint16_t wtemp_rx[Msymb];
+
 void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t *wbar,uint8_t number_pdcch_symbols,uint8_t mi)
 {
 
   uint16_t *wptr,*zptr,*wptr2;
-
+  uint32_t Msymb=(DCI_BITS_MAX/2);
+  uint16_t wtemp_rx[Msymb];
   uint16_t Mquad=get_nquad(number_pdcch_symbols,frame_parms,mi);
   uint32_t RCC = (Mquad>>5), ND;
   uint32_t row,col,Kpi,index;
@@ -364,56 +307,6 @@ void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t
 }
 
 
-int32_t pdcch_qpsk_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
-                            int32_t **rxdataF_comp,
-                            int32_t **rxdataF_comp_i,
-                            int32_t **rho_i,
-                            int16_t *pdcch_llr16,
-                            int16_t *pdcch_llr8in,
-                            uint8_t symbol)
-{
-
-  int16_t *rxF=(int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
-  int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
-  int16_t *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
-  int16_t *llr128;
-  int32_t i;
-  char *pdcch_llr8;
-  int16_t *pdcch_llr;
-  pdcch_llr8 = (char *)&pdcch_llr8in[symbol*frame_parms->N_RB_DL*12];
-  pdcch_llr = &pdcch_llr16[symbol*frame_parms->N_RB_DL*12];
-
-  //  printf("dlsch_qpsk_qpsk: symbol %d\n",symbol);
-
-  llr128 = (int16_t*)pdcch_llr;
-
-  if (!llr128) {
-    printf("dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol);
-    return -1;
-  }
-
-  qpsk_qpsk(rxF,
-            rxF_i,
-            llr128,
-            rho,
-            frame_parms->N_RB_DL*12);
-
-  //prepare for Viterbi which accepts 8 bit, but prefers 4 bit, soft input.
-  for (i=0; i<(frame_parms->N_RB_DL*24); i++) {
-    if (*pdcch_llr>7)
-      *pdcch_llr8=7;
-    else if (*pdcch_llr<-8)
-      *pdcch_llr8=-8;
-    else
-      *pdcch_llr8 = (char)(*pdcch_llr);
-
-    pdcch_llr++;
-    pdcch_llr8++;
-  }
-
-  return(0);
-}
-
 
 int32_t pdcch_llr(LTE_DL_FRAME_PARMS *frame_parms,
                   int32_t **rxdataF_comp,
@@ -514,120 +407,6 @@ void pdcch_channel_level(int32_t **dl_ch_estimates_ext,
 
 }
 
-#if defined(__x86_64) || defined(__i386__)
-__m128i mmtmpPD0,mmtmpPD1,mmtmpPD2,mmtmpPD3;
-#elif defined(__arm__)
-
-#endif
-void pdcch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
-                                   uint8_t symbol,
-                                   int32_t **dl_ch_estimates_ext,
-                                   int32_t **dl_ch_estimates_ext_i,
-                                   int32_t **dl_ch_rho_ext,
-                                   uint8_t output_shift)
-{
-
-  uint16_t rb;
-#if defined(__x86_64__) || defined(__i386__)
-  __m128i *dl_ch128,*dl_ch128i,*dl_ch_rho128;
-#elif defined(__arm__)
-
-#endif
-  uint8_t aarx;
-
-  //  printf("dlsch_dual_stream_correlation: symbol %d\n",symbol);
-
-
-  for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
-
-#if defined(__x86_64__) || defined(__i386__)
-    dl_ch128          = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
-    dl_ch128i         = (__m128i *)&dl_ch_estimates_ext_i[aarx][symbol*frame_parms->N_RB_DL*12];
-    dl_ch_rho128      = (__m128i *)&dl_ch_rho_ext[aarx][symbol*frame_parms->N_RB_DL*12];
-
-#elif defined(__arm__)
-
-#endif
-
-    for (rb=0; rb<frame_parms->N_RB_DL; rb++) {
-      // multiply by conjugated channel
-#if defined(__x86_64__) || defined(__i386__)
-      mmtmpPD0 = _mm_madd_epi16(dl_ch128[0],dl_ch128i[0]);
-      //  print_ints("re",&mmtmpPD0);
-
-      // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
-      mmtmpPD1 = _mm_shufflelo_epi16(dl_ch128[0],_MM_SHUFFLE(2,3,0,1));
-      mmtmpPD1 = _mm_shufflehi_epi16(mmtmpPD1,_MM_SHUFFLE(2,3,0,1));
-      mmtmpPD1 = _mm_sign_epi16(mmtmpPD1,*(__m128i*)&conjugate[0]);
-      //  print_ints("im",&mmtmpPD1);
-      mmtmpPD1 = _mm_madd_epi16(mmtmpPD1,dl_ch128i[0]);
-      // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
-      mmtmpPD0 = _mm_srai_epi32(mmtmpPD0,output_shift);
-      //  print_ints("re(shift)",&mmtmpPD0);
-      mmtmpPD1 = _mm_srai_epi32(mmtmpPD1,output_shift);
-      //  print_ints("im(shift)",&mmtmpPD1);
-      mmtmpPD2 = _mm_unpacklo_epi32(mmtmpPD0,mmtmpPD1);
-      mmtmpPD3 = _mm_unpackhi_epi32(mmtmpPD0,mmtmpPD1);
-      //        print_ints("c0",&mmtmpPD2);
-      //  print_ints("c1",&mmtmpPD3);
-      dl_ch_rho128[0] = _mm_packs_epi32(mmtmpPD2,mmtmpPD3);
-
-      //print_shorts("rx:",dl_ch128_2);
-      //print_shorts("ch:",dl_ch128);
-      //print_shorts("pack:",rho128);
-
-      // multiply by conjugated channel
-      mmtmpPD0 = _mm_madd_epi16(dl_ch128[1],dl_ch128i[1]);
-      // mmtmpPD0 contains real part of 4 consecutive outputs (32-bit)
-      mmtmpPD1 = _mm_shufflelo_epi16(dl_ch128[1],_MM_SHUFFLE(2,3,0,1));
-      mmtmpPD1 = _mm_shufflehi_epi16(mmtmpPD1,_MM_SHUFFLE(2,3,0,1));
-      mmtmpPD1 = _mm_sign_epi16(mmtmpPD1,*(__m128i*)conjugate);
-      mmtmpPD1 = _mm_madd_epi16(mmtmpPD1,dl_ch128i[1]);
-      // mmtmpPD1 contains imag part of 4 consecutive outputs (32-bit)
-      mmtmpPD0 = _mm_srai_epi32(mmtmpPD0,output_shift);
-      mmtmpPD1 = _mm_srai_epi32(mmtmpPD1,output_shift);
-      mmtmpPD2 = _mm_unpacklo_epi32(mmtmpPD0,mmtmpPD1);
-      mmtmpPD3 = _mm_unpackhi_epi32(mmtmpPD0,mmtmpPD1);
-
-
-      dl_ch_rho128[1] =_mm_packs_epi32(mmtmpPD2,mmtmpPD3);
-      //print_shorts("rx:",dl_ch128_2+1);
-      //print_shorts("ch:",dl_ch128+1);
-      //print_shorts("pack:",rho128+1);
-      // multiply by conjugated channel
-      mmtmpPD0 = _mm_madd_epi16(dl_ch128[2],dl_ch128i[2]);
-      // mmtmpPD0 contains real part of 4 consecutive outputs (32-bit)
-      mmtmpPD1 = _mm_shufflelo_epi16(dl_ch128[2],_MM_SHUFFLE(2,3,0,1));
-      mmtmpPD1 = _mm_shufflehi_epi16(mmtmpPD1,_MM_SHUFFLE(2,3,0,1));
-      mmtmpPD1 = _mm_sign_epi16(mmtmpPD1,*(__m128i*)conjugate);
-      mmtmpPD1 = _mm_madd_epi16(mmtmpPD1,dl_ch128i[2]);
-      // mmtmpPD1 contains imag part of 4 consecutive outputs (32-bit)
-      mmtmpPD0 = _mm_srai_epi32(mmtmpPD0,output_shift);
-      mmtmpPD1 = _mm_srai_epi32(mmtmpPD1,output_shift);
-      mmtmpPD2 = _mm_unpacklo_epi32(mmtmpPD0,mmtmpPD1);
-      mmtmpPD3 = _mm_unpackhi_epi32(mmtmpPD0,mmtmpPD1);
-
-      dl_ch_rho128[2] = _mm_packs_epi32(mmtmpPD2,mmtmpPD3);
-      //print_shorts("rx:",dl_ch128_2+2);
-      //print_shorts("ch:",dl_ch128+2);
-      //print_shorts("pack:",rho128+2);
-
-      dl_ch128+=3;
-      dl_ch128i+=3;
-      dl_ch_rho128+=3;
-
-
-#elif defined(__arm__)
-
-#endif
-     }
-  }
-#if defined(__x86_64__) || defined(__i386__)
-  _mm_empty();
-  _m_empty();
-#endif
-
-}
 
 
 void pdcch_detection_mrc_i(LTE_DL_FRAME_PARMS *frame_parms,
@@ -1196,9 +975,11 @@ void pdcch_channel_compensation(int32_t **rxdataF_ext,
 {
 
   uint16_t rb;
+
 #if defined(__x86_64__) || defined(__i386__)
   __m128i *dl_ch128,*rxdataF128,*rxdataF_comp128;
   __m128i *dl_ch128_2, *rho128;
+  __m128i mmtmpPD0,mmtmpPD1,mmtmpPD2,mmtmpPD3;
 #elif defined(__arm__)
 
 #endif
@@ -1518,9 +1299,6 @@ int32_t rx_pdcch(PHY_VARS_UE *ue,
   LTE_UE_PDCCH **pdcch_vars       = ue->pdcch_vars[ue->current_thread_id[subframe]];
 
   uint8_t log2_maxh,aatx,aarx;
-#ifdef MU_RECEIVER
-  uint8_t eNB_id_i=eNB_id+1;//add 1 to eNB_id to separate from wanted signal, chosen as the B/F'd pilots from the SeNB are shifted by 1
-#endif
   int32_t avgs;
   uint8_t n_pdcch_symbols;
   uint8_t mi = get_mi(frame_parms,subframe);
@@ -1535,15 +1313,6 @@ int32_t rx_pdcch(PHY_VARS_UE *ue,
                                0,
                                high_speed_flag,
                                frame_parms);
-#ifdef MU_RECEIVER
-      pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
-                               common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i - 1],//subtract 1 to eNB_id_i to compensate for the non-shifted pilots from the PeNB
-                               pdcch_vars[eNB_id_i]->rxdataF_ext,//shift by two to simulate transmission from a second antenna
-                               pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,//shift by two to simulate transmission from a second antenna
-                               0,
-                               high_speed_flag,
-                               frame_parms);
-#endif //MU_RECEIVER
     } else if (frame_parms->nb_antenna_ports_eNB>1) {
       pdcch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
                              common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
@@ -1600,50 +1369,10 @@ int32_t rx_pdcch(PHY_VARS_UE *ue,
 
 #endif
 
-#ifdef MU_RECEIVER
-
-  if (is_secondary_ue) {
-      //get MF output for interfering stream
-      pdcch_channel_compensation(pdcch_vars[eNB_id_i]->rxdataF_ext,
-              pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,
-              pdcch_vars[eNB_id_i]->rxdataF_comp,
-              (aatx>1) ? pdcch_vars[eNB_id_i]->rho : NULL,
-                      frame_parms,
-                      0,
-                      log2_maxh); // log2_maxh+I0_shift
-#ifdef DEBUG_PHY
-      write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
-#endif
-      pdcch_dual_stream_correlation(frame_parms,
-              0,
-              pdcch_vars[eNB_id]->dl_ch_estimates_ext,
-              pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,
-              pdcch_vars[eNB_id]->dl_ch_rho_ext,
-              log2_maxh);
-  }
-
-#endif //MU_RECEIVER
-
-
   if (frame_parms->nb_antennas_rx > 1) {
-#ifdef MU_RECEIVER
-
-      if (is_secondary_ue) {
-          pdcch_detection_mrc_i(frame_parms,
-                  pdcch_vars[eNB_id]->rxdataF_comp,
-                  pdcch_vars[eNB_id_i]->rxdataF_comp,
-                  pdcch_vars[eNB_id]->rho,
-                  pdcch_vars[eNB_id]->dl_ch_rho_ext,
-                  0);
-#ifdef DEBUG_PHY
-          write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
-          write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
-#endif
-      } else
-#endif //MU_RECEIVER
-          pdcch_detection_mrc(frame_parms,
-                  pdcch_vars[eNB_id]->rxdataF_comp,
-                  0);
+    pdcch_detection_mrc(frame_parms,
+			pdcch_vars[eNB_id]->rxdataF_comp,
+			0);
   }
 
   if (mimo_mode == SISO)
@@ -1652,38 +1381,6 @@ int32_t rx_pdcch(PHY_VARS_UE *ue,
       pdcch_alamouti(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,0);
 
 
-#ifdef MU_RECEIVER
-
-  if (is_secondary_ue) {
-      pdcch_qpsk_qpsk_llr(frame_parms,
-              pdcch_vars[eNB_id]->rxdataF_comp,
-              pdcch_vars[eNB_id_i]->rxdataF_comp,
-              pdcch_vars[eNB_id]->dl_ch_rho_ext,
-              pdcch_vars[eNB_id]->llr16, //subsequent function require 16 bit llr, but output must be 8 bit (actually clipped to 4, because of the Viterbi decoder)
-              pdcch_vars[eNB_id]->llr,
-              0);
-      /*
-      #ifdef DEBUG_PHY
-      if (subframe==5) {
-      write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
-      write_output("llr16_seq.m","llr16",&pdcch_vars[eNB_id]->llr16[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
-      }
-      #endif*/
-  } else {
-#endif //MU_RECEIVER
-      pdcch_llr(frame_parms,
-              pdcch_vars[eNB_id]->rxdataF_comp,
-              (char *)pdcch_vars[eNB_id]->llr,
-              0);
-      /*#ifdef DEBUG_PHY
-      write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
-      #endif*/
-
-#ifdef MU_RECEIVER
-  }
-
-#endif //MU_RECEIVER
-
 
   // decode pcfich here and find out pdcch ofdm symbol number
   n_pdcch_symbols = rx_pcfich(frame_parms,
@@ -1717,15 +1414,6 @@ int32_t rx_pdcch(PHY_VARS_UE *ue,
                   s,
                   high_speed_flag,
                   frame_parms);
-#ifdef MU_RECEIVER
-pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
-        common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i - 1],//subtract 1 to eNB_id_i to compensate for the non-shifted pilots from the PeNB
-        pdcch_vars[eNB_id_i]->rxdataF_ext,//shift by two to simulate transmission from a second antenna
-        pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,//shift by two to simulate transmission from a second antenna
-        s,
-        high_speed_flag,
-        frame_parms);
-#endif //MU_RECEIVER
       } else if (frame_parms->nb_antenna_ports_eNB>1) {
           pdcch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF,
                   common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id],
@@ -1755,84 +1443,28 @@ pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current
 
 
 #ifdef DEBUG_PHY
-
-if (subframe==5)
-    write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
-
-#endif
-
-#ifdef MU_RECEIVER
-
-if (is_secondary_ue) {
-    //get MF output for interfering stream
-    pdcch_channel_compensation(pdcch_vars[eNB_id_i]->rxdataF_ext,
-            pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,
-            pdcch_vars[eNB_id_i]->rxdataF_comp,
-            (aatx>1) ? pdcch_vars[eNB_id_i]->rho : NULL,
-                    frame_parms,
-                    s,
-                    log2_maxh); // log2_maxh+I0_shift
-#ifdef DEBUG_PHY
-write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
-#endif
-pdcch_dual_stream_correlation(frame_parms,
-        s,
-        pdcch_vars[eNB_id]->dl_ch_estimates_ext,
-        pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,
-        pdcch_vars[eNB_id]->dl_ch_rho_ext,
-        log2_maxh);
-}
-
-#endif //MU_RECEIVER
-
-
-if (frame_parms->nb_antennas_rx > 1) {
-#ifdef MU_RECEIVER
-
-    if (is_secondary_ue) {
-        pdcch_detection_mrc_i(frame_parms,
-                pdcch_vars[eNB_id]->rxdataF_comp,
-                pdcch_vars[eNB_id_i]->rxdataF_comp,
-                pdcch_vars[eNB_id]->rho,
-                pdcch_vars[eNB_id]->dl_ch_rho_ext,
-                s);
-#ifdef DEBUG_PHY
-write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
-write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+      
+      if (subframe==5)
+	write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+      
 #endif
-    } else
-#endif //MU_RECEIVER
+      
+      
+      
+      if (frame_parms->nb_antennas_rx > 1) {
         pdcch_detection_mrc(frame_parms,
-                pdcch_vars[eNB_id]->rxdataF_comp,
-                s);
-
-}
-
-if (mimo_mode == SISO)
-    pdcch_siso(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,s);
-else
-    pdcch_alamouti(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,s);
+			    pdcch_vars[eNB_id]->rxdataF_comp,
+			    s);
+	
+      }
 
+ if (mimo_mode == SISO)
+   pdcch_siso(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,s);
+ else
+   pdcch_alamouti(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,s);
+ 
 
-#ifdef MU_RECEIVER
 
-if (is_secondary_ue) {
-    pdcch_qpsk_qpsk_llr(frame_parms,
-            pdcch_vars[eNB_id]->rxdataF_comp,
-            pdcch_vars[eNB_id_i]->rxdataF_comp,
-            pdcch_vars[eNB_id]->dl_ch_rho_ext,
-            pdcch_vars[eNB_id]->llr16, //subsequent function require 16 bit llr, but output must be 8 bit (actually clipped to 4, because of the Viterbi decoder)
-            pdcch_vars[eNB_id]->llr,
-            s);
-    /*
-        #ifdef DEBUG_PHY
-        if (subframe==5) {
-        write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
-        write_output("llr16_seq.m","llr16",&pdcch_vars[eNB_id]->llr16[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
-        }
-        #endif*/
-} else {
-#endif //MU_RECEIVER
     pdcch_llr(frame_parms,
             pdcch_vars[eNB_id]->rxdataF_comp,
             (char *)pdcch_vars[eNB_id]->llr,
@@ -1841,11 +1473,6 @@ if (is_secondary_ue) {
         write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
         #endif*/
 
-#ifdef MU_RECEIVER
-}
-
-#endif //MU_RECEIVER
-
   }
 
   pdcch_demapping(pdcch_vars[eNB_id]->llr,
@@ -2043,60 +1670,7 @@ void dci_decoding(uint8_t DCI_LENGTH,
 
 static uint8_t dci_decoded_output[RX_NB_TH][(MAX_DCI_SIZE_BITS+64)/8];
 
-uint16_t get_nCCE(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi)
-{
-  return(get_nquad(num_pdcch_symbols,frame_parms,mi)/9);
-}
-
-uint16_t get_nquad(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi)
-{
-
-  uint16_t Nreg=0;
-  uint8_t Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
-
-  if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
-    Ngroup_PHICH++;
 
-  if (frame_parms->Ncp == 1) {
-    Ngroup_PHICH<<=1;
-  }
-
-  Ngroup_PHICH*=mi;
-
-  if ((num_pdcch_symbols>0) && (num_pdcch_symbols<4))
-    switch (frame_parms->N_RB_DL) {
-    case 6:
-      Nreg=12+(num_pdcch_symbols-1)*18;
-      break;
-
-    case 25:
-      Nreg=50+(num_pdcch_symbols-1)*75;
-      break;
-
-    case 50:
-      Nreg=100+(num_pdcch_symbols-1)*150;
-      break;
-
-    case 100:
-      Nreg=200+(num_pdcch_symbols-1)*300;
-      break;
-
-    default:
-      return(0);
-    }
-
-  //   printf("Nreg %d (%d)\n",Nreg,Nreg - 4 - (3*Ngroup_PHICH));
-  return(Nreg - 4 - (3*Ngroup_PHICH));
-}
-
-uint16_t get_nCCE_mac(uint8_t Mod_id,uint8_t CC_id,int num_pdcch_symbols,int subframe)
-{
-
-  // check for eNB only !
-  return(get_nCCE(num_pdcch_symbols,
-		  &RC.eNB[Mod_id][CC_id]->frame_parms,
-		  get_mi(&RC.eNB[Mod_id][CC_id]->frame_parms,subframe)));
-}
 
 
 int get_nCCE_offset_l1(int *CCE_table,
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_decoding.c
index 4020056e6f..a031dad8a7 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_decoding.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_decoding.c
@@ -31,11 +31,11 @@
 */
 
 //#include "defs.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "PHY/CODING/extern.h"
-#include "SCHED/extern.h"
-#include "SIMULATION/TOOLS/defs.h"
+#include "PHY/defs_UE.h"
+#include "PHY/CODING/coding_extern.h"
+#include "SCHED/sched_common_extern.h"
+#include "SIMULATION/TOOLS/sim.h"
+#include "UTIL/LOG/vcd_signal_dumper.h"
 //#define DEBUG_DLSCH_DECODING
 //#define UE_DEBUG_TRACE 1
 
@@ -746,3 +746,183 @@ decoder_if_t tc;
   return(ret);
 }
 
+int dlsch_encoding_SIC(PHY_VARS_UE *ue,
+		       unsigned char *a,
+		       uint8_t num_pdcch_symbols,
+		       LTE_eNB_DLSCH_t *dlsch,
+		       int frame,
+		       uint8_t subframe,
+		       time_stats_t *rm_stats,
+		       time_stats_t *te_stats,
+		       time_stats_t *i_stats)
+{
+  
+  unsigned int G;
+  unsigned int crc=1;
+  unsigned short iind;
+
+  LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+  unsigned char harq_pid = ue->dlsch[subframe&2][0][0]->rnti;
+  unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb;
+  unsigned int A;
+  unsigned char mod_order;
+  unsigned int Kr=0,Kr_bytes,r,r_offset=0;
+  //  unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
+  uint8_t beamforming_mode=0;
+
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN);
+
+  A = dlsch->harq_processes[harq_pid]->TBS; //6228
+  // printf("Encoder: A: %d\n",A);
+  mod_order = dlsch->harq_processes[harq_pid]->Qm;
+
+  if(dlsch->harq_processes[harq_pid]->mimo_mode == TM7)
+    beamforming_mode = 7;
+  else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM8)
+    beamforming_mode = 8;
+  else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM9_10)
+    beamforming_mode = 9;
+  G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,beamforming_mode);
+
+
+  //  if (dlsch->harq_processes[harq_pid]->Ndi == 1) {  // this is a new packet
+  if (dlsch->harq_processes[harq_pid]->round == 0) {  // this is a new packet
+#ifdef DEBUG_DLSCH_CODING
+  printf("SIC encoding thinks this is a new packet \n");
+#endif
+    /*
+    int i;
+    printf("dlsch (tx): \n");
+    for (i=0;i<(A>>3);i++)
+      printf("%02x.",a[i]);
+    printf("\n");
+    */
+    // Add 24-bit crc (polynomial A) to payload
+    crc = crc24a(a,
+                 A)>>8;
+    a[A>>3] = ((uint8_t*)&crc)[2];
+    a[1+(A>>3)] = ((uint8_t*)&crc)[1];
+    a[2+(A>>3)] = ((uint8_t*)&crc)[0];
+    //    printf("CRC %x (A %d)\n",crc,A);
+
+    dlsch->harq_processes[harq_pid]->B = A+24;
+    //    dlsch->harq_processes[harq_pid]->b = a;
+    memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4);
+
+    if (lte_segmentation(dlsch->harq_processes[harq_pid]->b,
+                         dlsch->harq_processes[harq_pid]->c,
+                         dlsch->harq_processes[harq_pid]->B,
+                         &dlsch->harq_processes[harq_pid]->C,
+                         &dlsch->harq_processes[harq_pid]->Cplus,
+                         &dlsch->harq_processes[harq_pid]->Cminus,
+                         &dlsch->harq_processes[harq_pid]->Kplus,
+                         &dlsch->harq_processes[harq_pid]->Kminus,
+                         &dlsch->harq_processes[harq_pid]->F)<0)
+      return(-1);
+
+    for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
+
+      if (r<dlsch->harq_processes[harq_pid]->Cminus)
+        Kr = dlsch->harq_processes[harq_pid]->Kminus;
+      else
+        Kr = dlsch->harq_processes[harq_pid]->Kplus;
+
+      Kr_bytes = Kr>>3;
+
+      // get interleaver index for Turbo code (lookup in Table 5.1.3-3 36-212, V8.6 2009-03, p. 13-14)
+      if (Kr_bytes<=64)
+        iind = (Kr_bytes-5);
+      else if (Kr_bytes <=128)
+        iind = 59 + ((Kr_bytes-64)>>1);
+      else if (Kr_bytes <= 256)
+        iind = 91 + ((Kr_bytes-128)>>2);
+      else if (Kr_bytes <= 768)
+        iind = 123 + ((Kr_bytes-256)>>3);
+      else {
+        printf("dlsch_coding: Illegal codeword size %d!!!\n",Kr_bytes);
+        return(-1);
+      }
+
+
+#ifdef DEBUG_DLSCH_CODING
+      printf("Generating Code Segment %d (%d bits)\n",r,Kr);
+      // generate codewords
+
+      printf("bits_per_codeword (Kr)= %d, A %d\n",Kr,A);
+      printf("N_RB = %d\n",nb_rb);
+      printf("Ncp %d\n",frame_parms->Ncp);
+      printf("mod_order %d\n",mod_order);
+#endif
+
+
+#ifdef DEBUG_DLSCH_CODING
+      printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
+#endif
+      start_meas(te_stats);
+      encoder(dlsch->harq_processes[harq_pid]->c[r],
+              Kr>>3,
+              &dlsch->harq_processes[harq_pid]->d[r][96],
+              (r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
+              f1f2mat_old[iind*2],   // f1 (see 36121-820, page 14)
+              f1f2mat_old[(iind*2)+1]  // f2 (see 36121-820, page 14)
+             );
+      stop_meas(te_stats);
+#ifdef DEBUG_DLSCH_CODING
+
+      if (r==0)
+        write_output("enc_output0.m","enc0",&dlsch->harq_processes[harq_pid]->d[r][96],(3*8*Kr_bytes)+12,1,4);
+
+#endif
+      start_meas(i_stats);
+      dlsch->harq_processes[harq_pid]->RTC[r] =
+        sub_block_interleaving_turbo(4+(Kr_bytes*8),
+                                     &dlsch->harq_processes[harq_pid]->d[r][96],
+                                     dlsch->harq_processes[harq_pid]->w[r]);
+      stop_meas(i_stats);
+    }
+
+  }
+
+  // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
+  // outputs for each code segment, see Section 5.1.5 p.20
+
+  for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
+#ifdef DEBUG_DLSCH_CODING
+    printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n",
+        r,
+        G,
+        Kr*3,
+        mod_order,nb_rb);
+#endif
+
+    start_meas(rm_stats);
+#ifdef DEBUG_DLSCH_CODING
+    printf("rvidx in SIC encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
+#endif
+    r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r],
+                                        G,  //G
+                                        dlsch->harq_processes[harq_pid]->w[r],
+                                        dlsch->harq_processes[harq_pid]->e+r_offset,
+                                        dlsch->harq_processes[harq_pid]->C, // C
+                                        dlsch->Nsoft,                    // Nsoft,
+                                        dlsch->Mdlharq,
+                                        dlsch->Kmimo,
+                                        dlsch->harq_processes[harq_pid]->rvidx,
+                                        dlsch->harq_processes[harq_pid]->Qm,
+                                        dlsch->harq_processes[harq_pid]->Nl,
+                                        r,
+                                        nb_rb);
+    //                                        m);                       // r
+    stop_meas(rm_stats);
+#ifdef DEBUG_DLSCH_CODING
+
+    if (r==dlsch->harq_processes[harq_pid]->C-1)
+      write_output("enc_output.m","enc",dlsch->harq_processes[harq_pid]->e,r_offset,1,4);
+
+#endif
+  }
+
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
+
+  return(0);
+}
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
index 6284f279d8..dabb845a42 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
@@ -29,11 +29,11 @@
  * \note
  * \warning
  */
-//#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "defs.h"
-#include "extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
+#include "SCHED_UE/sched_UE.h"
+#include "transport_ue.h"
+#include "transport_proto_ue.h"
 #include "PHY/sse_intrin.h"
 #include "T.h"
 
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c
index 7682045ae1..525c8db676 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c
@@ -30,11 +30,12 @@
  * \warning
  */
 
-#include "PHY/defs.h"
-#include "PHY/TOOLS/defs.h"
-#include "PHY/extern.h"
-#include "defs.h"
-#include "extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/TOOLS/tools_defs.h"
+#include "PHY/phy_extern_ue.h"
+#include "transport_ue.h"
+#include "PHY/LTE_TRANSPORT/transport_common_proto.h"
+#include "transport_proto_ue.h"
 #include "PHY/sse_intrin.h"
 
 //#define DEBUG_LLR_SIC
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c
index 588adfbc55..81cd18c954 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c
@@ -30,11 +30,10 @@
  * \warning
  */
 
-#include "PHY/defs.h"
-#include "PHY/TOOLS/defs.h"
-#include "PHY/extern.h"
-#include "defs.h"
-#include "extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/TOOLS/tools_defs.h"
+#include "PHY/phy_extern_ue.h"
+#include "transport_ue.h"
 #include "PHY/sse_intrin.h"
 
 int16_t ones256[16] __attribute__ ((aligned(32))) = {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff};
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/drs_modulation.c b/openair1/PHY/LTE_UE_TRANSPORT/drs_modulation.c
index a0bde219b5..96ff82ba16 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/drs_modulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/drs_modulation.c
@@ -29,9 +29,11 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 #include "PHY/sse_intrin.h"
+#include "transport_proto_ue.h"
+
 //#define DEBUG_DRS
 
 int generate_drs_pusch(PHY_VARS_UE *ue,
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_UE_TRANSPORT/initial_sync.c
index 918696968b..277ca90a2e 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/initial_sync.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/initial_sync.c
@@ -30,13 +30,10 @@
 * \warning
 */
 #include "PHY/types.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "SCHED/extern.h"
-#include "defs.h"
-#include "extern.h"
-
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
+#include "SCHED_UE/sched_UE.h"
+#include "transport_ue.h"
 
 #include "common_lib.h"
 extern openair0_config_t openair0_cfg[];
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/pbch_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/pbch_ue.c
index fe2c4e28c8..5f2ad6cf79 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/pbch_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/pbch_ue.c
@@ -29,12 +29,12 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "PHY/CODING/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/CODING/coding_defs.h"
+#include "PHY/CODING/coding_extern.h"
 #include "PHY/CODING/lte_interleaver_inline.h"
-#include "defs.h"
-#include "extern.h"
-#include "PHY/extern.h"
+#include "transport_ue.h"
+#include "PHY/phy_extern_ue.h"
 #include "PHY/sse_intrin.h"
 
 //#define DEBUG_PBCH 1
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/pcfich_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/pcfich_ue.c
index 7176337408..cd63f0483b 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/pcfich_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/pcfich_ue.c
@@ -29,48 +29,12 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
+#include "PHY/defs_UE.h"
 
 //#define DEBUG_PCFICH
 
-void generate_pcfich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
-{
-
-  uint16_t kbar = 6 * (frame_parms->Nid_cell %(2*frame_parms->N_RB_DL));
-  uint16_t first_reg;
-  uint16_t *pcfich_reg = frame_parms->pcfich_reg;
-
-  pcfich_reg[0] = kbar/6;
-  first_reg = pcfich_reg[0];
-
-  frame_parms->pcfich_first_reg_idx=0;
-
-  pcfich_reg[1] = ((kbar + (frame_parms->N_RB_DL>>1)*6)%(frame_parms->N_RB_DL*12))/6;
-
-  if (pcfich_reg[1] < pcfich_reg[0]) {
-    frame_parms->pcfich_first_reg_idx = 1;
-    first_reg = pcfich_reg[1];
-  }
+extern uint8_t pcfich_b[4][32];
 
-  pcfich_reg[2] = ((kbar + (frame_parms->N_RB_DL)*6)%(frame_parms->N_RB_DL*12))/6;
-
-  if (pcfich_reg[2] < first_reg) {
-    frame_parms->pcfich_first_reg_idx = 2;
-    first_reg = pcfich_reg[2];
-  }
-
-  pcfich_reg[3] = ((kbar + ((3*frame_parms->N_RB_DL)>>1)*6)%(frame_parms->N_RB_DL*12))/6;
-
-  if (pcfich_reg[3] < first_reg) {
-    frame_parms->pcfich_first_reg_idx = 3;
-    first_reg = pcfich_reg[3];
-  }
-
-
-  //#ifdef DEBUG_PCFICH
-  printf("pcfich_reg : %d,%d,%d,%d\n",pcfich_reg[0],pcfich_reg[1],pcfich_reg[2],pcfich_reg[3]);
-  //#endif
-}
 
 
 
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/pch_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/pch_ue.c
index 600c5215bd..aed3ddabc1 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/pch_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/pch_ue.c
@@ -19,8 +19,8 @@
  *      contact@openairinterface.org
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 #include "assertions.h"
 
 const unsigned int Ttab[4] = {32,64,128,256};
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/phich_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/phich_ue.c
index 671f158a03..22d1031960 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/phich_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/phich_ue.c
@@ -19,8 +19,8 @@
  *      contact@openairinterface.org
  */
 
-/*! \file PHY/LTE_TRANSPORT/phich.c
-* \brief Top-level routines for generating and decoding  the PHICH/HI physical/transport channel V8.6 2009-03
+/*! \file PHY/LTE_TRANSPORT/phich_ue.c
+* \brief Top-level routines for decoding  the PHICH/HI physical/transport channel V8.6 2009-03
 * \author R. Knopp
 * \date 2011
 * \version 0.1
@@ -30,13 +30,13 @@
 * \warning
 */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "defs.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
+#include "SCHED_UE/sched_UE.h"
+#include "transport_ue.h"
 
-#include "LAYER2/MAC/extern.h"
-#include "LAYER2/MAC/defs.h"
+
+#include "LAYER2/MAC/mac.h"
 
 #include "T.h"
 
@@ -50,354 +50,9 @@
 
 uint8_t rv_table[4] = {0, 2, 3, 1};
 
-uint8_t get_mi(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
-{
-
-  // for FDD
-  if (frame_parms->frame_type == FDD)
-    return 1;
-
-  // for TDD
-  switch (frame_parms->tdd_config) {
-
-  case 0:
-    if ((subframe==0) || (subframe==5))
-      return(2);
-    else return(1);
-
-    break;
-
-  case 1:
-    if ((subframe==0) || (subframe==5))
-      return(0);
-    else return(1);
-
-    break;
-
-  case 2:
-    if ((subframe==3) || (subframe==8))
-      return(1);
-    else return(0);
-
-    break;
-
-  case 3:
-    if ((subframe==0) || (subframe==8) || (subframe==9))
-      return(1);
-    else return(0);
-
-    break;
-
-  case 4:
-    if ((subframe==8) || (subframe==9))
-      return(1);
-    else return(0);
-
-    break;
-
-  case 5:
-    if (subframe==8)
-      return(1);
-    else return(0);
-
-    break;
-
-  case 6:
-    return(1);
-    break;
-
-  default:
-    return(0);
-  }
-}
-
-unsigned char subframe2_ul_harq(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe)
-{
-
-  if (frame_parms->frame_type == FDD)
-    return(subframe&7);
-
-  switch (frame_parms->tdd_config) {
-  case 3:
-    if ( (subframe == 8) || (subframe == 9) ) {
-      return(subframe-8);
-    } else if (subframe==0)
-      return(2);
-    else {
-      LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      return(0);
-    }
-
-    break;
-
-  case 4:
-     if ( (subframe == 8) || (subframe == 9) ) {
-       return(subframe-8);
-     } else {
-       LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n",
-             subframe,frame_parms->tdd_config);
-       return(0);
-     }
-
-     break;
-
-  }
-
-  return(0);
-}
-
-int phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms, int frame, int subframe)
-{
-  int pusch_frame;
-
-  if (frame_parms->frame_type == FDD) {
-    pusch_frame = subframe<4 ? frame + 1024 - 1 : frame;
-  } else {
-    // Note this is not true, but it doesn't matter, the frame number is irrelevant for TDD!
-    pusch_frame = (frame);
-  }
-
-  //LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n", frame, subframe, pusch_frame);
-  return pusch_frame % 1024;
-}
-
-uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
-{
-  uint8_t pusch_subframe = 255;
-
-  if (frame_parms->frame_type == FDD)
-    return subframe < 4 ? subframe + 6 : subframe - 4;
-
-  switch (frame_parms->tdd_config) {
-  case 0:
-    if (subframe == 0)
-      pusch_subframe = (3);
-    else if (subframe == 5) {
-      pusch_subframe = (8);
-    } else if (subframe == 6)
-      pusch_subframe = (2);
-    else if (subframe == 1)
-      pusch_subframe = (7);
-    else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-		  subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  case 1:
-    if (subframe == 6)
-      pusch_subframe = (2);
-    else if (subframe == 9)
-      pusch_subframe = (3);
-    else if (subframe == 1)
-      pusch_subframe = (7);
-    else if (subframe == 4)
-      pusch_subframe = (8);
-    else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  case 2:
-    if (subframe == 8)
-      pusch_subframe = (2);
-    else if (subframe == 3)
-      pusch_subframe = (7);
-    else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  case 3:
-    if ( (subframe == 8) || (subframe == 9) ) {
-      pusch_subframe = (subframe-6);
-    } else if (subframe==0)
-      pusch_subframe = (4);
-    else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  case 4:
-    if ( (subframe == 8) || (subframe == 9) ) {
-      pusch_subframe = (subframe-6);
-    } else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  case 5:
-    if (subframe == 8) {
-      pusch_subframe = (2);
-    } else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  case 6:
-    if (subframe == 6) {
-      pusch_subframe = (2);
-    } else if (subframe == 9) {
-      pusch_subframe = (3);
-    } else if (subframe == 0) {
-      pusch_subframe = (4);
-    } else if (subframe == 1) {
-      pusch_subframe = (7);
-    } else if (subframe == 5) {
-      pusch_subframe = (8);
-    } else {
-      AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
-            subframe,frame_parms->tdd_config);
-      pusch_subframe = (0);
-    }
-
-    break;
-
-  default:
-    AssertFatal(1==0, "no implementation for TDD UL/DL-config = %d!\n", frame_parms->tdd_config);
-    pusch_subframe = (0);
-  }
-
-  LOG_D(PHY, "subframe  %d: PUSCH subframe = %d\n", subframe, pusch_subframe);
-  return pusch_subframe;
-}
-
-int check_pcfich(LTE_DL_FRAME_PARMS *frame_parms,uint16_t reg)
-{
-
-  if ((reg == frame_parms->pcfich_reg[0]) ||
-      (reg == frame_parms->pcfich_reg[1]) ||
-      (reg == frame_parms->pcfich_reg[2]) ||
-      (reg == frame_parms->pcfich_reg[3]))
-    return(1);
-
-  return(0);
-}
-
-void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
-{
-
-  unsigned short n0 = (frame_parms->N_RB_DL * 2) - 4;  // 2 REG per RB less the 4 used by PCFICH in first symbol
-  unsigned short n1 = (frame_parms->N_RB_DL * 3);      // 3 REG per RB in second and third symbol
-  unsigned short n2 = n1;
-  unsigned short mprime = 0;
-  unsigned short Ngroup_PHICH;
-  //  uint16_t *phich_reg = frame_parms->phich_reg;
-  uint16_t *pcfich_reg = frame_parms->pcfich_reg;
-
-  // compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211
-  Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
-
-
-  if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
-    Ngroup_PHICH++;
-
-  // check if Extended prefix
-  if (frame_parms->Ncp == 1) {
-    Ngroup_PHICH<<=1;
-  }
-
-#ifdef DEBUG_PHICH
-  LOG_D(PHY,"Ngroup_PHICH %d (phich_config_common.phich_resource %d,phich_config_common.phich_duration %s, NidCell %d,Ncp %d, frame_type %d), smallest pcfich REG %d, n0 %d, n1 %d (first PHICH REG %d)\n",
-    ((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1)),
-    frame_parms->phich_config_common.phich_resource,
-    frame_parms->phich_config_common.phich_duration==normal?"normal":"extended",
-    frame_parms->Nid_cell,frame_parms->Ncp,frame_parms->frame_type,
-    pcfich_reg[frame_parms->pcfich_first_reg_idx],
-    n0,
-    n1,
-    ((frame_parms->Nid_cell))%n0);
-#endif
-
-  // This is the algorithm from Section 6.9.3 in 36-211, it works only for normal PHICH duration for now ...
-
-  for (mprime=0; 
-       mprime<((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1)); 
-       mprime++) {
-
-    if (frame_parms->phich_config_common.phich_duration==normal) { // normal PHICH duration
 
-      frame_parms->phich_reg[mprime][0] = (frame_parms->Nid_cell + mprime)%n0;
 
-      if (frame_parms->phich_reg[mprime][0]>=pcfich_reg[frame_parms->pcfich_first_reg_idx])
-        frame_parms->phich_reg[mprime][0]++;
 
-      if (frame_parms->phich_reg[mprime][0]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+1)&3])
-        frame_parms->phich_reg[mprime][0]++;
-
-      if (frame_parms->phich_reg[mprime][0]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+2)&3])
-        frame_parms->phich_reg[mprime][0]++;
-
-      if (frame_parms->phich_reg[mprime][0]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3])
-        frame_parms->phich_reg[mprime][0]++;
-
-      frame_parms->phich_reg[mprime][1] = (frame_parms->Nid_cell + mprime + (n0/3))%n0;
-
-      
-      if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[frame_parms->pcfich_first_reg_idx])
-        frame_parms->phich_reg[mprime][1]++;
-      
-      if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+1)&3])
-        frame_parms->phich_reg[mprime][1]++;
-
-      if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+2)&3])
-        frame_parms->phich_reg[mprime][1]++;
-
-      if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3])
-        frame_parms->phich_reg[mprime][1]++;
-      
-
-      frame_parms->phich_reg[mprime][2] = (frame_parms->Nid_cell + mprime + (2*n0/3))%n0;
-      
-      if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[frame_parms->pcfich_first_reg_idx])
-        frame_parms->phich_reg[mprime][2]++;
-
-      if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+1)&3])
-        frame_parms->phich_reg[mprime][2]++;
-
-      if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+2)&3])
-        frame_parms->phich_reg[mprime][2]++;
-
-      if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3])
-        frame_parms->phich_reg[mprime][2]++;
-      
-#ifdef DEBUG_PHICH
-      printf("phich_reg :%d => %d,%d,%d\n",mprime,frame_parms->phich_reg[mprime][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]);
-#endif
-    } else { // extended PHICH duration
-      frame_parms->phich_reg[mprime<<1][0] = (frame_parms->Nid_cell + mprime)%n0;
-      frame_parms->phich_reg[1+(mprime<<1)][0] = (frame_parms->Nid_cell + mprime)%n0;
-
-      frame_parms->phich_reg[mprime<<1][1] = ((frame_parms->Nid_cell*n1/n0) + mprime + (n1/3))%n1;
-      frame_parms->phich_reg[mprime<<1][2] = ((frame_parms->Nid_cell*n2/n0) + mprime + (2*n2/3))%n2;
-
-      frame_parms->phich_reg[1+(mprime<<1)][1] = ((frame_parms->Nid_cell*n1/n0) + mprime + (n1/3))%n1;
-      frame_parms->phich_reg[1+(mprime<<1)][2] = ((frame_parms->Nid_cell*n2/n0) + mprime + (2*n2/3))%n2;
-      //#ifdef DEBUG_PHICH
-      printf("phich_reg :%d => %d,%d,%d\n",mprime<<1,frame_parms->phich_reg[mprime<<1][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]);
-      printf("phich_reg :%d => %d,%d,%d\n",1+(mprime<<1),frame_parms->phich_reg[1+(mprime<<1)][0],frame_parms->phich_reg[1+(mprime<<1)][1],frame_parms->phich_reg[1+(mprime<<1)][2]);
-      //#endif
-    }
-  } // mprime loop
-}  // num_pdcch_symbols loop
 
 
 // This routine demodulates the PHICH and updates PUSCH/ULSCH parameters
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c
index ad93e18bb9..1efa09ff9d 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c
@@ -19,9 +19,10 @@
  *      contact@openairinterface.org
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 #include "PHY/sse_intrin.h"
+#include "PHY/LTE_TRANSPORT/transport_common.h"
 
 // Mask for identifying subframe for MBMS
 #define MBSFN_TDD_SF3 0x80// for TDD
@@ -30,8 +31,6 @@
 #define MBSFN_TDD_SF8 0x10
 #define MBSFN_TDD_SF9 0x08
 
-#include "PHY/defs.h"
-
 #define MBSFN_FDD_SF1 0x80// for FDD
 #define MBSFN_FDD_SF2 0x40
 #define MBSFN_FDD_SF3 0x20
@@ -88,101 +87,6 @@ void dump_mch(PHY_VARS_UE *ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,in
                  ue->frame_parms.samples_per_tti,1,1);*/
 }
 
-int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parms)
-{
-
-  uint32_t period;
-  uint8_t i;
-
-  //  LOG_D(PHY,"is_pmch_subframe: frame %d, subframe %d, num_MBSFN_config %d\n",
-  //  frame,subframe,frame_parms->num_MBSFN_config);
-
-  for (i=0; i<frame_parms->num_MBSFN_config; i++) {  // we have at least one MBSFN configuration
-    period = 1<<frame_parms->MBSFN_config[i].radioframeAllocationPeriod;
-
-    if ((frame % period) == frame_parms->MBSFN_config[i].radioframeAllocationOffset) {
-      if (frame_parms->MBSFN_config[i].fourFrames_flag == 0) {
-        if (frame_parms->frame_type == FDD) {
-          switch (subframe) {
-
-          case 1:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_FDD_SF1) > 0)
-              return(1);
-
-            break;
-
-          case 2:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_FDD_SF2) > 0)
-              return(1);
-
-            break;
-
-          case 3:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_FDD_SF3) > 0)
-              return(1);
-
-            break;
-
-          case 6:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_FDD_SF6) > 0)
-              return(1);
-
-            break;
-
-          case 7:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_FDD_SF7) > 0)
-              return(1);
-
-            break;
-
-          case 8:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_FDD_SF8) > 0)
-              return(1);
-
-            break;
-          }
-        } else  {
-          switch (subframe) {
-          case 3:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_TDD_SF3) > 0)
-              return(1);
-
-            break;
-
-          case 4:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_TDD_SF4) > 0)
-              return(1);
-
-            break;
-
-          case 7:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_TDD_SF7) > 0)
-              return(1);
-
-            break;
-
-          case 8:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_TDD_SF8) > 0)
-              return(1);
-
-            break;
-
-          case 9:
-            if ((frame_parms->MBSFN_config[i].mbsfn_SubframeConfig & MBSFN_TDD_SF9) > 0)
-              return(1);
-
-            break;
-          }
-        }
-
-      } else { // handle 4 frames case
-
-      }
-    }
-  }
-
-  return(0);
-}
 
 void fill_UE_dlsch_MCH(PHY_VARS_UE *ue,int mcs,int ndi,int rvidx,int eNB_id)
 {
@@ -458,7 +362,7 @@ void mch_channel_compensation(int **rxdataF_ext,
       mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
       mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]);
       // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
-      mmtmpD0 = _mpm_srai_epi32(mmtmpD0,output_shift);
+      mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
       mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
       mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
       mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/power_control_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/power_control_ue.c
deleted file mode 100644
index 36b2bfbeab..0000000000
--- a/openair1/PHY/LTE_UE_TRANSPORT/power_control_ue.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1  (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- *      contact@openairinterface.org
- */
-
-#include "PHY/defs.h"
-#include "PHY/impl_defs_lte.h"
-
-//#define DEBUG_PC 0
-/*
-double ratioPB[2][4]={{ 1.0,4.0/5.0,3.0/5.0,2.0/5.0},
-          { 5.0/4.0,1.0,3.0/4.0,1.0/2.0}};
-*/
-
-double ratioPB[2][4]={{ 0.00000,  -0.96910,  -2.21849,  -3.97940}, //in db
-                      { 0.96910,   0.00000,  -1.24939,  -3.01030}};
-
-double pa_values[8]={-6.0,-4.77,-3.0,-1.77,0.0,1.0,2.0,3.0}; //reported by higher layers
-
-double get_pa_dB(uint8_t pa)
-{
-  AssertFatal(pa<8,"pa %d is not in (0...7)\n",pa);
-
-  return(pa_values[pa]);
-
-}
-
-double computeRhoA_eNB(uint8_t pa,
-                       LTE_eNB_DLSCH_t *dlsch_eNB, int dl_power_off, uint8_t n_antenna_port){
-  double rho_a_dB;
-  double sqrt_rho_a_lin;
-
-  rho_a_dB = get_pa_dB(pa);
-
-  if(!dl_power_off) //if dl_power_offset is 0, this is for MU-interference, TM5
-    rho_a_dB-=10*log10(2);
-
-  if(n_antenna_port==4) // see TS 36.213 Section 5.2
-    rho_a_dB+=10*log10(2);
-
-  sqrt_rho_a_lin= pow(10,(0.05*rho_a_dB));
-
-  dlsch_eNB->sqrt_rho_a= (short) (sqrt_rho_a_lin*pow(2,13));
-
-#if DEBUG_PC
-  printf("eNB: p_a=%d, value=%f, sqrt_rho_a=%d\n",p_a,pa_values[ pdsch_config_dedicated->p_a],dlsch_eNB->sqrt_rho_a);
-#endif
-
-  return(rho_a_dB);
-}
-
-double computeRhoB_eNB(uint8_t pa,
-                       uint8_t pb,
-                       uint8_t n_antenna_port,
-                       LTE_eNB_DLSCH_t *dlsch_eNB,
-                       int dl_power_off)
-{
-
-  double rho_a_dB, rho_b_dB;
-  double sqrt_rho_b_lin;
-
-  AssertFatal(pa<8,"pa %d is not in (0...7)\n",pa);
-  AssertFatal(pb<4,"pb %d is not in (0...3)\n",pb);
-  rho_a_dB= computeRhoA_eNB(pa,dlsch_eNB,dl_power_off, n_antenna_port);
-
-  if(n_antenna_port>1)
-    rho_b_dB= ratioPB[1][pb] + rho_a_dB;
-  else
-    rho_b_dB= ratioPB[0][pb] + rho_a_dB;
-
-  sqrt_rho_b_lin= pow(10,(0.05*rho_b_dB));
-
-  dlsch_eNB->sqrt_rho_b= (short) (sqrt_rho_b_lin*pow(2,13));
-
-#ifdef DEBUG_PC
-  printf("eNB: n_ant=%d, p_b=%d -> rho_b/rho_a=%f -> sqrt_rho_b=%d\n",n_antenna_port,pb,ratioPB[1][pb],dlsch_eNB->sqrt_rho_b);
-#endif
-  return(rho_b_dB);
-}
-
-
-double computeRhoA_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
-                      LTE_UE_DLSCH_t *dlsch_ue,
-                      unsigned char dl_power_off,
-                      uint8_t n_antenna_port
-                    ){
-
-  double rho_a_dB;
-  double sqrt_rho_a_lin;
-
-  rho_a_dB = get_pa_dB(pdsch_config_dedicated->p_a);
-
-  if(!dl_power_off)
-    rho_a_dB-=10*log10(2);
-  //if dl_power_offset is 0, this is for MU-interference, TM5. But in practice UE may assume 16 or 64QAM TM4 as multiuser
-
-   if(n_antenna_port==4) // see TS 36.213 Section 5.2
-    rho_a_dB=+10*log10(2);
-
-  sqrt_rho_a_lin= pow(10,(0.05*rho_a_dB));
-
-  dlsch_ue->sqrt_rho_a= (short) (sqrt_rho_a_lin*pow(2,13));
-
-#ifdef DEBUG_PC
-  printf("UE: p_a=%d, value=%f, dl_power_off=%d, sqrt_rho_a=%d\n",pdsch_config_dedicated->p_a,pa_values[ pdsch_config_dedicated->p_a],dl_power_off,dlsch_ue->sqrt_rho_a);
-#endif
-
-  return(rho_a_dB);
-}
-
-double computeRhoB_UE(PDSCH_CONFIG_DEDICATED  *pdsch_config_dedicated,
-                      PDSCH_CONFIG_COMMON *pdsch_config_common,
-                      uint8_t n_antenna_port,
-                      LTE_UE_DLSCH_t *dlsch_ue,
-                      unsigned char dl_power_off)
-{
-
-  double rho_a_dB, rho_b_dB;
-  double sqrt_rho_b_lin;
-
-  rho_a_dB= computeRhoA_UE(pdsch_config_dedicated,dlsch_ue,dl_power_off, n_antenna_port);
-
-  if(n_antenna_port>1)
-    rho_b_dB= ratioPB[1][pdsch_config_common->p_b] + rho_a_dB;
-  else
-    rho_b_dB= ratioPB[0][pdsch_config_common->p_b] + rho_a_dB;
-
-  sqrt_rho_b_lin= pow(10,(0.05*rho_b_dB));
-
-  dlsch_ue->sqrt_rho_b= (short) (sqrt_rho_b_lin*pow(2,13));
-
-#ifdef DEBUG_PC
-  printf("UE: p_b=%d, n_ant=%d -> ratio=%f -> sqrt_rho_b=%d\n",pdsch_config_common->p_b, n_antenna_port,ratioPB[1][pdsch_config_common->p_b],dlsch_ue->sqrt_rho_b);
-#endif
-  return(rho_b_dB);
-}
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/prach_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/prach_ue.c
index ea9074766f..9a26c5e44a 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/prach_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/prach_ue.c
@@ -30,15 +30,16 @@
  * \warning
  */
 #include "PHY/sse_intrin.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 //#include "prach.h"
 #include "PHY/LTE_TRANSPORT/if4_tools.h"
-#include "SCHED/defs.h"
-#include "SCHED/extern.h"
+
+#include "SCHED_UE/sched_UE.h"
+#include "SCHED/sched_common_extern.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
-#include "../LTE_TRANSPORT/prach_common.c"
+#include "../LTE_TRANSPORT/prach_extern.h"
 
 int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint16_t Nf )
 {
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/pucch_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/pucch_ue.c
index 2d022ccbab..a762bb047b 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/pucch_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/pucch_ue.c
@@ -29,16 +29,15 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "PHY/extern.h" 
-#include "LAYER2/MAC/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h" 
 
 #include "UTIL/LOG/log.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
 #include "T.h"
 
-#include "pucch_common.c"
+#include "../LTE_TRANSPORT/pucch_extern.h"
 
 
 
@@ -333,41 +332,7 @@ void generate_pucch1x(int32_t **txdataF,
 
 }
 
-void generate_pucch_emul(PHY_VARS_UE *ue,
-			 UE_rxtx_proc_t *proc,
-                         PUCCH_FMT_t format,
-                         uint8_t ncs1,
-                         uint8_t *pucch_payload,
-                         uint8_t sr)
 
-{
-
-  int subframe = proc->subframe_tx;
-
-  UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_flag    = format;
-  UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_Ncs1    = ncs1;
-
-
-  UE_transport_info[ue->Mod_id][ue->CC_id].cntl.sr            = sr;
-  // the value of ue->pucch_sel[subframe] is set by get_n1_pucch
-  UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_sel      = ue->pucch_sel[subframe];
-
-  // LOG_I(PHY,"subframe %d emu tx pucch_sel is %d sr is %d \n", subframe, UE_transport_info[ue->Mod_id].cntl.pucch_sel, sr);
-
-  if (format == pucch_format1a) {
-
-    ue->pucch_payload[0] = pucch_payload[0];
-    UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_payload = pucch_payload[0];
-  } else if (format == pucch_format1b) {
-    ue->pucch_payload[0] = pucch_payload[0] + (pucch_payload[1]<<1);
-    UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_payload = pucch_payload[0] + (pucch_payload[1]<<1);
-  } else if (format == pucch_format1) {
-    //    LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",ue->Mod_id,proc->frame_tx,subframe,sr);
-  }
-
-  ue->sr[subframe] = sr;
-
-}
 
 
 inline void pucch2x_scrambling(LTE_DL_FRAME_PARMS *fp,int subframe,uint16_t rnti,uint32_t B,uint8_t *btilde) __attribute__((always_inline));
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/rar_tools_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/rar_tools_ue.c
new file mode 100644
index 0000000000..2bbbf95b76
--- /dev/null
+++ b/openair1/PHY/LTE_UE_TRANSPORT/rar_tools_ue.c
@@ -0,0 +1,206 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file PHY/LTE_UE_TRANSPORT/rar_tools_ue.c
+* \brief Routine for filling the PUSCH/ULSCH data structures based on a random-access response (RAR) SDU from MAC.  Note this is for UE 
+* \author R. Knopp
+* \date 2011
+* \version 0.1
+* \company Eurecom
+* \email: knopp@eurecom.fr
+* \note
+* \warning
+*/
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
+#include "SCHED_UE/sched_UE.h"
+#include "LAYER2/MAC/mac.h"
+#include "UTIL/LOG/vcd_signal_dumper.h"
+
+#include "assertions.h"
+
+extern uint16_t RIV2nb_rb_LUT6[32];
+extern uint16_t RIV2first_rb_LUT6[32];
+extern uint16_t RIV2nb_rb_LUT25[512];
+extern uint16_t RIV2first_rb_LUT25[512];
+extern uint16_t RIV2nb_rb_LUT50[1600];
+extern uint16_t RIV2first_rb_LUT50[1600];
+extern uint16_t RIV2nb_rb_LUT100[6000];
+extern uint16_t RIV2first_rb_LUT100[600];
+
+extern uint16_t RIV_max6,RIV_max25,RIV_max50,RIV_max100;
+
+int8_t delta_PUSCH_msg2[8] = {-6,-4,-2,0,2,4,6,8};
+
+int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue,
+				      UE_rxtx_proc_t *proc,
+                                      unsigned char eNB_id )
+{
+
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_RAR,VCD_FUNCTION_IN);
+
+  //  RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)rar_pdu;
+  uint8_t transmission_mode = ue->transmission_mode[eNB_id];
+  unsigned char *rar_pdu = ue->dlsch_ra[eNB_id]->harq_processes[0]->b;
+  unsigned char subframe = ue->ulsch_Msg3_subframe[eNB_id];
+  LTE_UE_ULSCH_t *ulsch  = ue->ulsch[eNB_id];
+  PHY_MEASUREMENTS *meas = &ue->measurements;
+
+  LTE_DL_FRAME_PARMS *frame_parms =  &ue->frame_parms;
+  //  int current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id];
+
+  uint8_t *rar = (uint8_t *)(rar_pdu+1);
+  uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe);
+  uint16_t rballoc;
+  uint8_t cqireq;
+  uint16_t *RIV2nb_rb_LUT, *RIV2first_rb_LUT;
+  uint16_t RIV_max = 0;
+
+  LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",proc->frame_tx,subframe,harq_pid);
+
+  switch (frame_parms->N_RB_DL) {
+  case 6:
+    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT6[0];
+    RIV2first_rb_LUT  = &RIV2first_rb_LUT6[0];
+    RIV_max           = RIV_max6;
+    break;
+
+  case 25:
+    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT25[0];
+    RIV2first_rb_LUT  = &RIV2first_rb_LUT25[0];
+    RIV_max           = RIV_max25;
+    break;
+
+  case 50:
+    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT50[0];
+    RIV2first_rb_LUT  = &RIV2first_rb_LUT50[0];
+    RIV_max           = RIV_max50;
+    break;
+
+  case 100:
+    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT100[0];
+    RIV2first_rb_LUT  = &RIV2first_rb_LUT100[0];
+    RIV_max           = RIV_max100;
+    break;
+
+  default:
+    DevParam(frame_parms->N_RB_DL, eNB_id, harq_pid);
+    break;
+  }
+
+
+
+  ulsch->harq_processes[harq_pid]->TPC                                   = (rar[3]>>2)&7;//rar->TPC;
+
+  rballoc = (((uint16_t)(rar[1]&7))<<7)|(rar[2]>>1);
+  cqireq=rar[3]&1;
+
+  if (rballoc>RIV_max) {
+    LOG_D(PHY,"rar_tools.c: ERROR: rb_alloc (%x) > RIV_max\n",rballoc);
+    return(-1);
+  }
+
+  ulsch->harq_processes[harq_pid]->first_rb                              = RIV2first_rb_LUT[rballoc];
+  ulsch->harq_processes[harq_pid]->nb_rb                                 = RIV2nb_rb_LUT[rballoc];
+
+  AssertFatal(ulsch->harq_processes[harq_pid]->nb_rb >0, "nb_rb == 0\n");
+
+  ulsch->power_offset = ue_power_offsets[ulsch->harq_processes[harq_pid]->nb_rb];
+
+  AssertFatal(ulsch->harq_processes[harq_pid]->nb_rb <= 6,"unlikely rb count for RAR grant : nb_rb > 6\n");
+
+  //  ulsch->harq_processes[harq_pid]->Ndi                                   = 1;
+  if (ulsch->harq_processes[harq_pid]->round == 0)
+    ulsch->harq_processes[harq_pid]->status = ACTIVE;
+
+  if (cqireq==1) {
+    ulsch->O_RI                                  = 1;
+
+    if (meas->rank[eNB_id] == 1) {
+      ulsch->uci_format                          = wideband_cqi_rank2_2A;
+      ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_5MHz;
+      ulsch->o_RI[0]                             = 1;
+    } else {
+      ulsch->uci_format                          = wideband_cqi_rank1_2A;
+      ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_5MHz;
+      ulsch->o_RI[0]                             = 0;
+    }
+
+    ulsch->uci_format = HLC_subband_cqi_nopmi;
+    fill_CQI(ulsch,meas,eNB_id,0,ue->frame_parms.N_RB_DL,0, transmission_mode,ue->sinr_eff);
+
+    if (((proc->frame_tx % 100) == 0) || (proc->frame_tx < 10))
+      print_CQI(ulsch->o,ulsch->uci_format,eNB_id,ue->frame_parms.N_RB_DL);
+  } else {
+    ulsch->O_RI                                = 0;
+    ulsch->O                                   = 0;
+  }
+
+  ulsch->harq_processes[harq_pid]->O_ACK                                  = 0;//2;
+
+  ulsch->beta_offset_cqi_times8                  = 18;
+  ulsch->beta_offset_ri_times8                   = 10;
+  ulsch->beta_offset_harqack_times8              = 16;
+
+  ulsch->Nsymb_pusch                             = 12-(frame_parms->Ncp<<1);
+  ulsch->rnti = (((uint16_t)rar[4])<<8)+rar[5];  //rar->t_crnti;
+
+  if (ulsch->harq_processes[harq_pid]->round == 0) {
+    ulsch->harq_processes[harq_pid]->status = ACTIVE;
+    ulsch->harq_processes[harq_pid]->rvidx = 0;
+    ulsch->harq_processes[harq_pid]->mcs         = ((rar[2]&1)<<3)|(rar[3]>>5);
+    ulsch->harq_processes[harq_pid]->TPC         = (rar[3]>>2)&7;
+    //ulsch->harq_processes[harq_pid]->TBS         = dlsch_tbs25[ulsch->harq_processes[harq_pid]->mcs][ulsch->harq_processes[harq_pid]->nb_rb-1];
+    ulsch->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1];
+    ulsch->harq_processes[harq_pid]->Msc_initial   = 12*ulsch->harq_processes[harq_pid]->nb_rb;
+    ulsch->harq_processes[harq_pid]->Nsymb_initial = 9;
+    ulsch->harq_processes[harq_pid]->round = 0;
+  } else {
+    ulsch->harq_processes[harq_pid]->rvidx = 0;
+    ulsch->harq_processes[harq_pid]->round++;
+  }
+
+  // initialize power control based on PRACH power
+  ulsch->f_pusch = delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC] +
+                   get_deltaP_rampup(ue->Mod_id,ue->CC_id);
+  LOG_D(PHY,"[UE %d][PUSCH PC] Initializing f_pusch to %d dB, TPC %d (delta_PUSCH_msg2 %d dB), deltaP_rampup %d dB\n",
+        ue->Mod_id,ulsch->f_pusch,ulsch->harq_processes[harq_pid]->TPC,delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC],
+        get_deltaP_rampup(ue->Mod_id,ue->CC_id));
+
+
+  //#ifdef DEBUG_RAR
+  LOG_D(PHY,"ulsch ra (UE): harq_pid %d\n",harq_pid);
+  LOG_D(PHY,"ulsch ra (UE): NBRB     %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
+  LOG_D(PHY,"ulsch ra (UE): first_rb %x\n",ulsch->harq_processes[harq_pid]->first_rb);
+  LOG_D(PHY,"ulsch ra (UE): nb_rb    %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
+  LOG_D(PHY,"ulsch ra (UE): round    %d\n",ulsch->harq_processes[harq_pid]->round);
+  LOG_D(PHY,"ulsch ra (UE): TBS      %d\n",ulsch->harq_processes[harq_pid]->TBS);
+  LOG_D(PHY,"ulsch ra (UE): mcs      %d\n",ulsch->harq_processes[harq_pid]->mcs);
+  LOG_D(PHY,"ulsch ra (UE): TPC      %d\n",ulsch->harq_processes[harq_pid]->TPC);
+  LOG_D(PHY,"ulsch ra (UE): O        %d\n",ulsch->O);
+  LOG_D(PHY,"ulsch ra (UE): ORI      %d\n",ulsch->O_RI);
+
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_RAR,VCD_FUNCTION_OUT);
+
+  //#endif
+  return(0);
+}
+
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/srs_modulation.c b/openair1/PHY/LTE_UE_TRANSPORT/srs_modulation.c
index c4c02e6312..45508fcff2 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/srs_modulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/srs_modulation.c
@@ -29,8 +29,8 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 #include "UTIL/LOG/log.h"
 
 unsigned short msrsb_6_40[8][4] = {{36,12,4,4},
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/sss_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/sss_ue.c
index 03aabbd4b7..aee5d6bcf9 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/sss_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/sss_ue.c
@@ -29,9 +29,10 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_UE.h"
+#include "transport_ue.h"
+#include "PHY/phy_extern_ue.h"
+#include "PHY/MODULATION/modulation_UE.h"
 
 //#define DEBUG_SSS
 
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h b/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h
new file mode 100644
index 0000000000..d6a955dd02
--- /dev/null
+++ b/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h
@@ -0,0 +1,1667 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file PHY/LTE_TRANSPORT/proto.h
+ * \brief Function prototypes for PHY physical/transport channel processing and generation V8.6 2009-03
+ * \author R. Knopp, F. Kaltenberger
+ * \date 2011
+ * \version 0.1
+ * \company Eurecom
+ * \email: knopp@eurecom.fr
+ * \note
+ * \warning
+ */
+#ifndef __LTE_TRANSPORT_PROTO_UE__H__
+#define __LTE_TRANSPORT_PROTO_UE__H__
+#include "PHY/defs_UE.h"
+#include <math.h>
+#include "nfapi_interface.h"
+
+// Functions below implement 36-211 and 36-212
+
+/** @addtogroup _PHY_TRANSPORT_
+ * @{
+ */
+
+/** \fn free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
+    \brief This function frees memory allocated for a particular DLSCH at UE
+    @param dlsch Pointer to DLSCH to be removed
+*/
+void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch);
+
+/** \fn new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t abstraction_flag)
+    \brief This function allocates structures for a particular DLSCH at UE
+    @returns Pointer to DLSCH to be removed
+    @param Kmimo Kmimo factor from 36-212/36-213
+    @param Mdlharq Maximum number of HARQ rounds (36-212/36-213)
+    @param Nsoft Soft-LLR buffer size from UE-Category
+    @params N_RB_DL total number of resource blocks (determine the operating BW)
+    @param abstraction_flag Flag to indicate abstracted interface
+*/
+LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_turbo_iterations,uint8_t N_RB_DL, uint8_t abstraction_flag);
+
+
+void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch);
+
+
+LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag);
+
+int rx_pmch(PHY_VARS_UE *phy_vars_ue,
+            unsigned char eNB_id,
+            uint8_t subframe,
+            unsigned char symbol);
+
+/** \brief Dump OCTAVE/MATLAB files for PMCH debugging
+    @param phy_vars_ue Pointer to UE variables
+    @param eNB_id index of eNB in ue variables
+    @param coded_bits_per_codeword G from 36.211
+    @param subframe Index of subframe
+    @returns 0 on success
+*/
+void dump_mch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int subframe);
+
+
+
+/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream QPSK/QPSK reception.
+    @param stream0_in Input from channel compensated (MR combined) stream 0
+    @param stream1_in Input from channel compensated (MR combined) stream 1
+    @param stream0_out Output from LLR unit for stream0
+    @param rho01 Cross-correlation between channels (MR combined)
+    @param length in complex channel outputs*/
+void qpsk_qpsk(int16_t *stream0_in,
+               int16_t *stream1_in,
+               int16_t *stream0_out,
+               int16_t *rho01,
+               int32_t length);
+
+/** \brief This function perform LLR computation for dual-stream (QPSK/QPSK) transmission.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param rxdataF_comp_i Compensated channel output for interference
+    @param rho_i Correlation between channel of signal and inteference
+    @param dlsch_llr llr output
+    @param symbol OFDM symbol index in sub-frame
+    @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
+    @param nb_rb number of RBs for this allocation
+    @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
+    @param llr128p pointer to pointer to symbol in dlsch_llr*/
+int32_t dlsch_qpsk_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
+                            int32_t **rxdataF_comp,
+                            int32_t **rxdataF_comp_i,
+                            int32_t **rho_i,
+                            int16_t *dlsch_llr,
+                            uint8_t symbol,
+                            uint8_t first_symbol_flag,
+                            uint16_t nb_rb,
+                            uint16_t pbch_pss_sss_adj,
+                            int16_t **llr128p);
+
+/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream QPSK/16QAM reception.
+    @param stream0_in Input from channel compensated (MR combined) stream 0
+    @param stream1_in Input from channel compensated (MR combined) stream 1
+    @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
+    @param stream0_out Output from LLR unit for stream0
+    @param rho01 Cross-correlation between channels (MR combined)
+    @param length in complex channel outputs*/
+void qpsk_qam16(int16_t *stream0_in,
+                int16_t *stream1_in,
+                short *ch_mag_i,
+                int16_t *stream0_out,
+                int16_t *rho01,
+                int32_t length);
+
+/** \brief This function perform LLR computation for dual-stream (QPSK/16QAM) transmission.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param rxdataF_comp_i Compensated channel output for interference
+    @param rho_i Correlation between channel of signal and inteference
+    @param dlsch_llr llr output
+    @param symbol OFDM symbol index in sub-frame
+    @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
+    @param nb_rb number of RBs for this allocation
+    @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
+    @param llr128p pointer to pointer to symbol in dlsch_llr*/
+int32_t dlsch_qpsk_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
+                             int32_t **rxdataF_comp,
+                             int32_t **rxdataF_comp_i,
+                             int **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
+                             int32_t **rho_i,
+                             int16_t *dlsch_llr,
+                             uint8_t symbol,
+                             uint8_t first_symbol_flag,
+                             uint16_t nb_rb,
+                             uint16_t pbch_pss_sss_adj,
+                             int16_t **llr128p);
+
+/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream QPSK/64QAM reception.
+    @param stream0_in Input from channel compensated (MR combined) stream 0
+    @param stream1_in Input from channel compensated (MR combined) stream 1
+    @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
+    @param stream0_out Output from LLR unit for stream0
+    @param rho01 Cross-correlation between channels (MR combined)
+    @param length in complex channel outputs*/
+void qpsk_qam64(int16_t *stream0_in,
+                int16_t *stream1_in,
+                short *ch_mag_i,
+                int16_t *stream0_out,
+                int16_t *rho01,
+                int32_t length);
+
+/** \brief This function perform LLR computation for dual-stream (QPSK/64QAM) transmission.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param rxdataF_comp_i Compensated channel output for interference
+    @param rho_i Correlation between channel of signal and inteference
+    @param dlsch_llr llr output
+    @param symbol OFDM symbol index in sub-frame
+    @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
+    @param nb_rb number of RBs for this allocation
+    @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
+    @param llr128p pointer to pointer to symbol in dlsch_llr*/
+int32_t dlsch_qpsk_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
+                             int32_t **rxdataF_comp,
+                             int32_t **rxdataF_comp_i,
+                             int **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
+                             int32_t **rho_i,
+                             int16_t *dlsch_llr,
+                             uint8_t symbol,
+                             uint8_t first_symbol_flag,
+                             uint16_t nb_rb,
+                             uint16_t pbch_pss_sss_adj,
+                             int16_t **llr128p);
+
+
+/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 16QAM/QPSK reception.
+    @param stream0_in Input from channel compensated (MR combined) stream 0
+    @param stream1_in Input from channel compensated (MR combined) stream 1
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param stream0_out Output from LLR unit for stream0
+    @param rho01 Cross-correlation between channels (MR combined)
+    @param length in complex channel outputs*/
+void qam16_qpsk(short *stream0_in,
+                short *stream1_in,
+                short *ch_mag,
+                short *stream0_out,
+                short *rho01,
+                int length);
+/** \brief This function perform LLR computation for dual-stream (16QAM/QPSK) transmission.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param rxdataF_comp_i Compensated channel output for interference
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param rho_i Correlation between channel of signal and inteference
+    @param dlsch_llr llr output
+    @param symbol OFDM symbol index in sub-frame
+    @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
+    @param nb_rb number of RBs for this allocation
+    @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
+    @param llr16p pointer to pointer to symbol in dlsch_llr*/
+int dlsch_16qam_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
+                         int **rxdataF_comp,
+                         int **rxdataF_comp_i,
+                         int **dl_ch_mag,   //|h_0|^2*(2/sqrt{10})
+                         int **rho_i,
+                         short *dlsch_llr,
+                         unsigned char symbol,
+                         unsigned char first_symbol_flag,
+                         unsigned short nb_rb,
+                         uint16_t pbch_pss_sss_adjust,
+                         short **llr16p);
+
+/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 16QAM/16QAM reception.
+    @param stream0_in Input from channel compensated (MR combined) stream 0
+    @param stream1_in Input from channel compensated (MR combined) stream 1
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
+    @param stream0_out Output from LLR unit for stream0
+    @param rho01 Cross-correlation between channels (MR combined)
+    @param length in complex channel outputs*/
+void qam16_qam16(short *stream0_in,
+                 short *stream1_in,
+                 short *ch_mag,
+                 short *ch_mag_i,
+                 short *stream0_out,
+                 short *rho01,
+                 int length);
+
+/** \brief This function perform LLR computation for dual-stream (16QAM/16QAM) transmission.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param rxdataF_comp_i Compensated channel output for interference
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
+    @param rho_i Correlation between channel of signal and inteference
+    @param dlsch_llr llr output
+    @param symbol OFDM symbol index in sub-frame
+    @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
+    @param nb_rb number of RBs for this allocation
+    @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
+    @param llr16p pointer to pointer to symbol in dlsch_llr*/
+int dlsch_16qam_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
+                          int **rxdataF_comp,
+                          int **rxdataF_comp_i,
+                          int **dl_ch_mag,   //|h_0|^2*(2/sqrt{10})
+                          int **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
+                          int **rho_i,
+                          short *dlsch_llr,
+                          unsigned char symbol,
+                          unsigned char first_symbol_flag,
+                          unsigned short nb_rb,
+                          uint16_t pbch_pss_sss_adjust,
+                          short **llr16p);
+
+/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 16QAM/64QAM reception.
+    @param stream0_in Input from channel compensated (MR combined) stream 0
+    @param stream1_in Input from channel compensated (MR combined) stream 1
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
+    @param stream0_out Output from LLR unit for stream0
+    @param rho01 Cross-correlation between channels (MR combined)
+    @param length in complex channel outputs*/
+void qam16_qam64(short *stream0_in,
+                 short *stream1_in,
+                 short *ch_mag,
+                 short *ch_mag_i,
+                 short *stream0_out,
+                 short *rho01,
+                 int length);
+
+/** \brief This function perform LLR computation for dual-stream (16QAM/64QAM) transmission.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param rxdataF_comp_i Compensated channel output for interference
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
+    @param rho_i Correlation between channel of signal and inteference
+    @param dlsch_llr llr output
+    @param symbol OFDM symbol index in sub-frame
+    @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
+    @param nb_rb number of RBs for this allocation
+    @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
+    @param llr16p pointer to pointer to symbol in dlsch_llr*/
+int dlsch_16qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
+                          int **rxdataF_comp,
+                          int **rxdataF_comp_i,
+                          int **dl_ch_mag,   //|h_0|^2*(2/sqrt{10})
+                          int **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
+                          int **rho_i,
+                          short *dlsch_llr,
+                          unsigned char symbol,
+                          unsigned char first_symbol_flag,
+                          unsigned short nb_rb,
+                          uint16_t pbch_pss_sss_adjust,
+                          short **llr16p);
+
+/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/64QAM reception.
+    @param stream0_in Input from channel compensated (MR combined) stream 0
+    @param stream1_in Input from channel compensated (MR combined) stream 1
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param stream0_out Output from LLR unit for stream0
+    @param rho01 Cross-correlation between channels (MR combined)
+    @param length in complex channel outputs*/
+void qam64_qpsk(short *stream0_in,
+                short *stream1_in,
+                short *ch_mag,
+                short *stream0_out,
+                short *rho01,
+                int length);
+
+/** \brief This function perform LLR computation for dual-stream (64QAM/64QAM) transmission.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param rxdataF_comp_i Compensated channel output for interference
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param rho_i Correlation between channel of signal and inteference
+    @param dlsch_llr llr output
+    @param symbol OFDM symbol index in sub-frame
+    @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
+    @param nb_rb number of RBs for this allocation
+    @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
+    @param llr16p pointer to pointer to symbol in dlsch_llr*/
+int dlsch_64qam_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
+                         int **rxdataF_comp,
+                         int **rxdataF_comp_i,
+                         int **dl_ch_mag,
+                         int **rho_i,
+                         short *dlsch_llr,
+                         unsigned char symbol,
+                         unsigned char first_symbol_flag,
+                         unsigned short nb_rb,
+                         uint16_t pbch_pss_sss_adjust,
+                         short **llr16p);
+
+/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/16QAM reception.
+    @param stream0_in Input from channel compensated (MR combined) stream 0
+    @param stream1_in Input from channel compensated (MR combined) stream 1
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
+    @param stream0_out Output from LLR unit for stream0
+    @param rho01 Cross-correlation between channels (MR combined)
+    @param length in complex channel outputs*/
+void qam64_qam16(short *stream0_in,
+                 short *stream1_in,
+                 short *ch_mag,
+                 short *ch_mag_i,
+                 short *stream0_out,
+                 short *rho01,
+                 int length);
+
+/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/16QAM reception.
+    @param stream0_in Input from channel compensated (MR combined) stream 0
+    @param stream1_in Input from channel compensated (MR combined) stream 1
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
+    @param stream0_out Output from LLR unit for stream0
+    @param rho01 Cross-correlation between channels (MR combined)
+    @param length in complex channel outputs*/
+void qam64_qam16_avx2(short *stream0_in,
+                      short *stream1_in,
+                      short *ch_mag,
+                      short *ch_mag_i,
+                      short *stream0_out,
+                      short *rho01,
+                      int length);
+
+/** \brief This function perform LLR computation for dual-stream (64QAM/16QAM) transmission.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param rxdataF_comp_i Compensated channel output for interference
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
+    @param rho_i Correlation between channel of signal and inteference
+    @param dlsch_llr llr output
+    @param symbol OFDM symbol index in sub-frame
+    @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
+    @param nb_rb number of RBs for this allocation
+    @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
+    @param llr16p pointer to pointer to symbol in dlsch_llr*/
+int dlsch_64qam_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
+                          int **rxdataF_comp,
+                          int **rxdataF_comp_i,
+                          int **dl_ch_mag,
+                          int **dl_ch_mag_i,
+                          int **rho_i,
+                          short *dlsch_llr,
+                          unsigned char symbol,
+                          unsigned char first_symbol_flag,
+                          unsigned short nb_rb,
+                          uint16_t pbch_pss_sss_adjust,
+                          short **llr16p);
+
+/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/64QAM reception.
+    @param stream0_in Input from channel compensated (MR combined) stream 0
+    @param stream1_in Input from channel compensated (MR combined) stream 1
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
+    @param stream0_out Output from LLR unit for stream0
+    @param rho01 Cross-correlation between channels (MR combined)
+    @param length in complex channel outputs*/
+void qam64_qam64(short *stream0_in,
+                 short *stream1_in,
+                 short *ch_mag,
+                 short *ch_mag_i,
+                 short *stream0_out,
+                 short *rho01,
+                 int length);
+
+/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/64QAM reception.
+    @param stream0_in Input from channel compensated (MR combined) stream 0
+    @param stream1_in Input from channel compensated (MR combined) stream 1
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
+    @param stream0_out Output from LLR unit for stream0
+    @param rho01 Cross-correlation between channels (MR combined)
+    @param length in complex channel outputs*/
+void qam64_qam64_avx2(int32_t *stream0_in,
+                      int32_t *stream1_in,
+                      int32_t *ch_mag,
+                      int32_t *ch_mag_i,
+                      int16_t *stream0_out,
+                      int32_t *rho01,
+                      int length);
+
+/** \brief This function perform LLR computation for dual-stream (64QAM/64QAM) transmission.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param rxdataF_comp_i Compensated channel output for interference
+    @param ch_mag   Input from scaled channel magnitude square of h0'*g0
+    @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
+    @param rho_i Correlation between channel of signal and inteference
+    @param dlsch_llr llr output
+    @param symbol OFDM symbol index in sub-frame
+    @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
+    @param nb_rb number of RBs for this allocation
+    @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
+    @param llr16p pointer to pointer to symbol in dlsch_llr*/
+int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
+                          int **rxdataF_comp,
+                          int **rxdataF_comp_i,
+                          int **dl_ch_mag,
+                          int **dl_ch_mag_i,
+                          int **rho_i,
+                          short *dlsch_llr,
+                          unsigned char symbol,
+                          unsigned char first_symbol_flag,
+                          unsigned short nb_rb,
+                          uint16_t pbch_pss_sss_adjust,
+                          //short **llr16p,
+                          uint32_t llr_offset);
+
+
+/** \brief This function generates log-likelihood ratios (decoder input) for single-stream QPSK received waveforms.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param dlsch_llr llr output
+    @param symbol OFDM symbol index in sub-frame
+    @param first_symbol_flag
+    @param nb_rb number of RBs for this allocation
+    @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
+    @param llr128p pointer to pointer to symbol in dlsch_llr
+    @param beamforming_mode beamforming mode
+*/
+int32_t dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
+                       int32_t **rxdataF_comp,
+                       int16_t *dlsch_llr,
+                       uint8_t symbol,
+                       uint8_t first_symbol_flag,
+                       uint16_t nb_rb,
+                       uint16_t pbch_pss_sss_adj,
+                       //int16_t **llr128p,
+                       uint8_t beamforming_mode);
+
+/**
+   \brief This function generates log-likelihood ratios (decoder input) for single-stream 16QAM received waveforms
+   @param frame_parms Frame descriptor structure
+   @param rxdataF_comp Compensated channel output
+   @param dlsch_llr llr output
+   @param dl_ch_mag Squared-magnitude of channel in each resource element position corresponding to allocation and weighted for mid-point in 16QAM constellation
+   @param symbol OFDM symbol index in sub-frame
+   @param first_symbol_flag
+   @param nb_rb number of RBs for this allocation
+   @param pbch_pss_sss_adjust  Adjustment factor in RE for PBCH/PSS/SSS allocations
+   @param llr128p pointer to pointer to symbol in dlsch_llr
+   @param beamforming_mode beamforming mode
+*/
+
+int32_t dlsch_qpsk_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
+                           int **rxdataF_comp,
+                           int32_t **sic_buffer,
+                           int **rho_i,
+                           short *dlsch_llr,
+                           uint8_t num_pdcch_symbols,
+                           uint16_t nb_rb,
+                           uint8_t subframe,
+                           uint16_t mod_order_0,
+                           uint32_t rb_alloc);
+
+void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
+                     int32_t **rxdataF_comp,
+                     int16_t *dlsch_llr,
+                     int32_t **dl_ch_mag,
+                     uint8_t symbol,
+                     uint8_t first_symbol_flag,
+                     uint16_t nb_rb,
+                     uint16_t pbch_pss_sss_adjust,
+                     int16_t **llr128p,
+                     uint8_t beamforming_mode);
+/**
+   \brief This function generates log-likelihood ratios (decoder input) for single-stream 16QAM received waveforms
+   @param frame_parms Frame descriptor structure
+   @param rxdataF_comp Compensated channel output
+   @param dlsch_llr llr output
+   @param dl_ch_mag Squared-magnitude of channel in each resource element position corresponding to allocation, weighted by first mid-point of 64-QAM constellation
+   @param dl_ch_magb Squared-magnitude of channel in each resource element position corresponding to allocation, weighted by second mid-point of 64-QAM constellation
+   @param symbol OFDM symbol index in sub-frame
+   @param first_symbol_flag
+   @param nb_rb number of RBs for this allocation
+   @param pbch_pss_sss_adjust PBCH/PSS/SSS RE adjustment (in REs)
+   @param beamforming_mode beamforming mode
+*/
+void dlsch_16qam_llr_SIC (LTE_DL_FRAME_PARMS *frame_parms,
+                          int32_t **rxdataF_comp,
+                          int32_t **sic_buffer,  //Q15
+                          int32_t **rho_i,
+                          int16_t *dlsch_llr,
+                          uint8_t num_pdcch_symbols,
+                          int32_t **dl_ch_mag,
+                          uint16_t nb_rb,
+                          uint8_t subframe,
+                          uint16_t mod_order_0,
+                          uint32_t rb_alloc);
+
+void dlsch_64qam_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms,
+                         int32_t **rxdataF_comp,
+                         int32_t **sic_buffer,  //Q15
+                         int32_t **rho_i,
+                         int16_t *dlsch_llr,
+                         uint8_t num_pdcch_symbols,
+                         int32_t **dl_ch_mag,
+                         int32_t **dl_ch_magb,
+                         uint16_t nb_rb,
+                         uint8_t subframe,
+                         uint16_t mod_order_0,
+                         uint32_t rb_alloc);
+
+
+void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms,
+                     int32_t **rxdataF_comp,
+                     int16_t *dlsch_llr,
+                     int32_t **dl_ch_mag,
+                     int32_t **dl_ch_magb,
+                     uint8_t symbol,
+                     uint8_t first_symbol_flag,
+                     uint16_t nb_rb,
+                     uint16_t pbch_pss_sss_adjust,
+                     //int16_t **llr_save,
+                     uint32_t llr_offset,
+                     uint8_t beamforming_mode);
+
+
+/** \fn dlsch_siso(LTE_DL_FRAME_PARMS *frame_parms,
+    int32_t **rxdataF_comp,
+    int32_t **rxdataF_comp_i,
+    uint8_t l,
+    uint16_t nb_rb)
+    \brief This function does the first stage of llr computation for SISO, by just extracting the pilots, PBCH and primary/secondary synchronization sequences.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param rxdataF_comp_i Compensated channel output for interference
+    @param l symbol in sub-frame
+    @param nb_rb Number of RBs in this allocation
+*/
+
+void dlsch_siso(LTE_DL_FRAME_PARMS *frame_parms,
+                int32_t **rxdataF_comp,
+                int32_t **rxdataF_comp_i,
+                uint8_t l,
+                uint16_t nb_rb);
+
+/** \fn dlsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms,
+    int32_t **rxdataF_comp,
+    int32_t **dl_ch_mag,
+    int32_t **dl_ch_magb,
+    uint8_t symbol,
+    uint16_t nb_rb)
+    \brief This function does Alamouti combining on RX and prepares LLR inputs by skipping pilots, PBCH and primary/secondary synchronization signals.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param dl_ch_mag First squared-magnitude of channel (16QAM and 64QAM) for LLR computation.  Alamouti combining should be performed on this as well. Result is stored in first antenna position
+    @param dl_ch_magb Second squared-magnitude of channel (64QAM only) for LLR computation.  Alamouti combining should be performed on this as well. Result is stored in first antenna position
+    @param symbol Symbol in sub-frame
+    @param nb_rb Number of RBs in this allocation
+*/
+void dlsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms,
+                    int32_t **rxdataF_comp,
+                    int32_t **dl_ch_mag,
+                    int32_t **dl_ch_magb,
+                    uint8_t symbol,
+                    uint16_t nb_rb);
+
+/** \fn dlsch_antcyc(LTE_DL_FRAME_PARMS *frame_parms,
+    int32_t **rxdataF_comp,
+    int32_t **dl_ch_mag,
+    int32_t **dl_ch_magb,
+    uint8_t symbol,
+    uint16_t nb_rb)
+    \brief This function does antenna selection (based on antenna cycling pattern) on RX and prepares LLR inputs by skipping pilots, PBCH and primary/secondary synchronization signals.  Note that this is not LTE, it is just included for comparison purposes.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param dl_ch_mag First squared-magnitude of channel (16QAM and 64QAM) for LLR computation.  Alamouti combining should be performed on this as well. Result is stored in first antenna position
+    @param dl_ch_magb Second squared-magnitude of channel (64QAM only) for LLR computation.  Alamouti combining should be performed on this as well. Result is stored in first antenna position
+    @param symbol Symbol in sub-frame
+    @param nb_rb Number of RBs in this allocation
+*/
+void dlsch_antcyc(LTE_DL_FRAME_PARMS *frame_parms,
+                  int32_t **rxdataF_comp,
+                  int32_t **dl_ch_mag,
+                  int32_t **dl_ch_magb,
+                  uint8_t symbol,
+                  uint16_t nb_rb);
+
+/** \fn dlsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms,
+    int32_t **rxdataF_comp,
+    int32_t **rxdataF_comp_i,
+    int32_t **rho,
+    int32_t **rho_i,
+    int32_t **dl_ch_mag,
+    int32_t **dl_ch_magb,
+    uint8_t symbol,
+    uint16_t nb_rb,
+    uint8_t dual_stream_UE)
+
+    \brief This function does maximal-ratio combining for dual-antenna receivers.
+    @param frame_parms Frame descriptor structure
+    @param rxdataF_comp Compensated channel output
+    @param rxdataF_comp_i Compensated channel output for interference
+    @param rho Cross correlation between spatial channels
+    @param rho_i Cross correlation between signal and inteference channels
+    @param dl_ch_mag First squared-magnitude of channel (16QAM and 64QAM) for LLR computation.  Alamouti combining should be performed on this as well. Result is stored in first antenna position
+    @param dl_ch_magb Second squared-magnitude of channel (64QAM only) for LLR computation.  Alamouti combining should be performed on this as well. Result is stored in first antenna position
+    @param symbol Symbol in sub-frame
+    @param nb_rb Number of RBs in this allocation
+    @param dual_stream_UE Flag to indicate dual-stream detection
+*/
+void dlsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms,
+                         int32_t **rxdataF_comp,
+                         int32_t **rxdataF_comp_i,
+                         int32_t **rho,
+                         int32_t **rho_i,
+                         int32_t **dl_ch_mag,
+                         int32_t **dl_ch_magb,
+                         int32_t **dl_ch_mag_i,
+                         int32_t **dl_ch_magb_i,
+                         uint8_t symbol,
+                         uint16_t nb_rb,
+                         uint8_t dual_stream_UE);
+
+void dlsch_detection_mrc_TM34(LTE_DL_FRAME_PARMS *frame_parms,
+                              LTE_UE_PDSCH *lte_ue_pdsch_vars,
+                              int harq_pid,
+                              int round,
+                              unsigned char symbol,
+                              unsigned short nb_rb,
+                              unsigned char dual_stream_UE);
+
+/** \fn dlsch_extract_rbs_single(int32_t **rxdataF,
+    int32_t **dl_ch_estimates,
+    int32_t **rxdataF_ext,
+    int32_t **dl_ch_estimates_ext,
+    uint16_t pmi,
+    uint8_t *pmi_ext,
+    uint32_t *rb_alloc,
+    uint8_t symbol,
+    uint8_t subframe,
+    LTE_DL_FRAME_PARMS *frame_parms)
+    \brief This function extracts the received resource blocks, both channel estimates and data symbols,
+    for the current allocation and for single antenna eNB transmission.
+    @param rxdataF Raw FFT output of received signal
+    @param dl_ch_estimates Channel estimates of current slot
+    @param rxdataF_ext FFT output for RBs in this allocation
+    @param dl_ch_estimates_ext Channel estimates for RBs in this allocation
+    @param pmi subband Precoding matrix indicator
+    @param pmi_ext Extracted PMI for chosen RBs
+    @param rb_alloc RB allocation vector
+    @param symbol Symbol to extract
+    @param subframe Subframe number
+    @param vrb_type Flag to indicate distributed VRB type
+    @param high_speed_flag
+    @param frame_parms Pointer to frame descriptor
+*/
+uint16_t dlsch_extract_rbs_single(int32_t **rxdataF,
+                                  int32_t **dl_ch_estimates,
+                                  int32_t **rxdataF_ext,
+                                  int32_t **dl_ch_estimates_ext,
+                                  uint16_t pmi,
+                                  uint8_t *pmi_ext,
+                                  uint32_t *rb_alloc,
+                                  uint8_t symbol,
+                                  uint8_t subframe,
+                                  uint32_t high_speed_flag,
+                                  LTE_DL_FRAME_PARMS *frame_parms);
+
+/** \fn dlsch_extract_rbs_dual(int32_t **rxdataF,
+    int32_t **dl_ch_estimates,
+    int32_t **rxdataF_ext,
+    int32_t **dl_ch_estimates_ext,
+    uint16_t pmi,
+    uint8_t *pmi_ext,
+    uint32_t *rb_alloc,
+    uint8_t symbol,
+    LTE_DL_FRAME_PARMS *frame_parms)
+    \brief This function extracts the received resource blocks, both channel estimates and data symbols,
+    for the current allocation and for dual antenna eNB transmission.
+    @param rxdataF Raw FFT output of received signal
+    @param dl_ch_estimates Channel estimates of current slot
+    @param rxdataF_ext FFT output for RBs in this allocation
+    @param dl_ch_estimates_ext Channel estimates for RBs in this allocation
+    @param pmi subband Precoding matrix indicator
+    @param pmi_ext Extracted PMI for chosen RBs
+    @param rb_alloc RB allocation vector
+    @param symbol Symbol to extract
+    @param subframe Subframe index
+    @param high_speed_flag
+    @param frame_parms Pointer to frame descriptor
+*/
+uint16_t dlsch_extract_rbs_dual(int32_t **rxdataF,
+                                int32_t **dl_ch_estimates,
+                                int32_t **rxdataF_ext,
+                                int32_t **dl_ch_estimates_ext,
+                                uint16_t pmi,
+                                uint8_t *pmi_ext,
+                                uint32_t *rb_alloc,
+                                uint8_t symbol,
+                                uint8_t subframe,
+                                uint32_t high_speed_flag,
+                                LTE_DL_FRAME_PARMS *frame_parms,
+                                MIMO_mode_t mimo_mode);
+
+/** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF,
+    int32_t **dl_bf_ch_estimates,
+    int32_t **rxdataF_ext,
+    int32_t **dl_bf_ch_estimates_ext,
+    uint32_t *rb_alloc,
+    uint8_t symbol,
+    uint8_t subframe,
+    uint32_t high_speed_flag,
+    LTE_DL_FRAME_PARMS *frame_parms)
+    \brief This function extracts the received resource blocks, both channel estimates and data symbols,
+    for the current allocation and for single antenna eNB transmission.
+    @param rxdataF Raw FFT output of received signal
+    @param dl_bf_ch_estimates Beamforming channel estimates of current slot
+    @param rxdataF_ext FFT output for RBs in this allocation
+    @param dl_bf_ch_estimates_ext Beamforming channel estimates for RBs in this allocation
+    @param rb_alloc RB allocation vector
+    @param symbol Symbol to extract
+    @param subframe Subframe number
+    @param high_speed_flag
+    @param frame_parms Pointer to frame descriptor
+*/
+uint16_t dlsch_extract_rbs_TM7(int32_t **rxdataF,
+                               int32_t **dl_bf_ch_estimates,
+                               int32_t **rxdataF_ext,
+                               int32_t **dl_bf_ch_estimates_ext,
+                               uint32_t *rb_alloc,
+                               uint8_t symbol,
+                               uint8_t subframe,
+                               uint32_t high_speed_flag,
+                               LTE_DL_FRAME_PARMS *frame_parms);
+
+/** \brief This function performs channel compensation (matched filtering) on the received RBs for this allocation.  In addition, it computes the squared-magnitude of the channel with weightings for 16QAM/64QAM detection as well as dual-stream detection (cross-correlation)
+    @param rxdataF_ext Frequency-domain received signal in RBs to be demodulated
+    @param dl_ch_estimates_ext Frequency-domain channel estimates in RBs to be demodulated
+    @param dl_ch_mag First Channel magnitudes (16QAM/64QAM)
+    @param dl_ch_magb Second weighted Channel magnitudes (64QAM)
+    @param rxdataF_comp Compensated received waveform
+    @param rho Cross-correlation between two spatial channels on each RX antenna
+    @param frame_parms Pointer to frame descriptor
+    @param symbol Symbol on which to operate
+    @param first_symbol_flag set to 1 on first DLSCH symbol
+    @param mod_order Modulation order of allocation
+    @param nb_rb Number of RBs in allocation
+    @param output_shift Rescaling for compensated output (should be energy-normalizing)
+    @param phy_measurements Pointer to UE PHY measurements
+*/
+void dlsch_channel_compensation(int32_t **rxdataF_ext,
+                                int32_t **dl_ch_estimates_ext,
+                                int32_t **dl_ch_mag,
+                                int32_t **dl_ch_magb,
+                                int32_t **rxdataF_comp,
+                                int32_t **rho,
+                                LTE_DL_FRAME_PARMS *frame_parms,
+                                uint8_t symbol,
+                                uint8_t first_symbol_flag,
+                                uint8_t mod_order,
+                                uint16_t nb_rb,
+                                uint8_t output_shift,
+                                PHY_MEASUREMENTS *phy_measurements);
+
+void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
+                                   unsigned char symbol,
+                                   unsigned short nb_rb,
+                                   int **dl_ch_estimates_ext,
+                                   int **dl_ch_estimates_ext_i,
+                                   int **dl_ch_rho_ext,
+                                   unsigned char output_shift);
+
+void dlsch_dual_stream_correlationTM34(LTE_DL_FRAME_PARMS *frame_parms,
+                                   unsigned char symbol,
+                                   unsigned short nb_rb,
+                                   int **dl_ch_estimates_ext,
+                                   int **dl_ch_estimates_ext_i,
+                                   int **dl_ch_rho_ext,
+                                   unsigned char output_shift0,
+                                   unsigned char output_shift1);
+//This function is used to compute multiplications in Hhermitian * H matrix
+void conjch0_mult_ch1(int *ch0,
+                      int *ch1,
+                      int32_t *ch0conj_ch1,
+                      unsigned short nb_rb,
+                      unsigned char output_shift0);
+
+void construct_HhH_elements(int *ch0conj_ch0,
+                         int *ch1conj_ch1,
+                         int *ch2conj_ch2,
+                         int *ch3conj_ch3,
+                         int *ch0conj_ch1,
+                         int *ch1conj_ch0,
+                         int *ch2conj_ch3,
+                         int *ch3conj_ch2,
+                         int32_t *after_mf_00,
+                         int32_t *after_mf_01,
+                         int32_t *after_mf_10,
+                         int32_t *after_mf_11,
+                         unsigned short nb_rb);
+
+void squared_matrix_element(int32_t *Hh_h_00,
+                            int32_t *Hh_h_00_sq,
+                            unsigned short nb_rb);
+
+void dlsch_channel_level_TM34_meas(int *ch00,
+                                   int *ch01,
+                                   int *ch10,
+                                   int *ch11,
+                                   int *avg_0,
+                                   int *avg_1,
+                                   unsigned short nb_rb);
+
+void det_HhH(int32_t *after_mf_00,
+             int32_t *after_mf_01,
+             int32_t *after_mf_10,
+             int32_t *after_mf_11,
+             int32_t *det_fin_128,
+             unsigned short nb_rb);
+
+void numer(int32_t *Hh_h_00_sq,
+           int32_t *Hh_h_01_sq,
+           int32_t *Hh_h_10_sq,
+           int32_t *Hh_h_11_sq,
+           int32_t *num_fin,
+           unsigned short nb_rb);
+
+uint8_t rank_estimation_tm3_tm4(int *dl_ch_estimates_00,
+                                int *dl_ch_estimates_01,
+                                int *dl_ch_estimates_10,
+                                int *dl_ch_estimates_11,
+                                unsigned short nb_rb);
+
+void dlsch_channel_compensation_TM56(int **rxdataF_ext,
+                                     int **dl_ch_estimates_ext,
+                                     int **dl_ch_mag,
+                                     int **dl_ch_magb,
+                                     int **rxdataF_comp,
+                                     unsigned char *pmi_ext,
+                                     LTE_DL_FRAME_PARMS *frame_parms,
+                                     PHY_MEASUREMENTS *phy_measurements,
+                                     int eNB_id,
+                                     unsigned char symbol,
+                                     unsigned char mod_order,
+                                     unsigned short nb_rb,
+                                     unsigned char output_shift,
+                                     unsigned char dl_power_off);
+
+
+void dlsch_channel_compensation_TM34(LTE_DL_FRAME_PARMS *frame_parms,
+                                    LTE_UE_PDSCH *lte_ue_pdsch_vars,
+                                    PHY_MEASUREMENTS *phy_measurements,
+                                    int eNB_id,
+                                    unsigned char symbol,
+                                    unsigned char mod_order0,
+                                    unsigned char mod_order1,
+                                    int harq_pid,
+                                    int round,
+                                    MIMO_mode_t mimo_mode,
+                                    unsigned short nb_rb,
+                                    unsigned char output_shift0,
+                                    unsigned char output_shift1);
+
+
+/** \brief This function computes the average channel level over all allocated RBs and antennas (TX/RX) in order to compute output shift for compensated signal
+    @param dl_ch_estimates_ext Channel estimates in allocated RBs
+    @param frame_parms Pointer to frame descriptor
+    @param avg Pointer to average signal strength
+    @param pilots_flag Flag to indicate pilots in symbol
+    @param nb_rb Number of allocated RBs
+*/
+void dlsch_channel_level(int32_t **dl_ch_estimates_ext,
+                         LTE_DL_FRAME_PARMS *frame_parms,
+                         int32_t *avg,
+                         uint8_t pilots_flag,
+                         uint16_t nb_rb);
+
+
+void dlsch_channel_level_TM34(int **dl_ch_estimates_ext,
+                              LTE_DL_FRAME_PARMS *frame_parms,
+                              unsigned char *pmi_ext,
+                              int *avg_0,
+                              int *avg_1,
+                              uint8_t symbol,
+                              unsigned short nb_rb,
+                              MIMO_mode_t mimo_mode);
+
+
+void dlsch_channel_level_TM56(int32_t **dl_ch_estimates_ext,
+                              LTE_DL_FRAME_PARMS *frame_parms,
+                              unsigned char *pmi_ext,
+                              int32_t *avg,
+                              uint8_t symbol_mod,
+                              uint16_t nb_rb);
+
+void dlsch_channel_level_TM7(int32_t **dl_bf_ch_estimates_ext,
+                         LTE_DL_FRAME_PARMS *frame_parms,
+                         int32_t *avg,
+                         uint8_t pilots_flag,
+                         uint16_t nb_rb);
+
+void dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
+                         LTE_DL_FRAME_PARMS *frame_parms,
+                         LTE_UE_DLSCH_t **dlsch_ue,
+                         uint8_t symbol_mod,
+                         uint16_t nb_rb);
+
+/** \brief This is the top-level entry point for DLSCH decoding in UE.  It should be replicated on several
+    threads (on multi-core machines) corresponding to different HARQ processes. The routine first
+    computes the segmentation information, followed by rate dematching and sub-block deinterleaving the of the
+    received LLRs computed by dlsch_demodulation for each transport block segment. It then calls the
+    turbo-decoding algorithm for each segment and stops after either after unsuccesful decoding of at least
+    one segment or correct decoding of all segments.  Only the segment CRCs are check for the moment, the
+    overall CRC is ignored.  Finally transport block reassembly is performed.
+    @param phy_vars_ue Pointer to ue variables
+    @param dlsch_llr Pointer to LLR values computed by dlsch_demodulation
+    @param lte_frame_parms Pointer to frame descriptor
+    @param dlsch Pointer to DLSCH descriptor
+    @param frame Frame number
+    @param subframe Subframe number
+    @param num_pdcch_symbols Number of PDCCH symbols
+    @param is_crnti indicates if PDSCH belongs to a CRNTI (necessary for parallelizing decoding threads)
+    @param llr8_flag If 1, indicate that the 8-bit turbo decoder should be used
+    @returns 0 on success, 1 on unsuccessful decoding
+*/
+uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
+                        int16_t *dlsch_llr,
+                        LTE_DL_FRAME_PARMS *lte_frame_parms,
+                        LTE_UE_DLSCH_t *dlsch,
+                        LTE_DL_UE_HARQ_t *harq_process,
+                        uint32_t frame,
+                        uint8_t subframe,
+                        uint8_t harq_pid,
+                        uint8_t is_crnti,
+                        uint8_t llr8_flag);
+
+
+uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
+                             uint8_t subframe,
+                             PDSCH_t dlsch_id,
+                             uint8_t eNB_id);
+
+/** \brief This function is the top-level entry point to PDSCH demodulation, after frequency-domain transformation and channel estimation.  It performs
+    - RB extraction (signal and channel estimates)
+    - channel compensation (matched filtering)
+    - RE extraction (pilot, PBCH, synch. signals)
+    - antenna combining (MRC, Alamouti, cycling)
+    - LLR computation
+    This function supports TM1, 2, 3, 5, and 6.
+    @param phy_vars_ue Pointer to PHY variables
+    @param type Type of PDSCH (SI_PDSCH,RA_PDSCH,PDSCH,PMCH)
+    @param eNB_id eNb index (Nid1) 0,1,2
+    @param eNB_id_i Interfering eNB index (Nid1) 0,1,2, or 3 in case of MU-MIMO IC receiver
+    @param subframe Subframe number
+    @param symbol Symbol on which to act (within sub-frame)
+    @param first_symbol_flag set to 1 on first DLSCH symbol
+    @param rx_type. rx_type=RX_IC_single_stream will enable interference cancellation of a second stream when decoding the first stream. In case of TM1, 2, 5, and this can cancel interference from a neighbouring cell given by eNB_id_i. In case of TM5, eNB_id_i should be set to n_connected_eNB to perform multi-user interference cancellation. In case of TM3, eNB_id_i should be set to eNB_id to perform co-channel interference cancellation; this option should be used together with an interference cancellation step [...]. In case of TM3, if rx_type=RX_IC_dual_stream, both streams will be decoded by applying the IC single stream receiver twice.
+    @param i_mod Modulation order of the interfering stream
+*/
+int32_t rx_pdsch(PHY_VARS_UE *phy_vars_ue,
+                 PDSCH_t type,
+                 uint8_t eNB_id,
+                 uint8_t eNB_id_i,
+                 uint32_t frame,
+                 uint8_t subframe,
+                 uint8_t symbol,
+                 uint8_t first_symbol_flag,
+                 RX_type_t rx_type,
+                 uint8_t i_mod,
+                 uint8_t harq_pid);
+
+int32_t rx_pdcch(PHY_VARS_UE *ue,
+                 uint32_t frame,
+                 uint8_t subframe,
+                 uint8_t eNB_id,
+                 MIMO_mode_t mimo_mode,
+                 uint32_t high_speed_flag,
+                 uint8_t is_secondary_ue);
+
+/*! \brief Extract PSS and SSS resource elements
+  @param phy_vars_ue Pointer to UE variables
+  @param[out] pss_ext contain the PSS signals after the extraction
+  @param[out] sss_ext contain the SSS signals after the extraction
+  @returns 0 on success
+*/
+int pss_sss_extract(PHY_VARS_UE *phy_vars_ue,
+                    int32_t pss_ext[4][72],
+                    int32_t sss_ext[4][72],
+                                        uint8_t subframe);
+
+/*! \brief Extract only PSS resource elements
+  @param phy_vars_ue Pointer to UE variables
+  @param[out] pss_ext contain the PSS signals after the extraction
+  @returns 0 on success
+*/
+int pss_only_extract(PHY_VARS_UE *phy_vars_ue,
+                    int32_t pss_ext[4][72],
+                    uint8_t subframe);
+
+/*! \brief Extract only SSS resource elements
+  @param phy_vars_ue Pointer to UE variables
+  @param[out] sss_ext contain the SSS signals after the extraction
+  @returns 0 on success
+*/
+int sss_only_extract(PHY_VARS_UE *phy_vars_ue,
+                    int32_t sss_ext[4][72],
+                    uint8_t subframe);
+
+/*! \brief Performs detection of SSS to find cell ID and other framing parameters (FDD/TDD, normal/extended prefix)
+  @param phy_vars_ue Pointer to UE variables
+  @param tot_metric Pointer to variable containing maximum metric under framing hypothesis (to be compared to other hypotheses
+  @param flip_max Pointer to variable indicating if start of frame is in second have of RX buffer (i.e. PSS/SSS is flipped)
+  @param phase_max Pointer to variable (0 ... 6) containing rought phase offset between PSS and SSS (can be used for carrier
+  frequency adjustment. 0 means -pi/3, 6 means pi/3.
+  @returns 0 on success
+*/
+int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_t *phase_max);
+
+/*! \brief receiver for the PBCH
+  \returns number of tx antennas or -1 if error
+*/
+uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars,
+                 LTE_UE_PBCH *lte_ue_pbch_vars,
+                 LTE_DL_FRAME_PARMS *frame_parms,
+                 uint8_t eNB_id,
+                 MIMO_mode_t mimo_mode,
+                 uint32_t high_speed_flag,
+                 uint8_t frame_mod4);
+
+uint16_t rx_pbch_emul(PHY_VARS_UE *phy_vars_ue,
+                      uint8_t eNB_id,
+                      uint8_t pbch_phase);
+
+
+/*! \brief PBCH unscrambling
+  This is similar to pbch_scrabling with the difference that inputs are signed s16s (llr values) and instead of flipping bits we change signs.
+  \param frame_parms Pointer to frame descriptor
+  \param llr Output of the demodulator
+  \param length Length of the sequence
+  \param frame_mod4 Frame number modulo 4*/
+void pbch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
+                       int8_t* llr,
+                       uint32_t length,
+                       uint8_t frame_mod4);
+
+
+void generate_64qam_table(void);
+void generate_16qam_table(void);
+
+uint16_t extract_crc(uint8_t *dci,uint8_t DCI_LENGTH);
+
+/*! \brief LLR from two streams. This function takes two streams (qpsk modulated) and calculates the LLR, considering one stream as interference.
+  \param stream0_in pointer to first stream0
+  \param stream1_in pointer to first stream1
+  \param stream0_out pointer to output stream
+  \param rho01 pointer to correlation matrix
+  \param length*/
+void qpsk_qpsk_TM3456(short *stream0_in,
+                      short *stream1_in,
+                      short *stream0_out,
+                      short *rho01,
+                      int length
+                     );
+
+/** \brief Attempt decoding of a particular DCI with given length and format.
+    @param DCI_LENGTH length of DCI in bits
+    @param DCI_FMT Format of DCI
+    @param e e-sequence (soft bits)
+    @param decoded_output Output of Viterbi decoder
+*/
+void dci_decoding(uint8_t DCI_LENGTH,
+                  uint8_t DCI_FMT,
+                  int8_t *e,
+                  uint8_t *decoded_output);
+
+/** \brief Do 36.213 DCI decoding procedure by searching different RNTI options and aggregation levels.  Currently does
+    not employ the complexity reducing procedure based on RNTI.
+    @param phy_vars_ue UE variables
+    @param dci_alloc Pointer to DCI_ALLOC_t array to store results for DLSCH/ULSCH programming
+    @param do_common If 1 perform search in common search-space else ue-specific search-space
+    @param eNB_id eNB Index on which to act
+    @param subframe Index of subframe
+    @returns bitmap of occupied CCE positions (i.e. those detected)
+*/
+uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
+                                DCI_ALLOC_t *dci_alloc,
+                                int do_common,
+                                int16_t eNB_id,
+                                uint8_t subframe);
+
+uint16_t dci_CRNTI_decoding_procedure(PHY_VARS_UE *ue,
+                                DCI_ALLOC_t *dci_alloc,
+                                uint8_t DCIFormat,
+                                uint8_t agregationLevel,
+                                int16_t eNB_id,
+                                uint8_t subframe);
+
+uint16_t dci_decoding_procedure_emul(LTE_UE_PDCCH **lte_ue_pdcch_vars,
+                                     uint8_t num_ue_spec_dci,
+                                     uint8_t num_common_dci,
+                                     DCI_ALLOC_t *dci_alloc_tx,
+                                     DCI_ALLOC_t *dci_alloc_rx,
+                                     int16_t eNB_id);
+
+/** \brief Compute Q (modulation order) based on I_MCS PDSCH.  Implements table 7.1.7.1-1 from 36.213.
+    @param I_MCS */
+uint8_t get_Qm(uint8_t I_MCS);
+
+/** \brief Compute Q (modulation order) based on I_MCS for PUSCH.  Implements table 8.6.1-1 from 36.213.
+    @param I_MCS */
+uint8_t get_Qm_ul(uint8_t I_MCS);
+
+/** \brief Compute I_TBS (transport-block size) based on I_MCS for PDSCH.  Implements table 7.1.7.1-1 from 36.213.
+    @param I_MCS */
+uint8_t get_I_TBS(uint8_t I_MCS);
+
+/** \brief Compute I_TBS (transport-block size) based on I_MCS for PUSCH.  Implements table 8.6.1-1 from 36.213.
+    @param I_MCS */
+unsigned char get_I_TBS_UL(unsigned char I_MCS);
+
+/** \brief Compute Q (modulation order) based on downlink I_MCS. Implements table 7.1.7.1-1 from 36.213.
+    @param I_MCS
+    @param nb_rb
+    @return Transport block size */
+uint32_t get_TBS_DL(uint8_t mcs, uint16_t nb_rb);
+
+/** \brief Compute Q (modulation order) based on uplink I_MCS. Implements table 7.1.7.1-1 from 36.213.
+    @param I_MCS
+    @param nb_rb
+    @return Transport block size */
+uint32_t get_TBS_UL(uint8_t mcs, uint16_t nb_rb);
+
+/* \brief Return bit-map of resource allocation for a given DCI rballoc (RIV format) and vrb type
+   @param N_RB_DL number of PRB on DL
+   @param indicator for even/odd slot
+   @param vrb vrb index
+   @param Ngap Gap indicator
+*/
+uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap);
+
+/* \brief Return prb for a given vrb index
+   @param vrb_type VRB type (0=localized,1=distributed)
+   @param rb_alloc_dci rballoc field from DCI
+*/
+uint32_t get_rballoc(vrb_t vrb_type,uint16_t rb_alloc_dci);
+
+
+/* \brief Return bit-map of resource allocation for a given DCI rballoc (RIV format) and vrb type
+   @returns Transmission mode (1-7)
+*/
+uint8_t get_transmission_mode(module_id_t Mod_id, uint8_t CC_id, rnti_t rnti);
+
+
+/* \brief
+   @param ra_header Header of resource allocation (0,1) (See sections 7.1.6.1/7.1.6.2 of 36.213 Rel8.6)
+   @param rb_alloc Bitmap allocation from DCI (format 1,2)
+   @returns number of physical resource blocks
+*/
+uint32_t conv_nprb(uint8_t ra_header,uint32_t rb_alloc,int N_RB_DL);
+
+int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t Nl,uint8_t num_pdcch_symbols,int frame,uint8_t subframe, uint8_t beamforming_mode);
+
+int adjust_G(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_order,uint8_t subframe);
+int adjust_G2(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_order,uint8_t subframe,uint8_t symbol);
+
+
+#ifndef modOrder
+#define modOrder(I_MCS,I_TBS) ((I_MCS-I_TBS)*2+2) // Find modulation order from I_TBS and I_MCS
+#endif
+
+/** \fn uint8_t I_TBS2I_MCS(uint8_t I_TBS);
+    \brief This function maps I_tbs to I_mcs according to Table 7.1.7.1-1 in 3GPP TS 36.213 V8.6.0. Where there is two supported modulation orders for the same I_TBS then either high or low modulation is chosen by changing the equality of the two first comparisons in the if-else statement.
+    \param I_TBS Index of Transport Block Size
+    \return I_MCS given I_TBS
+*/
+uint8_t I_TBS2I_MCS(uint8_t I_TBS);
+
+/** \fn uint8_t SE2I_TBS(float SE,
+    uint8_t N_PRB,
+    uint8_t symbPerRB);
+    \brief This function maps a requested throughput in number of bits to I_tbs. The throughput is calculated as a function of modulation order, RB allocation and number of symbols per RB. The mapping orginates in the "Transport block size table" (Table 7.1.7.2.1-1 in 3GPP TS 36.213 V8.6.0)
+    \param SE Spectral Efficiency (before casting to integer, multiply by 1024, remember to divide result by 1024!)
+    \param N_PRB Number of PhysicalResourceBlocks allocated \sa lte_frame_parms->N_RB_DL
+    \param symbPerRB Number of symbols per resource block allocated to this channel
+    \return I_TBS given an SE and an N_PRB
+*/
+uint8_t SE2I_TBS(float SE,
+                 uint8_t N_PRB,
+                 uint8_t symbPerRB);
+/** \brief This function generates the sounding reference symbol (SRS) for the uplink according to 36.211 v8.6.0. If IFFT_FPGA is defined, the SRS is quantized to a QPSK sequence.
+    @param frame_parms LTE DL Frame Parameters
+    @param soundingrs_ul_config_dedicated Dynamic configuration from RRC during Connection Establishment
+    @param txdataF pointer to the frequency domain TX signal
+    @returns 0 on success*/
+int generate_srs(LTE_DL_FRAME_PARMS *frame_parms,
+		 SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated,
+		 int *txdataF,
+		 int16_t amp,
+		 uint32_t subframe);
+
+
+/*!
+  \brief This function is similar to generate_srs_tx but generates a conjugate sequence for channel estimation. If IFFT_FPGA is defined, the SRS is quantized to a QPSK sequence.
+  @param phy_vars_ue Pointer to PHY_VARS structure
+  @param eNB_id Index of destination eNB for this SRS
+  @param amp Linear amplitude of SRS
+  @param subframe Index of subframe on which to act
+  @returns 0 on success, -1 on error with message
+*/
+
+int32_t generate_srs_tx(PHY_VARS_UE *phy_vars_ue,
+                        uint8_t eNB_id,
+                        int16_t amp,
+                        uint32_t subframe);
+
+/*!
+  \brief This function generates the downlink reference signal for the PUSCH according to 36.211 v8.6.0. The DRS occuies the RS defined by rb_alloc and the symbols 2 and 8 for extended CP and 3 and 10 for normal CP.
+*/
+
+int32_t generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
+                           UE_rxtx_proc_t *proc,
+                           uint8_t eNB_id,
+                           int16_t amp,
+                           uint32_t subframe,
+                           uint32_t first_rb,
+                           uint32_t nb_rb,
+                           uint8_t ant);
+
+/*!
+  \brief This function initializes the Group Hopping, Sequence Hopping and nPRS sequences for PUCCH/PUSCH according to 36.211 v8.6.0. It should be called after configuration of UE (reception of SIB2/3) and initial configuration of eNB (or after reconfiguration of cell-specific parameters).
+  @param frame_parms Pointer to a LTE_DL_FRAME_PARMS structure (eNB or UE)*/
+void init_ul_hopping(LTE_DL_FRAME_PARMS *frame_parms);
+
+
+/*!
+  \brief This function implements the initialization of paging parameters for UE (See Section 7, 36.304).It must be called after setting IMSImod1024 during UE startup and after receiving SIB2
+  @param ue Pointer to UE context
+  @param defaultPagingCycle T from 36.304 (0=32,1=64,2=128,3=256)
+  @param nB nB from 36.304 (0=4T,1=2T,2=T,3=T/2,4=T/4,5=T/8,6=T/16,7=T/32*/
+int init_ue_paging_info(PHY_VARS_UE *ue, long defaultPagingCycle, long nB);
+
+int32_t compareints (const void * a, const void * b);
+
+
+void ulsch_modulation(int32_t **txdataF,
+                      int16_t amp,
+                      frame_t frame,
+                      uint32_t subframe,
+                      LTE_DL_FRAME_PARMS *frame_parms,
+                      LTE_UE_ULSCH_t *ulsch);
+
+
+
+uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame,uint8_t subframe);
+uint8_t subframe2harq_pid_eNBrx(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
+
+int generate_ue_dlsch_params_from_dci(int frame,
+                                      uint8_t subframe,
+                                      void *dci_pdu,
+                                      rnti_t rnti,
+                                      DCI_format_t dci_format,
+                                      LTE_UE_PDCCH *pdcch_vars,
+                                      LTE_UE_PDSCH *pdsch_vars,
+                                      LTE_UE_DLSCH_t **dlsch,
+                                      LTE_DL_FRAME_PARMS *frame_parms,
+                                      PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
+                                      uint16_t si_rnti,
+                                      uint16_t ra_rnti,
+                                      uint16_t p_rnti,
+                                      uint8_t beamforming_mode,
+                                      uint16_t tc_rnti);
+
+
+int generate_ue_ulsch_params_from_dci(void *dci_pdu,
+                                      rnti_t rnti,
+                                      uint8_t subframe,
+                                      DCI_format_t dci_format,
+                                      PHY_VARS_UE *phy_vars_ue,
+                                      UE_rxtx_proc_t *proc,
+                                      uint16_t si_rnti,
+                                      uint16_t ra_rnti,
+                                      uint16_t p_rnti,
+                                      uint16_t cba_rnti,
+                                      uint8_t eNB_id,
+                                      uint8_t use_srs);
+
+int32_t generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue,
+                                          UE_rxtx_proc_t *proc,
+                                          uint8_t eNB_id);
+double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue,
+                         uint8_t eNB_id,
+                                                 uint8_t subframe);
+
+uint8_t sinr2cqi(double sinr,uint8_t trans_mode);
+
+
+int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci);
+
+int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, UE_rxtx_proc_t *proc, char* buffer, int length, runmode_t mode, int input_level_dBm);
+
+
+
+void generate_pcfich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms);
+
+
+void pcfich_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
+                         uint8_t subframe,
+                         int16_t *d);
+
+
+uint8_t rx_pcfich(LTE_DL_FRAME_PARMS *frame_parms,
+                  uint8_t subframe,
+                  LTE_UE_PDCCH *lte_ue_pdcch_vars,
+                  MIMO_mode_t mimo_mode);
+
+void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms);
+
+
+void init_transport_channels(uint8_t);
+
+void generate_RIV_tables(void);
+
+/*!
+  \brief This function performs the initial cell search procedure - PSS detection, SSS detection and PBCH detection.  At the
+  end, the basic frame parameters are known (Frame configuration - TDD/FDD and cyclic prefix length,
+  N_RB_DL, PHICH_CONFIG and Nid_cell) and the UE can begin decoding PDCCH and DLSCH SI to retrieve the rest.  Once these
+  parameters are know, the routine calls some basic initialization routines (cell-specific reference signals, etc.)
+  @param phy_vars_ue Pointer to UE variables
+*/
+int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode);
+
+
+/*!
+  \brief Encoding of PUSCH/ACK/RI/ACK from 36-212.
+  @param a Pointer to ulsch SDU
+  @param frame_parms Pointer to Frame parameters
+  @param ulsch Pointer to ulsch descriptor
+  @param harq_pid HARQ process ID
+  @param tmode Transmission mode (1-7)
+  @param control_only_flag Generate PUSCH with control information only
+  @param Nbundled Parameter for ACK/NAK bundling (36.213 Section 7.3)
+*/
+uint32_t ulsch_encoding(uint8_t *a,
+                        PHY_VARS_UE *phy_vars_ue,
+                        uint8_t harq_pid,
+                        uint8_t eNB_id,
+                        uint8_t subframe_rx,
+                        uint8_t tmode,
+                        uint8_t control_only_flag,
+                        uint8_t Nbundled);
+
+
+
+/* \brief  This routine demodulates the PHICH and updates PUSCH/ULSCH parameters.
+   @param phy_vars_ue Pointer to UE variables
+   @param proc Pointer to RXN_TXNp4 proc
+   @param subframe Subframe of received PDCCH/PHICH
+   @param eNB_id Index of eNB
+*/
+
+void rx_phich(PHY_VARS_UE *phy_vars_ue,
+              UE_rxtx_proc_t *proc,
+              uint8_t subframe,
+              uint8_t eNB_id);
+
+
+/** \brief  This routine provides the relationship between a PHICH TXOp and its corresponding PUSCH subframe (Table 8.3.-1 from 36.213).
+    @param frame_parms Pointer to DL frame configuration parameters
+    @param subframe Subframe of received/transmitted PHICH
+    @returns subframe of PUSCH transmission
+*/
+uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
+
+/** \brief  This routine provides the relationship between a PHICH TXOp and its corresponding PUSCH frame (Table 8.3.-1 from 36.213).
+    @param frame_parms Pointer to DL frame configuration parameters
+    @param frame Frame of received/transmitted PHICH
+    @param subframe Subframe of received/transmitted PHICH
+    @returns frame of PUSCH transmission
+*/
+int phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms, int frame, int subframe);
+
+void print_CQI(void *o,UCI_format_t uci_format,uint8_t eNB_id,int N_RB_DL);
+
+void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id, uint8_t harq_pid,int N_RB_DL, rnti_t rnti, uint8_t trans_mode,double sinr_eff);
+
+void reset_cba_uci(void *o);
+
+/** \brief  This routine computes the subband PMI bitmap based on measurements (0,1,2,3 for rank 0 and 0,1 for rank 1) in the format needed for UCI
+    @param meas pointer to measurements
+    @param eNB_id eNB_id
+    @param nb_subbands number of subbands
+    @returns subband PMI bitmap
+*/
+uint16_t quantize_subband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,int nb_subbands);
+
+int32_t pmi_convert_rank1_from_rank2(uint16_t pmi_alloc, int tpmi, int nb_rb);
+
+uint16_t quantize_subband_pmi2(PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t a_id,int nb_subbands);
+
+uint64_t pmi2hex_2Ar1(uint32_t pmi);
+
+uint64_t pmi2hex_2Ar2(uint32_t pmi);
+
+uint64_t cqi2hex(uint32_t cqi);
+
+uint16_t computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs);
+
+/** \brief  This routine expands a single (wideband) PMI to subband PMI bitmap similar to the one used in the UCI and in the dlsch_modulation routine
+    @param frame_parms Pointer to DL frame configuration parameters
+    @param wideband_pmi (0,1,2,3 for rank 0 and 0,1 for rank 1)
+    @param rank (0 or 1)
+    @returns subband PMI bitmap
+*/
+uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi, uint8_t rank);
+
+/** \brief  This routine extracts a single subband PMI from a bitmap coming from UCI or the pmi_extend function
+    @param N_RB_DL number of resource blocks
+    @param mimo_mode
+    @param pmi_alloc subband PMI bitmap
+    @param rb resource block for which to extract PMI
+    @returns subband PMI
+*/
+uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb);
+
+int get_nCCE_offset_l1(int *CCE_table,
+                       const unsigned char L,
+                       const int nCCE,
+                       const int common_dci,
+                       const unsigned short rnti,
+                       const unsigned char subframe);
+
+uint16_t get_nCCE(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi);
+
+uint16_t get_nquad(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi);
+
+uint8_t get_mi(LTE_DL_FRAME_PARMS *frame,uint8_t subframe);
+
+uint16_t get_nCCE_mac(uint8_t Mod_id,uint8_t CC_id,int num_pdcch_symbols,int subframe);
+
+uint8_t get_num_pdcch_symbols(uint8_t num_dci,DCI_ALLOC_t *dci_alloc,LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
+
+void pdcch_interleaving(LTE_DL_FRAME_PARMS *frame_parms,int32_t **z, int32_t **wbar,uint8_t n_symbols_pdcch,uint8_t mi);
+
+void pdcch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
+                        uint8_t subframe,
+                        int8_t* llr,
+                        uint32_t length);
+
+
+
+void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
+                        int mbsfn_flag,
+                        LTE_UE_DLSCH_t *dlsch,
+                        int G,
+                        int16_t* llr,
+                        uint8_t q,
+                        uint8_t Ns);
+
+void init_ncs_cell(LTE_DL_FRAME_PARMS *frame_parms,uint8_t ncs_cell[20][7]);
+
+void generate_pucch1x(int32_t **txdataF,
+                      LTE_DL_FRAME_PARMS *frame_parms,
+                      uint8_t ncs_cell[20][7],
+                      PUCCH_FMT_t fmt,
+                      PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
+                      uint16_t n1_pucch,
+                      uint8_t shortened_format,
+                      uint8_t *payload,
+                      int16_t amp,
+                      uint8_t subframe);
+
+void generate_pucch2x(int32_t **txdataF,
+                      LTE_DL_FRAME_PARMS *fp,
+                      uint8_t ncs_cell[20][7],
+                      PUCCH_FMT_t fmt,
+                      PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
+                      uint16_t n2_pucch,
+                      uint8_t *payload,
+                      int A,
+                      int B2,
+                      int16_t amp,
+                      uint8_t subframe,
+                      uint16_t rnti);
+
+void generate_pucch3x(int32_t **txdataF,
+                    LTE_DL_FRAME_PARMS *frame_parms,
+                    uint8_t ncs_cell[20][7],
+                    PUCCH_FMT_t fmt,
+                    PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
+                    uint16_t n3_pucch,
+                    uint8_t shortened_format,
+                    uint8_t *payload,
+                    int16_t amp,
+                    uint8_t subframe,
+                    uint16_t rnti);
+
+
+void init_ulsch_power_LUT(void);
+
+/*!
+  \brief Check for PRACH TXop in subframe
+  @param frame_parms Pointer to LTE_DL_FRAME_PARMS
+  @param frame frame index to check
+  @param subframe subframe index to check
+  @returns 0 on success
+*/
+int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame, uint8_t subframe);
+
+/*!
+  \brief Generate PRACH waveform
+  @param phy_vars_ue Pointer to ue top-level descriptor
+  @param eNB_id Index of destination eNB
+  @param subframe subframe index to operate on
+  @param index of preamble (0-63)
+  @param Nf System frame number
+  @returns 0 on success
+
+*/
+int32_t generate_prach(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint16_t Nf);
+
+
+/*!
+  \brief Helper for MAC, returns number of available PRACH in TDD for a particular configuration index
+  @param frame_parms Pointer to LTE_DL_FRAME_PARMS structure
+  @returns 0-5 depending on number of available prach
+*/
+uint8_t get_num_prach_tdd(module_id_t Mod_id);
+
+/*!
+  \brief Return the PRACH format as a function of the Configuration Index and Frame type.
+  @param prach_ConfigIndex PRACH Configuration Index
+  @param frame_type 0-FDD, 1-TDD
+  @returns 0-1 accordingly
+*/
+uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type);
+
+/*!
+  \brief Helper for MAC, returns frequency index of PRACH resource in TDD for a particular configuration index
+  @param frame_parms Pointer to LTE_DL_FRAME_PARMS structure
+  @returns 0-5 depending on number of available prach
+*/
+uint8_t get_fid_prach_tdd(module_id_t Mod_id,uint8_t tdd_map_index);
+
+/*!
+  \brief Comp ute DFT of PRACH ZC sequences.  Used for generation of prach in UE and reception of PRACH in eNB.
+  @param rootSequenceIndex PRACH root sequence
+  #param prach_ConfigIndex PRACH Configuration Index
+  @param zeroCorrelationZoneConfig PRACH ncs_config
+  @param highSpeedFlat PRACH High-Speed Flag
+  @param frame_type TDD/FDD flag
+  @param Xu DFT output
+*/
+void compute_prach_seq(uint16_t rootSequenceIndex,
+		       uint8_t prach_ConfigIndex,
+		       uint8_t zeroCorrelationZoneConfig,
+		       uint8_t highSpeedFlag,
+		       lte_frame_type_t frame_type,
+		       uint32_t X_u[64][839]);
+
+
+void init_prach_tables(int N_ZC);
+
+void init_unscrambling_lut(void);
+void init_scrambling_lut(void);
+
+/*!
+  \brief Return the status of MBSFN in this frame/subframe
+  @param frame Frame index
+  @param subframe Subframe index
+  @param frame_parms Pointer to frame parameters
+  @returns 1 if subframe is for MBSFN
+*/
+int is_pmch_subframe(frame_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parms);
+
+uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2ndpilots);
+
+uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode);
+
+uint32_t dlsch_decoding_abstraction(double *dlsch_MIPB,
+                                    LTE_DL_FRAME_PARMS *lte_frame_parms,
+                                    LTE_UE_DLSCH_t *dlsch,
+                                    uint8_t subframe,
+                                    uint8_t num_pdcch_symbols);
+
+// DL power control functions
+double get_pa_dB(uint8_t pa);
+
+
+double computeRhoA_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
+                      LTE_UE_DLSCH_t *dlsch_ue,
+                      uint8_t dl_power_off,
+                      uint8_t n_antenna_port);
+
+double computeRhoB_UE(PDSCH_CONFIG_DEDICATED  *pdsch_config_dedicated,
+                      PDSCH_CONFIG_COMMON *pdsch_config_common,
+                      uint8_t n_antenna_port,
+                      LTE_UE_DLSCH_t *dlsch_ue,
+                      uint8_t dl_power_off);
+
+/*void compute_sqrt_RhoAoRhoB(PDSCH_CONFIG_DEDICATED  *pdsch_config_dedicated,
+  PDSCH_CONFIG_COMMON *pdsch_config_common,
+  uint8_t n_antenna_port,
+  LTE_UE_DLSCH_t *dlsch_ue);
+*/
+
+uint8_t get_prach_prb_offset(LTE_DL_FRAME_PARMS *frame_parms, 
+			     uint8_t prach_ConfigIndex, 
+			     uint8_t n_ra_prboffset,
+			     uint8_t tdd_mapindex, uint16_t Nf);
+
+uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n);
+
+
+
+/**@}*/
+#endif
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h b/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h
index 38e7f7301a..574905b5b0 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h
+++ b/openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h
@@ -31,11 +31,11 @@
 */
 #ifndef __TRANSPORT_UE__H__
 #define __TRANSPORT_UE__H__
-#include "PHY/defs.h"
+#include "PHY/defs_UE.h"
 #include "PHY/impl_defs_lte.h"
-#include "dci.h"
-#include "mdci.h"
-#include "uci_common.h"
+#include "../LTE_TRANSPORT/dci.h"
+#include "../LTE_TRANSPORT/mdci.h"
+#include "../LTE_TRANSPORT/uci_common.h"
 #ifndef STANDALONE_COMPILE
 #include "UTIL/LISTS/list.h"
 #endif
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/uci_tools_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/uci_tools_ue.c
index 9cef95ee13..9e45c73160 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/uci_tools_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/uci_tools_ue.c
@@ -29,10 +29,10 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 #ifdef DEBUG_UCI_TOOLS
-#include "PHY/vars.h"
+#include "PHY/phy_vars.h"
 #endif
 
 //#define DEBUG_UCI 1
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c
index 09420f48ab..a9a6c00635 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c
@@ -30,16 +30,13 @@
 * \warning
 */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 
-#include "PHY/CODING/defs.h"
-#include "PHY/CODING/extern.h"
+#include "PHY/CODING/coding_defs.h"
+#include "PHY/CODING/coding_extern.h"
 #include "PHY/CODING/lte_interleaver_inline.h"
-#include "PHY/LTE_TRANSPORT/defs.h"
-#include "defs.h"
-#include "extern.h"
-#include "SIMULATION/ETH_TRANSPORT/extern.h"
+#include "PHY/LTE_UE_TRANSPORT/transport_ue.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
 //#define DEBUG_ULSCH_CODING
@@ -107,7 +104,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag)
   case 50:
     bw_scaling =2;
     break;
-
+ 
   default:
     bw_scaling =1;
     break;
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c
index d1718f6e90..adf89031dc 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c
@@ -29,12 +29,12 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "PHY/CODING/defs.h"
-#include "PHY/CODING/extern.h"
-#include "PHY/LTE_TRANSPORT/defs.h"
-#include "defs.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
+#include "PHY/CODING/coding_defs.h"
+#include "PHY/CODING/coding_extern.h"
+#include "PHY/LTE_UE_TRANSPORT/transport_ue.h"
+#include "PHY/LTE_TRANSPORT/transport_eNB.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
 
@@ -381,7 +381,7 @@ void ulsch_modulation(int32_t **txdataF,
 
   DevAssert(frame_parms);
 
-  int re_offset,re_offset0,i,Msymb,j,k,nsymb,Msc_PUSCH,l;
+  int re_offset,re_offset0,i,ulsch_Msymb,j,k,nsymb,Msc_PUSCH,l;
   //  uint8_t harq_pid = (rag_flag == 1) ? 0 : subframe2harq_pid_tdd(frame_parms->tdd_config,subframe);
   uint8_t harq_pid = subframe2harq_pid(frame_parms,frame,subframe);
   uint8_t Q_m;
@@ -470,12 +470,12 @@ void ulsch_modulation(int32_t **txdataF,
 
   // Modulation
 
-  Msymb = G/Q_m;
+  ulsch_Msymb = G/Q_m;
 
   if(ulsch->cooperation_flag == 2)
     // For Distributed Alamouti Scheme in Collabrative Communication
   {
-    for (i=0,j=Q_m; i<Msymb; i+=2,j+=2*Q_m) {
+    for (i=0,j=Q_m; i<ulsch_Msymb; i+=2,j+=2*Q_m) {
 
       switch (Q_m) {
 
@@ -609,7 +609,7 @@ void ulsch_modulation(int32_t **txdataF,
     }//for
   }//cooperation_flag == 2
   else {
-    for (i=0,j=0; i<Msymb; i++,j+=Q_m) {
+    for (i=0,j=0; i<ulsch_Msymb; i++,j+=Q_m) {
 
       switch (Q_m) {
 
@@ -685,7 +685,7 @@ void ulsch_modulation(int32_t **txdataF,
 
 #ifdef OFDMA_ULSCH
 
-  for (i=0; i<Msymb; i++) {
+  for (i=0; i<ulsch_Msymb; i++) {
     ulsch->z[i] = ulsch->d[i];
   }
 
diff --git a/openair1/PHY/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c
index 84863c81e8..e2ab0cd33b 100644
--- a/openair1/PHY/MODULATION/beamforming.c
+++ b/openair1/PHY/MODULATION/beamforming.c
@@ -29,13 +29,14 @@
  * \note
  * \warning
  */
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "PHY/CODING/defs.h"
-#include "PHY/CODING/extern.h"
+#include "PHY/defs_common.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "PHY/CODING/coding_defs.h"
+#include "PHY/CODING/coding_extern.h"
 #include "PHY/CODING/lte_interleaver_inline.h"
-#include "PHY/LTE_TRANSPORT/defs.h"
-#include "defs.h"
+#include "PHY/LTE_TRANSPORT/transport_eNB.h"
+#include "modulation_eNB.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
 int beam_precoding(int32_t **txdataF,
diff --git a/openair1/PHY/MODULATION/compute_bf_weights.c b/openair1/PHY/MODULATION/compute_bf_weights.c
index 4ef8e88ca6..89d76058e6 100644
--- a/openair1/PHY/MODULATION/compute_bf_weights.c
+++ b/openair1/PHY/MODULATION/compute_bf_weights.c
@@ -2,6 +2,7 @@
 #include <stdint.h>
 #include <stdlib.h>
 #include "PHY/impl_defs_lte.h"
+#include "PHY/defs_common.h"
 
 int f_read(char *calibF_fname, int nb_ant, int nb_freq, int32_t **tdd_calib_coeffs){
 
diff --git a/openair1/PHY/MODULATION/defs.h b/openair1/PHY/MODULATION/defs.h
deleted file mode 100644
index f9bbdcd271..0000000000
--- a/openair1/PHY/MODULATION/defs.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1  (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- *      contact@openairinterface.org
- */
-
-#ifndef __MODULATION_DEFS__H__
-#define __MODULATION_DEFS__H__
-#include "PHY/defs.h"
-/** @addtogroup _PHY_MODULATION_
- * @{
-*/
-
-/**
-\fn void PHY_ofdm_mod(int *input,int *output,int fftsize,unsigned char nb_symbols,unsigned short nb_prefix_samples,Extension_t etype)
-This function performs OFDM modulation with cyclic extension or zero-padding.
-
-@param input The sequence input samples in the frequency-domain.  This is a concatenation of the input symbols in SIMD redundant format
-@param output The time-domain output signal
-@param fftsize size of OFDM symbol size (\f$N_d\f$)
-@param nb_symbols The number of OFDM symbols in the block
-@param nb_prefix_samples The number of prefix/suffix/zero samples
-@param etype Type of extension (CYCLIC_PREFIX,CYCLIC_SUFFIX,ZEROS)
-
-*/
-void PHY_ofdm_mod(int *input,
-                  int *output,
-                  int fftsize,
-                  unsigned char nb_symbols,
-                  unsigned short nb_prefix_samples,
-                  Extension_t etype
-                 );
-
-#ifdef OPENAIR_LTE
-
-/*!
-\brief This function implements the OFDM front end processor on reception (FEP)
-\param phy_vars_ue Pointer to PHY variables
-\param l symbol within slot (0..6/7)
-\param Ns Slot number (0..19)
-\param sample_offset offset within rxdata (points to beginning of subframe)
-\param no_prefix if 1 prefix is removed by HW
-\param reset_freq_est if non-zero it resets the frequency offset estimation loop
-*/
-
-int slot_fep(PHY_VARS_UE *phy_vars_ue,
-             unsigned char l,
-             unsigned char Ns,
-             int sample_offset,
-             int no_prefix,
-	     int reset_freq_est);
-
-int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
-                   unsigned char l,
-                   int subframe,
-                   int sample_offset,
-                   int no_prefix);
-
-int slot_fep_ul(RU_t *ru,
-                unsigned char l,
-                unsigned char Ns,
-                int no_prefix);
-
-int front_end_fft(PHY_VARS_UE *ue,
-             unsigned char l,
-             unsigned char Ns,
-             int sample_offset,
-             int no_prefix);
-
-int front_end_chanEst(PHY_VARS_UE *ue,
-             unsigned char l,
-             unsigned char Ns,
-            int reset_freq_est);
-
-void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRAME_PARMS *frame_parms);
-
-void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms);
-
-void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, RU_COMMON *common, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms,int do_precoding);
-
-void remove_7_5_kHz(RU_t *ru,uint8_t subframe);
-
-void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t subframe);
-
-void init_prach625(LTE_DL_FRAME_PARMS *frame_parms);
-
-void remove_625_Hz(PHY_VARS_eNB *phy_vars_eNB,int16_t *prach);
-
-void apply_625_Hz(PHY_VARS_UE *phy_vars_ue,int16_t *prach);
-
-/** \brief This function performs beamforming precoding for common
- * data
-    @param txdataF Table of pointers for frequency-domain TX signals
-    @param txdataF_BF Table of pointers for frequency-domain TX signals
-    @param frame_parms Frame descriptor structure
-after beamforming
-    @param beam_weights Beamforming weights applied on each
-antenna element and each carrier
-    @param slot Slot number
-    @param symbol Symbol index on which to act
-    @param aa physical antenna index*/
-int beam_precoding(int32_t **txdataF,
-	           int32_t **txdataF_BF,
-                   LTE_DL_FRAME_PARMS *frame_parms,
-	           int32_t ***beam_weights,
-                   int slot,
-                   int symbol,
-                   int aa);
-
-int f_read(char *calibF_fname, int nb_ant, int nb_freq, int32_t **tdd_calib_coeffs);
-
-int estimate_DLCSI_from_ULCSI(int32_t **calib_dl_ch_estimates, int32_t **ul_ch_estimates, int32_t **tdd_calib_coeffs, int nb_ant, int nb_freq);
-
-int compute_BF_weights(int32_t **beam_weights, int32_t **calib_dl_ch_estimates, PRECODE_TYPE_t precode_type, int nb_ant, int nb_freq);
-
-
-#endif
-/** @}*/
-#endif
diff --git a/openair1/PHY/MODULATION/extern.h b/openair1/PHY/MODULATION/extern.h
deleted file mode 100644
index 4690bba42e..0000000000
--- a/openair1/PHY/MODULATION/extern.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1  (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- *      contact@openairinterface.org
- */
-
diff --git a/openair1/PHY/MODULATION/modulation_UE.h b/openair1/PHY/MODULATION/modulation_UE.h
new file mode 100644
index 0000000000..7e2a3c8a27
--- /dev/null
+++ b/openair1/PHY/MODULATION/modulation_UE.h
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#ifndef __MODULATION_DEFS__H__
+#define __MODULATION_DEFS__H__
+#include "PHY/defs_common.h"
+#include "modulation_common.h"
+/** @addtogroup _PHY_MODULATION_
+ * @{
+*/
+
+
+
+/*!
+\brief This function implements the OFDM front end processor on reception (FEP)
+\param phy_vars_ue Pointer to PHY variables
+\param l symbol within slot (0..6/7)
+\param Ns Slot number (0..19)
+\param sample_offset offset within rxdata (points to beginning of subframe)
+\param no_prefix if 1 prefix is removed by HW
+\param reset_freq_est if non-zero it resets the frequency offset estimation loop
+*/
+
+int slot_fep(PHY_VARS_UE *phy_vars_ue,
+             unsigned char l,
+             unsigned char Ns,
+             int sample_offset,
+             int no_prefix,
+	     int reset_freq_est);
+
+int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
+                   unsigned char l,
+                   int subframe,
+                   int sample_offset,
+                   int no_prefix);
+
+int front_end_fft(PHY_VARS_UE *ue,
+             unsigned char l,
+             unsigned char Ns,
+             int sample_offset,
+             int no_prefix);
+
+int front_end_chanEst(PHY_VARS_UE *ue,
+             unsigned char l,
+             unsigned char Ns,
+            int reset_freq_est);
+
+void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t subframe);
+
+
+int compute_BF_weights(int32_t **beam_weights, int32_t **calib_dl_ch_estimates, PRECODE_TYPE_t precode_type, int nb_ant, int nb_freq);
+
+
+
+/** @}*/
+#endif
diff --git a/openair1/PHY/MODULATION/modulation_eNB.h b/openair1/PHY/MODULATION/modulation_eNB.h
new file mode 100644
index 0000000000..3608610887
--- /dev/null
+++ b/openair1/PHY/MODULATION/modulation_eNB.h
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#ifndef __MODULATION_ENB__H__
+#define __MODULATION_ENB__H__
+#include "PHY/defs_common.h"
+#include "modulation_common.h"
+
+/** @addtogroup _PHY_MODULATION_
+ * @{
+*/
+
+int slot_fep_ul(RU_t *ru,
+                unsigned char l,
+                unsigned char Ns,
+                int no_prefix);
+
+void remove_7_5_kHz(RU_t *ru,uint8_t subframe);
+
+/** \brief This function performs beamforming precoding for common
+ * data
+    @param txdataF Table of pointers for frequency-domain TX signals
+    @param txdataF_BF Table of pointers for frequency-domain TX signals
+    @param frame_parms Frame descriptor structure
+after beamforming
+    @param beam_weights Beamforming weights applied on each
+antenna element and each carrier
+    @param slot Slot number
+    @param symbol Symbol index on which to act
+    @param aa physical antenna index*/
+int beam_precoding(int32_t **txdataF,
+	           int32_t **txdataF_BF,
+                   LTE_DL_FRAME_PARMS *frame_parms,
+	           int32_t ***beam_weights,
+                   int slot,
+                   int symbol,
+                   int aa);
+
+int f_read(char *calibF_fname, int nb_ant, int nb_freq, int32_t **tdd_calib_coeffs);
+
+int estimate_DLCSI_from_ULCSI(int32_t **calib_dl_ch_estimates, int32_t **ul_ch_estimates, int32_t **tdd_calib_coeffs, int nb_ant, int nb_freq);
+
+int compute_BF_weights(int32_t **beam_weights, int32_t **calib_dl_ch_estimates, PRECODE_TYPE_t precode_type, int nb_ant, int nb_freq);
+
+
+
+/** @}*/
+#endif
diff --git a/openair1/PHY/MODULATION/vars.h b/openair1/PHY/MODULATION/modulation_extern.h
similarity index 62%
rename from openair1/PHY/MODULATION/vars.h
rename to openair1/PHY/MODULATION/modulation_extern.h
index a05999afe1..2834aa00f5 100644
--- a/openair1/PHY/MODULATION/vars.h
+++ b/openair1/PHY/MODULATION/modulation_extern.h
@@ -10,7 +10,7 @@
  *      http://www.openairinterface.org/?page_id=698
  *
  * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
+; * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
@@ -19,13 +19,20 @@
  *      contact@openairinterface.org
  */
 
-mod_sym_t qpsk_table[4];
-mod_sym_t qam16_table[16];
-mod_sym_t qam64_table[64];
+extern int16_t s6n_kHz_7_5[1920];
+extern int16_t s6e_kHz_7_5[1920];
+extern int16_t s15n_kHz_7_5[3840];
+extern int16_t s15e_kHz_7_5[3840];
+extern int16_t s25n_kHz_7_5[7680];
+extern int16_t s25e_kHz_7_5[7680];
+extern int16_t s50n_kHz_7_5[15360];
+extern int16_t s50e_kHz_7_5[15360];
+extern int16_t s75n_kHz_7_5[23040];
+extern int16_t s75e_kHz_7_5[23040];
+extern int16_t s100n_kHz_7_5[30720];
+extern int16_t s100e_kHz_7_5[30720];
 
-int16_t kHz75_25PRB[1024]  = {};
-int16_t kHz75_6PRB   = {};
-int16_t kHz75_15PRB  = {};
-int16_t kHz75_50PRB  = {};
-int16_t kHz75_75PRB  = {};
-int16_t kHz75_100PRB = {};
+
+extern short conjugate75[8];
+extern short conjugate75_2[8];
+extern short negate[8];
diff --git a/openair1/SCHED/sched_eNB_vars.h b/openair1/PHY/MODULATION/modulation_vars.h
similarity index 80%
rename from openair1/SCHED/sched_eNB_vars.h
rename to openair1/PHY/MODULATION/modulation_vars.h
index 4dac375f18..dbea92ab3f 100644
--- a/openair1/SCHED/sched_eNB_vars.h
+++ b/openair1/PHY/MODULATION/modulation_vars.h
@@ -19,8 +19,8 @@
  *      contact@openairinterface.org
  */
 
-#include "defs.h"
-
-
-
+#include "kHz_7_5.h"
 
+short conjugate75[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ;
+short conjugate75_2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
+short negate[8]__attribute__((aligned(16))) = {-1,-1,-1,-1,-1,-1,-1,-1};
diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c
index 37d1a48311..a5b17abdca 100644
--- a/openair1/PHY/MODULATION/ofdm_mod.c
+++ b/openair1/PHY/MODULATION/ofdm_mod.c
@@ -29,9 +29,11 @@ This section deals with basic functions for OFDM Modulation.
 
 */
 
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/impl_defs_top.h"
 #include "UTIL/LOG/log.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
+#include "modulation_common.h"
 
 //#define DEBUG_OFDM_MOD
 
diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c
index 39ae90217f..a5fcaabf8f 100644
--- a/openair1/PHY/MODULATION/slot_fep.c
+++ b/openair1/PHY/MODULATION/slot_fep.c
@@ -19,8 +19,8 @@
  *      contact@openairinterface.org
  */
 
-#include "PHY/defs.h"
-#include "defs.h"
+#include "PHY/defs_UE.h"
+#include "modulation_UE.h"
 //#define DEBUG_FEP
 
 #define SOFFSET 0
diff --git a/openair1/PHY/MODULATION/slot_fep_mbsfn.c b/openair1/PHY/MODULATION/slot_fep_mbsfn.c
index 7b902bb8f1..7a8fd3f03f 100644
--- a/openair1/PHY/MODULATION/slot_fep_mbsfn.c
+++ b/openair1/PHY/MODULATION/slot_fep_mbsfn.c
@@ -19,8 +19,8 @@
  *      contact@openairinterface.org
  */
 
-#include "PHY/defs.h"
-#include "defs.h"
+#include "PHY/defs_UE.h"
+#include "modulation_UE.h"
 //#define DEBUG_FEP
 
 #define SOFFSET 0
diff --git a/openair1/PHY/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c
index 5beb7eccfd..fe5488c73c 100644
--- a/openair1/PHY/MODULATION/slot_fep_ul.c
+++ b/openair1/PHY/MODULATION/slot_fep_ul.c
@@ -19,9 +19,9 @@
  *      contact@openairinterface.org
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "defs.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "modulation_eNB.h"
 //#define DEBUG_FEP
 
 
diff --git a/openair1/PHY/MODULATION/ul_7_5_kHz.c b/openair1/PHY/MODULATION/ul_7_5_kHz.c
index d92dc1c8b3..3d1d9c2b04 100644
--- a/openair1/PHY/MODULATION/ul_7_5_kHz.c
+++ b/openair1/PHY/MODULATION/ul_7_5_kHz.c
@@ -19,121 +19,11 @@
  *      contact@openairinterface.org
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "extern.h"
-#include "kHz_7_5.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
 #include <math.h>
 #include "PHY/sse_intrin.h"
-
-short conjugate75[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ;
-short conjugate75_2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ;
-short negate[8]__attribute__((aligned(16))) = {-1,-1,-1,-1,-1,-1,-1,-1};
-
-void apply_7_5_kHz(PHY_VARS_UE *ue,int32_t*txdata,uint8_t slot)
-{
-
-
-  uint16_t len;
-  uint32_t *kHz7_5ptr;
-#if defined(__x86_64__) || defined(__i386__)
-  __m128i *txptr128,*kHz7_5ptr128,mmtmp_re,mmtmp_im,mmtmp_re2,mmtmp_im2;
-#elif defined(__arm__)
-  int16x8_t *txptr128,*kHz7_5ptr128;
-  int32x4_t mmtmp_re,mmtmp_im;
-  int32x4_t mmtmp0,mmtmp1;
-#endif
-  uint32_t slot_offset;
-  //   uint8_t aa;
-  uint32_t i;
-  LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
-
-  switch (frame_parms->N_RB_UL) {
-
-  case 6:
-    kHz7_5ptr = (frame_parms->Ncp==0) ? (uint32_t*)s6n_kHz_7_5 : (uint32_t*)s6e_kHz_7_5;
-    break;
-
-  case 15:
-    kHz7_5ptr = (frame_parms->Ncp==0) ? (uint32_t*)s15n_kHz_7_5 : (uint32_t*)s15e_kHz_7_5;
-    break;
-
-  case 25:
-    kHz7_5ptr = (frame_parms->Ncp==0) ? (uint32_t*)s25n_kHz_7_5 : (uint32_t*)s25e_kHz_7_5;
-    break;
-
-  case 50:
-    kHz7_5ptr = (frame_parms->Ncp==0) ? (uint32_t*)s50n_kHz_7_5 : (uint32_t*)s50e_kHz_7_5;
-    break;
-
-  case 75:
-    kHz7_5ptr = (frame_parms->Ncp==0) ? (uint32_t*)s75n_kHz_7_5 : (uint32_t*)s75e_kHz_7_5;
-    break;
-
-  case 100:
-    kHz7_5ptr = (frame_parms->Ncp==0) ? (uint32_t*)s100n_kHz_7_5 : (uint32_t*)s100e_kHz_7_5;
-    break;
-
-  default:
-    kHz7_5ptr = (frame_parms->Ncp==0) ? (uint32_t*)s25n_kHz_7_5 : (uint32_t*)s25e_kHz_7_5;
-    break;
-  }
-
-  slot_offset = (uint32_t)slot * frame_parms->samples_per_tti/2;
-  len = frame_parms->samples_per_tti/2;
-
-#if defined(__x86_64__) || defined(__i386__)
-  txptr128 = (__m128i *)&txdata[slot_offset];
-  kHz7_5ptr128 = (__m128i *)kHz7_5ptr;
-#elif defined(__arm__)
-  txptr128 = (int16x8_t*)&txdata[slot_offset];
-  kHz7_5ptr128 = (int16x8_t*)kHz7_5ptr;
-#endif
-  // apply 7.5 kHz
-
-  for (i=0; i<(len>>2); i++) {
-#if defined(__x86_64__) || defined(__i386__)
-    mmtmp_re = _mm_madd_epi16(*txptr128,*kHz7_5ptr128);
-    // Real part of complex multiplication (note: 7_5kHz signal is conjugated for this to work)
-    mmtmp_im = _mm_shufflelo_epi16(*kHz7_5ptr128,_MM_SHUFFLE(2,3,0,1));
-    mmtmp_im = _mm_shufflehi_epi16(mmtmp_im,_MM_SHUFFLE(2,3,0,1));
-    mmtmp_im = _mm_sign_epi16(mmtmp_im,*(__m128i*)&conjugate75[0]);
-    mmtmp_im = _mm_madd_epi16(mmtmp_im,txptr128[0]);
-    mmtmp_re = _mm_srai_epi32(mmtmp_re,15);
-    mmtmp_im = _mm_srai_epi32(mmtmp_im,15);
-    mmtmp_re2 = _mm_unpacklo_epi32(mmtmp_re,mmtmp_im);
-    mmtmp_im2 = _mm_unpackhi_epi32(mmtmp_re,mmtmp_im);
-
-    txptr128[0] = _mm_packs_epi32(mmtmp_re2,mmtmp_im2);
-    txptr128++;
-    kHz7_5ptr128++;  
-#elif defined(__arm__)
-
-    mmtmp0 = vmull_s16(((int16x4_t*)txptr128)[0],((int16x4_t*)kHz7_5ptr128)[0]);
-        //mmtmp0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])] 
-    mmtmp1 = vmull_s16(((int16x4_t*)txptr128)[1],((int16x4_t*)kHz7_5ptr128)[1]);
-        //mmtmp1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])] 
-    mmtmp_re = vcombine_s32(vpadd_s32(vget_low_s32(mmtmp0),vget_high_s32(mmtmp0)),
-                            vpadd_s32(vget_low_s32(mmtmp1),vget_high_s32(mmtmp1)));
-        //mmtmp_re = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] 
-
-    mmtmp0 = vmull_s16(vrev32_s16(vmul_s16(((int16x4_t*)txptr128)[0],*(int16x4_t*)conjugate75_2)),((int16x4_t*)kHz7_5ptr128)[0]);
-        //mmtmp0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])]
-    mmtmp1 = vmull_s16(vrev32_s16(vmul_s16(((int16x4_t*)txptr128)[1],*(int16x4_t*)conjugate75_2)), ((int16x4_t*)kHz7_5ptr128)[1]);
-        //mmtmp0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])]
-    mmtmp_im = vcombine_s32(vpadd_s32(vget_low_s32(mmtmp0),vget_high_s32(mmtmp0)),
-                            vpadd_s32(vget_low_s32(mmtmp1),vget_high_s32(mmtmp1)));
-        //mmtmp_im = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])]
-
-    txptr128[0] = vcombine_s16(vmovn_s32(mmtmp_re),vmovn_s32(mmtmp_im));
-    txptr128++;
-    kHz7_5ptr128++;
-#endif
-  }
-
-  //}
-}
-
+#include "modulation_extern.h"
 
 void remove_7_5_kHz(RU_t *ru,uint8_t slot)
 {
diff --git a/openair1/PHY/TOOLS/cadd_vv.c b/openair1/PHY/TOOLS/cadd_vv.c
index 34808552fc..77346a97f7 100644
--- a/openair1/PHY/TOOLS/cadd_vv.c
+++ b/openair1/PHY/TOOLS/cadd_vv.c
@@ -19,7 +19,8 @@
  *      contact@openairinterface.org
  */
 
-#include "defs.h"
+#include "PHY/defs_common.h"
+#include "tools_defs.h"
 
 
 int add_vector16(short *x,
diff --git a/openair1/PHY/TOOLS/cdot_prod.c b/openair1/PHY/TOOLS/cdot_prod.c
index 91ba246bdd..60bdcf45dd 100644
--- a/openair1/PHY/TOOLS/cdot_prod.c
+++ b/openair1/PHY/TOOLS/cdot_prod.c
@@ -19,7 +19,7 @@
  *      contact@openairinterface.org
  */
 
-#include "defs.h"
+#include "tools_defs.h"
 #include "PHY/sse_intrin.h"
 
 // returns the complex dot product of x and y
diff --git a/openair1/PHY/TOOLS/cmult_sv.c b/openair1/PHY/TOOLS/cmult_sv.c
index 61970ca2b6..013fedc6e9 100644
--- a/openair1/PHY/TOOLS/cmult_sv.c
+++ b/openair1/PHY/TOOLS/cmult_sv.c
@@ -20,7 +20,7 @@
  */
 
 #include "PHY/sse_intrin.h"
-#include "defs.h"
+#include "tools_defs.h"
 
 #if defined(__x86_64__) || defined(__i386__)
 #define simd_q15_t __m128i
diff --git a/openair1/PHY/TOOLS/cmult_vv.c b/openair1/PHY/TOOLS/cmult_vv.c
index 13facf6907..ce3ebec65f 100644
--- a/openair1/PHY/TOOLS/cmult_vv.c
+++ b/openair1/PHY/TOOLS/cmult_vv.c
@@ -19,7 +19,8 @@
  *      contact@openairinterface.org
  */
 
-#include "defs.h"
+#include "PHY/defs_common.h"
+#include "tools_defs.h"
 #include <stdio.h>
 
 #if defined(__x86_64__) || defined(__i386__)
diff --git a/openair1/PHY/TOOLS/dB_routines.c b/openair1/PHY/TOOLS/dB_routines.c
index c99703eaf3..572759a68c 100644
--- a/openair1/PHY/TOOLS/dB_routines.c
+++ b/openair1/PHY/TOOLS/dB_routines.c
@@ -19,7 +19,7 @@
  *      contact@openairinterface.org
  */
 
-#include "defs.h"
+#include "tools_defs.h"
 
 // Approximate 10*log10(x) in fixed point : x = 0...(2^32)-1
 
diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c
index 47b39ea7d2..9a5a504ec4 100644
--- a/openair1/PHY/TOOLS/lte_dfts.c
+++ b/openair1/PHY/TOOLS/lte_dfts.c
@@ -26,9 +26,9 @@
 #include <stdint.h>
 
 #ifndef MR_MAIN
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "defs.h"
+#include "PHY/defs_common.h"
+#include "PHY/impl_defs_top.h"
+#include "tools_defs.h"
 #else
 #include "time_meas.h"
 #include <math.h>
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.h b/openair1/PHY/TOOLS/lte_phy_scope.h
index 1d2b2ea1ed..af9858ebad 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.h
+++ b/openair1/PHY/TOOLS/lte_phy_scope.h
@@ -25,10 +25,9 @@
 #define FD_lte_scope_h_
 
 #include <forms.h>
-#include "../impl_defs_lte.h"
-#include "../impl_defs_top.h"
-#include "../defs.h"
-#include "../../SCHED/defs.h" // for OPENAIR_DAQ_VARS
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
+#include "PHY/impl_defs_top.h"
 
 
 /* Forms and Objects */
diff --git a/openair1/PHY/TOOLS/signal_energy.c b/openair1/PHY/TOOLS/signal_energy.c
index 918d2e3ba0..13f37c4c8d 100644
--- a/openair1/PHY/TOOLS/signal_energy.c
+++ b/openair1/PHY/TOOLS/signal_energy.c
@@ -19,7 +19,7 @@
  *      contact@openairinterface.org
  */
 
-#include "defs.h"
+#include "tools_defs.h"
 
 #include "PHY/sse_intrin.h"
 
diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h
index b92c2a4236..31174a11b6 100644
--- a/openair1/PHY/TOOLS/tools_defs.h
+++ b/openair1/PHY/TOOLS/tools_defs.h
@@ -31,7 +31,6 @@
 
 #include <stdint.h>
 
-#include "PHY/sse_intrin.h"
 
 
 struct complex {
diff --git a/openair1/PHY/phy_extern.h b/openair1/PHY/phy_extern.h
index 552163d308..4cb3cc538f 100644
--- a/openair1/PHY/phy_extern.h
+++ b/openair1/PHY/phy_extern.h
@@ -32,23 +32,21 @@ extern  char fmageren_name2[512];
 extern unsigned int RX_DMA_BUFFER[4][NB_ANTENNAS_RX];
 extern unsigned int TX_DMA_BUFFER[4][NB_ANTENNAS_TX];
 
-#include "PHY/LTE_TRANSPORT/extern.h"
-#include "SIMULATION/ETH_TRANSPORT/extern.h"
+#include "PHY/LTE_TRANSPORT/transport_extern.h"
+//#include "SIMULATION/ETH_TRANSPORT/extern.h"
 
 extern unsigned int DAQ_MBOX;
 extern int number_of_cards;
 
 
 #ifndef OCP_FRAMEWORK
-extern PHY_VARS_UE ***PHY_vars_UE_g;
 //extern PHY_VARS_eNB ***PHY_vars_eNB_g;
 extern RAN_CONTEXT_t RC;
-extern PHY_VARS_RN **PHY_vars_RN_g;
 extern LTE_DL_FRAME_PARMS *lte_frame_parms_g;
 #else
 #define MAX_UE 10
 #define MAX_eNB 20
-extern PHY_VARS_UE * PHY_vars_UE_g[MAX_UE][MAX_NUM_CCs];
+
 extern PHY_VARS_eNB * PHY_vars_eNB_g[MAX_eNB][MAX_NUM_CCs];
 #endif
 
@@ -70,7 +68,7 @@ extern int flagMag;
 
 extern char mode_string[4][20];
 
-#include "PHY/LTE_TRANSPORT/extern.h"
+
 
 extern unsigned char NB_RU;
 
diff --git a/openair1/PHY/phy_vars.h b/openair1/PHY/phy_vars.h
index e8f4e27de1..783a151046 100644
--- a/openair1/PHY/phy_vars.h
+++ b/openair1/PHY/phy_vars.h
@@ -23,7 +23,8 @@
 #define __PHY_VARS_H__
 
 #include "PHY/types.h"
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
 #include "common/ran_context.h"
 
 char* namepointer_chMag ;
@@ -37,7 +38,9 @@ int16_t *primary_synch1_time;
 int16_t *primary_synch2_time;
 
 
-#include "PHY/CODING/vars.h"
+#include "PHY/CODING/coding_vars.h"
+#include "PHY/LTE_TRANSPORT/transport_vars.h"
+#include "PHY/MODULATION/modulation_vars.h"
 
 //PHY_VARS *PHY_vars;
 #ifndef OCP_FRAMEWORK
@@ -58,7 +61,7 @@ unsigned short rev256[256],rev512[512],rev1024[1024],rev4096[4096],rev2048[2048]
 
 
 char mode_string[4][20] = {"NOT SYNCHED","PRACH","RAR","PUSCH"};
-#include "PHY/LTE_TRANSPORT/vars.h"
+
 
 
 
diff --git a/openair1/SCHED/fapi_l1.h b/openair1/SCHED/fapi_l1.h
index df990fa362..efb028f464 100644
--- a/openair1/SCHED/fapi_l1.h
+++ b/openair1/SCHED/fapi_l1.h
@@ -32,8 +32,9 @@
 
 #include "PHY/defs_eNB.h"
 #include "PHY/phy_extern.h"
+#include "PHY/LTE_TRANSPORT/transport_proto.h"
 #include "SCHED/sched_eNB.h"
-#include "SCHED/sched_extern_eNB.h"
+#include "SCHED/sched_common.h"
 #include "nfapi_interface.h"
 
 void fill_uci_harq_indication(PHY_VARS_eNB *eNB,LTE_eNB_UCI *uci,int frame,int subframe,uint8_t *harq_ack,uint8_t tdd_mapping_mode,uint16_t tdd_multiplexing_mask);
diff --git a/openair1/SCHED/phy_procedures_lte_common.c b/openair1/SCHED/phy_procedures_lte_common.c
index bbb6986ce9..2274eb467d 100644
--- a/openair1/SCHED/phy_procedures_lte_common.c
+++ b/openair1/SCHED/phy_procedures_lte_common.c
@@ -29,10 +29,8 @@
 * \note
 * \warning
 */
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "SCHED/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
 
 void get_Msg3_alloc(LTE_DL_FRAME_PARMS *frame_parms,
                     unsigned char current_subframe,
@@ -831,12 +829,7 @@ dci_detect_mode_t dci_detect_mode_select(LTE_DL_FRAME_PARMS *frame_parms,uint8_t
   return ret;
 }
 
-lte_subframe_t get_subframe_direction(uint8_t Mod_id,uint8_t CC_id,uint8_t subframe)
-{
-
-  return(subframe_select(&RC.eNB[Mod_id][CC_id]->frame_parms,subframe));
 
-}
 
 uint8_t phich_subframe_to_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t subframe)
 {
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 780d3a1a6f..162c091932 100644
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -30,10 +30,10 @@
  * \warning
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "SCHED/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "SCHED/sched_eNB.h"
+#include "SCHED/sched_common_extern.h"
 #include "nfapi_interface.h"
 #include "fapi_l1.h"
 #include "UTIL/LOG/log.h"
@@ -51,11 +51,90 @@
 #endif
 
 extern uint8_t nfapi_mode;
+
+
+
+int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *eNB,uint8_t UE_id,uint8_t harq_pid, uint8_t bw_factor)
+{
+
+  uint32_t Nre,sumKr,MPR_x100,Kr,r;
+  uint16_t beta_offset_pusch;
+
+  DevAssert( UE_id < NUMBER_OF_UE_MAX+1 );
+  DevAssert( harq_pid < 8 );
+
+  Nre = eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_initial *
+        eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12;
+
+  sumKr = 0;
+
+  for (r=0; r<eNB->ulsch[UE_id]->harq_processes[harq_pid]->C; r++) {
+    if (r<eNB->ulsch[UE_id]->harq_processes[harq_pid]->Cminus)
+      Kr = eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kminus;
+    else
+      Kr = eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus;
+
+    sumKr += Kr;
+  }
+
+  if (Nre==0)
+    return(0);
+
+  MPR_x100 = 100*sumKr/Nre;
+  // Note: MPR=is the effective spectral efficiency of the PUSCH
+  // FK 20140908 sumKr is only set after the ulsch_encoding
+
+  beta_offset_pusch = 8;
+  //(eNB->ulsch[UE_id]->harq_processes[harq_pid]->control_only == 1) ? eNB->ulsch[UE_id]->beta_offset_cqi_times8:8;
+
+  DevAssert( UE_id < NUMBER_OF_UE_MAX );
+//#warning "This condition happens sometimes. Need more investigation" // navid
+  //DevAssert( MPR_x100/6 < 100 );
+
+  if (1==1) { //eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled == 1) {
+    // This is the formula from Section 5.1.1.1 in 36.213 10*log10(deltaIF_PUSCH = (2^(MPR*Ks)-1)*beta_offset_pusch)
+    if (bw_factor == 1) {
+      uint8_t nb_rb = eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb;
+      return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3)) + hundred_times_log10_NPRB[nb_rb-1];
+    } else
+      return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3));
+  } else {
+    return(0);
+  }
+}
+
+
+int16_t get_hundred_times_delta_IF_mac(module_id_t module_idP, uint8_t CC_id, rnti_t rnti, uint8_t harq_pid)
+{
+
+  int8_t UE_id;
+
+  if ((RC.eNB == NULL) || (module_idP > RC.nb_inst) || (CC_id > RC.nb_CC[module_idP])) {
+    LOG_E(PHY,"get_UE_stats: No eNB found (or not allocated) for Mod_id %d,CC_id %d\n",module_idP,CC_id);
+    return -1;
+  }
+
+  UE_id = find_ulsch( rnti, RC.eNB[module_idP][CC_id],SEARCH_EXIST);
+
+  if (UE_id == -1) {
+    // not found
+    return 0;
+  }
+
+  return get_hundred_times_delta_IF_eNB( RC.eNB[module_idP][CC_id], UE_id, harq_pid, 0 );
+}
+
 int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind);
 
 
+lte_subframe_t get_subframe_direction(uint8_t Mod_id,uint8_t CC_id,uint8_t subframe)
+{
 
-void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn,relaying_type_t r_type) {
+  return(subframe_select(&RC.eNB[Mod_id][CC_id]->frame_parms,subframe));
+
+}
+
+void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
 
 
 #if defined(Rel10) || defined(Rel14)
@@ -84,50 +163,17 @@ void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn,rel
 				    proc->frame_tx,
 				    subframe);
   */
-  switch (r_type) {
-  case no_relay:
-    if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0
-      LOG_D(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n",
-	    eNB->Mod_id,proc->frame_tx,subframe,mch_pduP->mcs,
-	    eNB->dlsch_MCH->harq_processes[0]->TBS>>3);
-    else {
-      LOG_D(PHY,"[DeNB %"PRIu8"] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %"PRIu8" (%s)\n",
-	    eNB->Mod_id,proc->frame_tx,subframe,mch_pduP->sync_area,
-	    (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment");
-      mch_pduP = NULL;
-    }
-    
-    break;
-    
-  case multicast_relay:
-    if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)) {
-      LOG_D(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Got the MCH PDU for MBSFN  sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n",
-	    rn->Mod_id,rn->frame, subframe,
-	    mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size);
-    } else if (rn->mch_avtive[subframe%5] == 1) { // SF2 -> SF7, SF3 -> SF8
-      mch_pduP= &mch_pdu;
-      memcpy(&mch_pduP->payload, // could be a simple copy
-	     rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->b,
-	     rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3);
-      mch_pduP->Pdu_size = (uint16_t) (rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3);
-      mch_pduP->mcs = rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->mcs;
-      LOG_D(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n",
-	    rn->Mod_id,rn->frame, subframe,subframe%5,
-	    rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size);
-    } else {
-      mch_pduP=NULL;
-    }
-    
-    rn->mch_avtive[subframe]=0;
-    break;
+  if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0
+    LOG_D(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n",
+	  eNB->Mod_id,proc->frame_tx,subframe,mch_pduP->mcs,
+	  eNB->dlsch_MCH->harq_processes[0]->TBS>>3);
+  else {
+    LOG_D(PHY,"[DeNB %"PRIu8"] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %"PRIu8" (%s)\n",
+	  eNB->Mod_id,proc->frame_tx,subframe,mch_pduP->sync_area,
+	  (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment");
+    mch_pduP = NULL;
+  }
     
-  default:
-    LOG_W(PHY,"[eNB %"PRIu8"] Frame %d subframe %d: unknown relaying type %d \n",
-	  eNB->Mod_id,proc->frame_tx,subframe,r_type);
-    mch_pduP=NULL;
-    break;
-  }// switch
-  
   if (mch_pduP) {
     fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0);
     // Generate PMCH
@@ -398,11 +444,8 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
 
 void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
 			   eNB_rxtx_proc_t *proc,
-                           relaying_type_t r_type,
-			   PHY_VARS_RN *rn,
 			   int do_meas)
 {
-  UNUSED(rn);
   int frame=proc->frame_tx;
   int subframe=proc->subframe_tx;
   uint32_t i,aa;
@@ -433,7 +476,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
 
   if (nfapi_mode == 0 || nfapi_mode == 1) {
     if (is_pmch_subframe(frame,subframe,fp)) {
-      pmch_procedures(eNB,proc,rn,r_type);
+      pmch_procedures(eNB,proc);
     }
     else {
       // this is not a pmch subframe, so generate PSS/SSS/PBCH
@@ -1879,7 +1922,7 @@ void fill_crc_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe,uint
   pthread_mutex_unlock(&eNB->UL_INFO_mutex);
 }
 
-void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const relaying_type_t r_type)
+void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
 {
   //RX processing for ue-specific resources (i
   LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
diff --git a/openair1/SCHED/prach_procedures.c b/openair1/SCHED/prach_procedures.c
index 4730eed613..772dff3bfd 100644
--- a/openair1/SCHED/prach_procedures.c
+++ b/openair1/SCHED/prach_procedures.c
@@ -30,10 +30,9 @@
  * \warning
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "SCHED/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "SCHED/sched_eNB.h"
 #include "nfapi_interface.h"
 #include "fapi_l1.h"
 #include "nfapi_pnf.h"
diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c
index 534023632c..a22b26a720 100644
--- a/openair1/SCHED/ru_procedures.c
+++ b/openair1/SCHED/ru_procedures.c
@@ -30,16 +30,14 @@
  * \warning
  */
 
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "SCHED/extern.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/phy_extern.h"
+#include "SCHED/sched_eNB.h"
 
 #include "PHY/LTE_TRANSPORT/if4_tools.h"
 #include "PHY/LTE_TRANSPORT/if5_tools.h"
 
-#include "LAYER2/MAC/extern.h"
-#include "LAYER2/MAC/defs.h"
+#include "LAYER2/MAC/mac.h"
 #include "UTIL/LOG/log.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
diff --git a/openair1/SCHED/sched_eNB_extern.h b/openair1/SCHED/sched_common_extern.h
similarity index 88%
rename from openair1/SCHED/sched_eNB_extern.h
rename to openair1/SCHED/sched_common_extern.h
index b1e8df67ef..b5edc6f38e 100644
--- a/openair1/SCHED/sched_eNB_extern.h
+++ b/openair1/SCHED/sched_common_extern.h
@@ -24,16 +24,7 @@
 #ifndef __SCHED_EXTERN_H__
 #define __SCHED_EXTERN_H__
 
-#include "defs.h"
-//#include "dlc_engine.h"
-
-extern int openair_sched_status;
-
-//extern int exit_PHY;
-//extern int exit_PHY_ack;
-
-extern int synch_wait_cnt;
-
+#include "sched_eNB.h"
 
 extern int16_t hundred_times_delta_TF[100];
 extern uint16_t hundred_times_log10_NPRB[100];
diff --git a/openair1/SCHED/sched_common_vars.h b/openair1/SCHED/sched_common_vars.h
new file mode 100644
index 0000000000..2cae2aa96f
--- /dev/null
+++ b/openair1/SCHED/sched_common_vars.h
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdint.h>
+
+
+// This is the formula from Section 5.1.1.1 in 36.213 100*10*log10((2^(MPR*Ks)-1)), where MPR is in the range [0,6] and Ks=1.25
+int16_t hundred_times_delta_TF[100] = {-32768,-1268,-956,-768,-631,-523,-431,-352,-282,-219,-161,-107,-57,-9,36,79,120,159,197,234,269,304,337,370,402,434,465,495,525,555,583,612,640,668,696,723,750,777,803,829,856,881,907,933,958,983,1008,1033,1058,1083,1108,1132,1157,1181,1205,1229,1254,1278,1302,1325,1349,1373,1397,1421,1444,1468,1491,1515,1538,1562,1585,1609,1632,1655,1679,1702,1725,1748,1772,1795,1818,1841,1864,1887,1910,1933,1956,1980,2003,2026,2049,2072,2095,2118,2141,2164,2186,2209,2232,2255};
+uint16_t hundred_times_log10_NPRB[100] = {0,301,477,602,698,778,845,903,954,1000,1041,1079,1113,1146,1176,1204,1230,1255,1278,1301,1322,1342,1361,1380,1397,1414,1431,1447,1462,1477,1491,1505,1518,1531,1544,1556,1568,1579,1591,1602,1612,1623,1633,1643,1653,1662,1672,1681,1690,1698,1707,1716,1724,1732,1740,1748,1755,1763,1770,1778,1785,1792,1799,1806,1812,1819,1826,1832,1838,1845,1851,1857,1863,1869,1875,1880,1886,1892,1897,1903,1908,1913,1919,1924,1929,1934,1939,1944,1949,1954,1959,1963,1968,1973,1977,1982,1986,1991,1995,2000};
+
diff --git a/openair1/SCHED/sched_eNB.h b/openair1/SCHED/sched_eNB.h
index 3c232a82b7..a386fbf976 100644
--- a/openair1/SCHED/sched_eNB.h
+++ b/openair1/SCHED/sched_eNB.h
@@ -25,11 +25,11 @@
   \email knopp@eurecom.fr
 */
 
-#ifndef __openair_SCHED_H__
-#define __openair_SCHED_H__
+#ifndef __openair_SCHED_ENB_H__
+#define __openair_SCHED_ENB_H__
 
-#include "PHY/defs.h"
-#include "PHY_INTERFACE/defs.h"
+#include "PHY/defs_eNB.h"
+#include "PHY_INTERFACE/phy_interface.h"
 
 enum THREAD_INDEX { OPENAIR_THREAD_INDEX = 0,
                     TOP_LEVEL_SCHEDULER_THREAD_INDEX,
@@ -86,98 +86,18 @@ enum openair_HARQ_TYPE {
 
 
 
-/*! \brief Top-level entry routine for eNB procedures.  Called every slot by process scheduler. In even slots, it performs RX functions from previous subframe (if required).  On odd slots, it generate TX waveform for the following subframe.
-  @param subframe Index of current subframe (0-9)
-  @param phy_vars_eNB Pointer to eNB variables on which to act
-  @param abstraction_flag Indicator of PHY abstraction
-  @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
-  @param *phy_vars_rn pointer to RN variables
-*/
-void phy_procedures_eNB_lte(uint8_t subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t abstraction_flag, relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn);
-
-/*! \brief Top-level entry routine for UE procedures.  Called every slot by process scheduler. In even slots, it performs RX functions from previous subframe (if required).  On odd slots, it generate TX waveform for the following subframe.
-  @param phy_vars_ue Pointer to UE variables on which to act
-  @param eNB_id ID of eNB on which to act
-  @param abstraction_flag Indicator of PHY abstraction
-  @param mode calibration/debug mode
-  @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
-  @param *phy_vars_rn pointer to RN variables
-*/
-void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
-
-#if defined(Rel10) || defined(Rel14)
-/*! \brief Top-level entry routine for relay node procedures when acting as eNB. This proc will make us of the existing eNB procs.
-  @param last_slot Index of last slot (0-19)
-  @param next_slot Index of next_slot (0-19)
-  @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
-*/
-int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, relaying_type_t r_type);
-/*! \brief Top-level entry routine for relay node procedures actinf as UE. This proc will make us of the existing UE procs.
-  @param last_slot Index of last slot (0-19)
-  @param next_slot Index of next_slot (0-19)
-  @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
-*/
-int phy_procedures_RN_UE_RX(unsigned char last_slot, unsigned char next_slot, relaying_type_t r_type);
-#endif
-
-/*! \brief Scheduling for UE TX procedures in normal subframes.
-  @param phy_vars_ue Pointer to UE variables on which to act
-  @param proc Pointer to RXn-TXnp4 proc information
-  @param eNB_id Local id of eNB on which to act
-  @param abstraction_flag Indicator of PHY abstraction
-  @param mode calib/normal mode
-  @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
-*/
-void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type);
-/*! \brief Scheduling for UE RX procedures in normal subframes.
-  @param last_slot Index of last slot (0-19)
-  @param phy_vars_ue Pointer to UE variables on which to act
-  @param proc Pointer to RXn_TXnp4 proc information
-  @param eNB_id Local id of eNB on which to act
-  @param abstraction_flag Indicator of PHY abstraction
-  @param mode calibration/debug mode
-  @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
-  @param phy_vars_rn pointer to RN variables
-*/
-int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
-int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,
-                                              uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,
-                                              relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
-#ifdef UE_SLOT_PARALLELISATION
-void *UE_thread_slot1_dl_processing(void *arg);
-#endif
-
-/*! \brief Scheduling for UE TX procedures in TDD S-subframes.
-  @param phy_vars_ue Pointer to UE variables on which to act
-  @param eNB_id Local id of eNB on which to act
-  @param abstraction_flag Indicator of PHY abstraction
-  @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
-*/
-void phy_procedures_UE_S_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type);
-
-/*! \brief Scheduling for UE RX procedures in TDD S-subframes.
-  @param phy_vars_ue Pointer to UE variables on which to act
-  @param eNB_id Local id of eNB on which to act
-  @param abstraction_flag Indicator of PHY abstraction
-  @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
-*/
-void phy_procedures_UE_S_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag, relaying_type_t r_type);
-
 /*! \brief Scheduling for eNB TX procedures in normal subframes.
   @param phy_vars_eNB Pointer to eNB variables on which to act
   @param abstraction_flag Indicator of PHY abstraction
-  @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
-  @param phy_vars_rn pointer to the RN variables
   @param do_meas Do inline timing measurement
 */
-void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn,int do_meas);
+void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,int do_meas);
 
 /*! \brief Scheduling for eNB RX UE-specific procedures in normal subframes.
   @param phy_vars_eNB Pointer to eNB variables on which to act
   @param proc Pointer to RXn-TXnp4 proc information
-  @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
 */
-void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type);
+void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc);
 
 /*! \brief Scheduling for eNB TX procedures in TDD S-subframes.
   @param phy_vars_eNB Pointer to eNB variables on which to act
@@ -193,16 +113,14 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *pr
 
 /*! \brief Scheduling for eNB TX procedures in TDD S-subframes.
   @param phy_vars_eNB Pointer to eNB variables on which to act
-  @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
 */
 
-void phy_procedures_eNB_S_TX(PHY_VARS_eNB *phy_vars_eNB,relaying_type_t r_type);
+void phy_procedures_eNB_S_TX(PHY_VARS_eNB *phy_vars_eNB);
 
 /*! \brief Scheduling for eNB RX procedures in TDD S-subframes.
   @param phy_vars_eNB Pointer to eNB variables on which to act
-  @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
 */
-void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type);
+void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc);
 
 /*! \brief Scheduling for eNB PRACH RX procedures
   @param phy_vars_eNB Pointer to eNB variables on which to act
@@ -215,44 +133,6 @@ void prach_procedures(PHY_VARS_eNB *eNB,
 void prach_procedures(PHY_VARS_eNB *eNB);
 #endif
 
-/*! \brief Function to compute subframe Number(DL and S) as a function of Frame type and TDD Configuration
-  @param frame_parms Pointer to DL frame parameter descriptor
-  @returns Subframe Number (DL,S)
-*/
-int subframe_num(LTE_DL_FRAME_PARMS *frame_parms);
-
-/*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index.
-  @param frame_parms Pointer to DL frame parameter descriptor
-  @param subframe Subframe index
-  @returns Subframe type (DL,UL,S)
-*/
-
-
-lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
-
-
-/*! \brief Function to compute which type of DCIs to detect in the given subframe
-  @param frame_parms Pointer to DL frame parameter descriptor
-  @param subframe Subframe index
-  @returns DCI detetion mode type (no DCIs, uplink DCIs, downlink DCIs, both uplink and downlink DCIs)
- */
-dci_detect_mode_t dci_detect_mode_select(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
-
-/*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index.  Same as subframe_select, except that it uses the Mod_id and is provided as a service to the MAC scheduler.
-  @param Mod_id Index of eNB
-  @param CC_id Component Carrier Index
-  @param subframe Subframe index
-  @returns Subframe type (DL,UL,S)
-*/
-lte_subframe_t get_subframe_direction(uint8_t Mod_id, uint8_t CC_id,uint8_t subframe);
-
-/*! \brief Function to indicate PHICH transmission subframes.  Implements Table 9.1.2-1 for TDD.
-  @param frame_parms Pointer to DL frame parameter descriptor
-  @param subframe Subframe index
-  @returns 1 if PHICH can be transmitted in subframe (always 1 for FDD)
-*/
-uint32_t is_phich_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
-
 /*! \brief Function to compute timing of Msg3 transmission on UL-SCH (first UE transmission in RA procedure). This implements the timing in paragraph a) from Section 6.1.1 in 36.213 (p. 17 in version 8.6).  Used by eNB upon transmission of random-access response (RA_RNTI) to program corresponding ULSCH reception procedure.  Used by UE upon reception of random-access response (RA_RNTI) to program corresponding ULSCH transmission procedure.  This does not support the UL_delay field in RAR (always assumed to be 0).
   @param frame_parms Pointer to DL frame parameter descriptor
   @param current_subframe Index of subframe where RA_RNTI was received
@@ -300,70 +180,6 @@ uint8_t get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t
  */
 void ra_failed(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
 
-/*! \brief Function to indicate success of contention resolution or RA procedure.
-    @param Mod_id Instance index of UE
-    @param CC_id Component Carrier Index
-    @param eNB_index Index of eNB
- */
-void ra_succeeded(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
-
-uint8_t phich_subframe_to_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t subframe);
-
-/*! \brief Get PDSCH subframe (n+k) from PDCCH subframe n using relationship from Table 8-2 from 36.213
-   @param frame_parms Pointer to DL Frame Parameters
-   @param n subframe of PDCCH
-   @returns PDSCH subframe (0 ... 7) (note: this is n+k from Table 8-2)
- */
-uint8_t pdcch_alloc2ul_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n);
-
-
-/*! \brief Compute ACK/NACK information for PUSCH/PUCCH for UE transmission in subframe n. This function implements table 10.1-1 of 36.213, p. 69.
-  @param frame_parms Pointer to DL frame parameter descriptor
-  @param harq_ack Pointer to dlsch_ue harq_ack status descriptor
-  @param subframe Subframe for UE transmission (n in 36.213)
-  @param o_ACK Pointer to ACK/NAK payload for PUCCH/PUSCH
-  @returns status indicator for PUCCH/PUSCH transmission
-*/
-uint8_t get_ack(LTE_DL_FRAME_PARMS *frame_parms,harq_status_t *harq_ack,uint8_t subframe_tx,uint8_t subframe_rx,uint8_t *o_ACK, uint8_t cw_idx);
-
-/*! \brief Reset ACK/NACK information
-  @param frame_parms Pointer to DL frame parameter descriptor
-  @param harq_ack Pointer to dlsch_ue harq_ack status descriptor
-  @param subframe Subframe for UE transmission (n in 36.213)
-  @param o_ACK Pointer to ACK/NAK payload for PUCCH/PUSCH
-  @returns status indicator for PUCCH/PUSCH transmission
-*/
-uint8_t reset_ack(LTE_DL_FRAME_PARMS *frame_parms,
-                harq_status_t *harq_ack,
-                unsigned char subframe_tx,
-                unsigned char subframe_rx,
-                unsigned char *o_ACK,
-                uint8_t *pN_bundled,
-                uint8_t cw_idx);
-
-/*! \brief Compute UL ACK subframe from DL subframe. This is used to retrieve corresponding DLSCH HARQ pid at eNB upon reception of ACK/NAK information on PUCCH/PUSCH.  Derived from Table 10.1-1 in 36.213 (p. 69 in version 8.6)
-  @param frame_parms Pointer to DL frame parameter descriptor
-  @param subframe Subframe for UE transmission (n in 36.213)
-  @param ACK_index TTI bundling index (0,1)
-  @returns Subframe index for corresponding DL transmission
-*/
-uint8_t ul_ACK_subframe2_dl_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe,uint8_t ACK_index);
-
-/*! \brief Computes number of DL subframes represented by a particular ACK received on UL (M from Table 10.1-1 in 36.213, p. 69 in version 8.6)
-  @param frame_parms Pointer to DL frame parameter descriptor
-  @param subframe Subframe for UE transmission (n in 36.213)
-  @returns Number of DL subframes (M)
-*/
-uint8_t ul_ACK_subframe2_M(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe);
-
-/*! \brief Indicates the SR TXOp in current subframe.  Implements Table 10.1-5 from 36.213.
-  @param phy_vars_ue Pointer to UE variables
-  @param proc Pointer to RXn_TXnp4 thread context
-  @param eNB_id ID of eNB which is to receive the SR
-  @returns 1 if TXOp is active.
-*/
-uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id);
-
 /*! \brief Indicates the SR TXOp in current subframe for eNB and particular UE index.  Implements Table 10.1-5 from 36.213.
   @param phy_vars_eNB Pointer to eNB variables
   @param UE_id ID of UE which may be issuing the SR
@@ -371,147 +187,26 @@ uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id)
 */
 uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id);
 
-/*! \brief Gives the UL subframe corresponding to a PDDCH order in subframe n
-  @param frame_parms Pointer to DL frame parameters
-  @param proc Pointer to RXn-TXnp4 proc information
-  @param n subframe of PDCCH
-  @returns UL subframe corresponding to pdcch order
-*/
-uint8_t pdcch_alloc2ul_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n);
-
-/*! \brief Gives the UL frame corresponding to a PDDCH order in subframe n
-  @param frame_parms Pointer to DL frame parameters
-  @param frame Frame of received PDCCH
-  @param n subframe of PDCCH
-  @returns UL frame corresponding to pdcch order
-*/
-uint32_t pdcch_alloc2ul_frame(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t n);
-
-
-uint16_t get_Np(uint8_t N_RB_DL,uint8_t nCCE,uint8_t plus1);
-
-
 int8_t find_ue_dlsch(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
 int8_t find_ue_ulsch(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
 
-//int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
-//int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rnti);
-
-void process_timing_advance(module_id_t Mod_id,uint8_t CC_id,int16_t timing_advance);
-void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint16_t timing_advance);
-
-unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb);
-
-void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
-
-/*! \brief This function retrives the resource (n1_pucch) corresponding to a PDSCH transmission in
-subframe n-4 which is acknowledged in subframe n (for FDD) according to n1_pucch = Ncce + N1_pucch.  For
-TDD, this routine computes the complex procedure described in Section 10.1 of 36.213 (through tables 10.1-1,10.1-2)
-@param phy_vars_ue Pointer to UE variables
-@param proc Pointer to RXn-TXnp4 proc information
-@param harq_ack Pointer to dlsch_ue harq_ack status descriptor
-@param eNB_id Index of eNB
-@param b Pointer to PUCCH payload (b[0],b[1])
-@param SR 1 means there's a positive SR in parallel to ACK/NAK
-@returns n1_pucch
-*/
-uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue,
-		      UE_rxtx_proc_t *proc,
-                      harq_status_t *harq_ack,
-                      uint8_t eNB_id,
-                      uint8_t *b,
-                      uint8_t SR);
-
-/*! \brief This function retrives the resource (n1_pucch) corresponding to a PDSCH transmission in
-subframe n-4 which is acknowledged in subframe n (for FDD) according to n1_pucch = Ncce + N1_pucch.  For
-TDD, this routine computes the procedure described in Section 10.1 of 36.213 (through tables 10.1-1,10.1-2)
-@param phy_vars_eNB Pointer to eNB variables
-@param proc Pointer to RXn-TXnp4 proc information
-@param eNB_id Index of eNB
-@param subframe Index of subframe
-@param b Pointer to PUCCH payload (b[0],b[1])
-@param n1_pucch0 Pointer to n1_pucch0
-@param n1_pucch1 Pointer to n1_pucch1
-@param n1_pucch2 Pointer to n1_pucch2
-@param n1_pucch3 Pointer to n1_pucch3
-*/
-void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
-		      eNB_rxtx_proc_t *proc,
-                      uint8_t UE_id,
-                      int16_t *n1_pucch0,
-                      int16_t *n1_pucch1,
-                      int16_t *n1_pucch2,
-                      int16_t *n1_pucch3);
 
 
-/*! \brief This function retrieves the harq_pid of the corresponding DLSCH process and updates the error statistics of the DLSCH based on the received ACK info from UE along with the round index.  It also performs the fine-grain rate-adaptation based on the error statistics derived from the ACK/NAK process.
-  @param UE_id Local UE index on which to act
-  @param phy_vars_eNB Pointer to eNB variables on which to act
-  @param proc Pointer to RXn-TXnp4 proc information
-  @param pusch_flag Indication that feedback came from PUSCH
-  @param pucch_payload Resulting payload from pucch
-  @param pucch_sel Selection of n1_pucch0 or n1_pucch1 (TDD specific)
-  @param SR_payload Indication of SR presence (TDD specific)
-*/
-void process_HARQ_feedback(uint8_t UE_id,
-                           PHY_VARS_eNB *phy_vars_eNB,
-			   eNB_rxtx_proc_t *proc,
-                           uint8_t pusch_flag,
-                           uint8_t *pucch_payload,
-                           uint8_t pucch_sel,
-                           uint8_t SR_payload);
-
-/*! \brief This function retrieves the PHY UE mode. It is used as a helper function for the UE MAC.
-  @param Mod_id Local UE index on which to act
-  @param CC_id Component Carrier Index
-  @param eNB_index ID of eNB
-  @returns UE mode
-*/
-UE_MODE_t get_ue_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
-
-/*! \brief This function implements the power control mechanism for PUCCH from 36.213.
-    @param phy_vars_ue PHY variables
-    @param proc Pointer to proc descriptor
-    @param eNB_id Index of eNB
-    @param pucch_fmt Format of PUCCH that is being transmitted
-    @returns Transmit power
- */
-int16_t pucch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt);
-
-/*! \brief This function implements the power control mechanism for PUCCH from 36.213.
-    @param phy_vars_ue PHY variables
-    @param proc Pointer to proc descriptor
-    @param eNB_id Index of eNB
-    @param j index of type of PUSCH (SPS, Normal, Msg3)
-    @returns Transmit power
- */
-void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag);
-
-/*! \brief This function implements the power control mechanism for SRS from 36.213.
-    @param phy_vars_ue PHY variables
-    @param proc Pointer to proc descriptor
-    @param eNB_id Index of eNB
-    @param j index of type of PUSCH (SPS, Normal, Msg3)
-    @returns Transmit power
- */
-void srs_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t *pnb_rb_srs, uint8_t abstraction_flag);
-
-void get_cqipmiri_params(PHY_VARS_UE *ue,uint8_t eNB_id);
 
-int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id, uint8_t eNB_index);
 
 void schedule_response(Sched_Rsp_t *Sched_INFO);
 
 LTE_eNB_UE_stats* get_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti);
 
+/*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index.  Same as subframe_select, except that it uses the Mod_id and is provided as a service to the MAC scheduler.
+  @param Mod_id Index of eNB
+  @param CC_id Component Carrier Index
+  @param subframe Subframe index
+  @returns Subframe type (DL,UL,S)
+*/
+lte_subframe_t get_subframe_direction(uint8_t Mod_id,uint8_t CC_id,uint8_t subframe);
 
 
-LTE_DL_FRAME_PARMS *get_lte_frame_parms(module_id_t Mod_id, uint8_t CC_id);
-
-MU_MIMO_mode* get_mu_mimo_mode (module_id_t Mod_id, uint8_t CC_id, rnti_t rnti);
-
-int16_t get_hundred_times_delta_IF(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t harq_pid);
-
 int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t harq_pid, uint8_t bw_factor);
 
 int16_t get_hundred_times_delta_IF_mac(module_id_t module_idP, uint8_t CC_id, rnti_t rnti, uint8_t harq_pid);
@@ -519,15 +214,6 @@ int16_t get_hundred_times_delta_IF_mac(module_id_t module_idP, uint8_t CC_id, rn
 int16_t get_target_pusch_rx_power(module_id_t module_idP, uint8_t CC_id);
 int16_t get_target_pucch_rx_power(module_id_t module_idP, uint8_t CC_id);
 
-int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,int frame, uint8_t subframe,uint8_t *harq_pid,uint8_t *round,uint8_t ul_flag);
-
-void dump_dlsch(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid);
-void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe);
-void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe);
-
-void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe, unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid);
-
-
 int is_srs_occasion_common(LTE_DL_FRAME_PARMS *frame_parms,int frame_tx,int subframe_tx);
 
 void compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset);
diff --git a/openair1/SCHED_UE/phy_procedures_lte_ue.c b/openair1/SCHED_UE/phy_procedures_lte_ue.c
index 2635649589..2edcb22480 100644
--- a/openair1/SCHED_UE/phy_procedures_lte_ue.c
+++ b/openair1/SCHED_UE/phy_procedures_lte_ue.c
@@ -33,22 +33,19 @@
 #define _GNU_SOURCE
 
 #include "assertions.h"
-#include "defs.h"
-#include "PHY/defs.h"
-#include "PHY/extern.h"
-#include "SCHED/defs.h"
-#include "SCHED/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_extern_ue.h"
 #include <sched.h>
 #include "targets/RT/USER/lte-softmodem.h"
-
+#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
+#include "SCHED_UE/sched_UE.h"
 #define DEBUG_PHY_PROC
 
 #ifndef PUCCH
 #define PUCCH
 #endif
 
-#include "LAYER2/MAC/extern.h"
-#include "LAYER2/MAC/defs.h"
+#include "LAYER2/MAC/mac.h"
 #include "UTIL/LOG/log.h"
 
 #include "UTIL/LOG/vcd_signal_dumper.h"
@@ -58,13 +55,13 @@
 # include "intertask_interface.h"
 #endif
 
-#include "PHY/defs.h"
+#include "PHY/defs_UE.h"
 
-#include "PHY/CODING/extern.h"
+#include "PHY/CODING/coding_extern.h"
 
 #include "T.h"
 
-#include "PHY/TOOLS/defs.h"
+#include "PHY/TOOLS/tools_defs.h"
 
 #define DLSCH_RB_ALLOC 0x1fbf  // skip DC RB (total 23/25 RBs)
 #define DLSCH_RB_ALLOC_12 0x0aaa  // skip DC RB (total 23/25 RBs)
@@ -1389,7 +1386,6 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
 						frame_tx,
 						eNB_id,
 						subframe_tx);
-      LOG_D(PHY,"Got prach_resources for eNB %d address %p, RRCCommon %p\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[ue->Mod_id].radioResourceConfigCommon);
       LOG_D(PHY,"Prach resources %p\n",ue->prach_resources[eNB_id]);
     }
   }
@@ -2333,7 +2329,7 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
 
 }
 
-void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) {
+void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode) {
 
 
   LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
@@ -2452,7 +2448,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,ui
 #endif
 }
 
-void phy_procedures_UE_S_TX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type)
+void phy_procedures_UE_S_TX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag)
 {
   int aa;//i,aa;
   LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
@@ -4138,8 +4134,7 @@ void *UE_thread_slot1_dl_processing(void *arg) {
 
 #ifdef UE_SLOT_PARALLELISATION
 int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,
-        uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,
-        relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn)  {
+        uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode)  {
 
     int l,l2;
     int pmch_flag=0;
@@ -4189,8 +4184,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *pr
     }
 
 #ifdef DEBUG_PHY_PROC
-    LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n",
-            (r_type == multicast_relay) ? "RN/UE" : "UE",
+    LOG_D(PHY,"[UE %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n",
                     ue->Mod_id,frame_rx, subframe_rx);
 #endif
 
@@ -4655,8 +4649,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *pr
 
 
 int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,
-			 uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,
-			 relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) {
+			 uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode) {
 
   int l,l2;
   int pilot1;
@@ -4705,8 +4698,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,
   }
 
 #ifdef DEBUG_PHY_PROC
-  LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n",
-  (r_type == multicast_relay) ? "RN/UE" : "UE",
+  LOG_D(PHY,"[UE %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n",
   ue->Mod_id,frame_rx, subframe_rx);
 #endif
 
@@ -5131,38 +5123,9 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,
   return (0);
 }
 
-#if defined(Rel10) || defined(Rel14)
-
-int phy_procedures_RN_UE_RX(uint8_t slot_rx, uint8_t next_slot, relaying_type_t r_type)
-{
-
-  int do_proc =0; // do nothing by default
-
-  switch(r_type) {
-  case no_relay:
-    do_proc=no_relay; // perform the normal UE operation
-    break;
-
-  case multicast_relay:
-    if (slot_rx > 12)
-      do_proc = 0; // do nothing
-    else // SF#1, SF#2, SF3, SF#3, SF#4, SF#5, SF#6(do rx slot 12)
-      do_proc = multicast_relay ; // do PHY procedures UE RX
-
-    break;
-
-  default: // should'not be here
-    LOG_W(PHY,"Not supported relay type %d, do nothing \n", r_type);
-    do_proc= 0;
-    break;
-  }
 
-  return do_proc;
-}
-#endif
 
-void phy_procedures_UE_lte(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,
-			   relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn)
+void phy_procedures_UE_lte(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode)
 {
 #if defined(ENABLE_ITTI)
   MessageDef   *msg_p;
@@ -5224,30 +5187,22 @@ void phy_procedures_UE_lte(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,u
 
     if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_UL)||
   (ue->frame_parms.frame_type == FDD)) {
-      phy_procedures_UE_TX(ue,proc,eNB_id,abstraction_flag,mode,r_type);
+      phy_procedures_UE_TX(ue,proc,eNB_id,abstraction_flag,mode);
     }
 
     if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_DL) ||
-  (ue->frame_parms.frame_type == FDD)) {
-#if defined(Rel10) || defined(Rel14)
-
-      if (phy_procedures_RN_UE_RX(subframe_rx, subframe_tx, r_type) != 0 )
-#endif
-	phy_procedures_UE_RX(ue,proc,eNB_id,abstraction_flag,do_pdcch_flag,mode,r_type,phy_vars_rn);
+	(ue->frame_parms.frame_type == FDD)) {
+      phy_procedures_UE_RX(ue,proc,eNB_id,abstraction_flag,do_pdcch_flag,mode);
     }
 
     if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_S) &&
   (slot==1)) {
-      phy_procedures_UE_S_TX(ue,eNB_id,abstraction_flag,r_type);
+      phy_procedures_UE_S_TX(ue,eNB_id,abstraction_flag);
     }
 
     if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_S) &&
-  (slot==0)) {
-#if defined(Rel10) || defined(Rel14)
-
-      if (phy_procedures_RN_UE_RX(subframe_rx, subframe_tx, r_type) != 0 )
-#endif
-	phy_procedures_UE_RX(ue,proc,eNB_id,abstraction_flag,do_pdcch_flag,mode,r_type,phy_vars_rn);
+	(slot==0)) {
+	phy_procedures_UE_RX(ue,proc,eNB_id,abstraction_flag,do_pdcch_flag,mode);
     }
 
     if (ue->mac_enabled==1) {
diff --git a/openair1/SCHED_UE/pucch_pc.c b/openair1/SCHED_UE/pucch_pc.c
index f01d0d96dd..6fa510d99e 100644
--- a/openair1/SCHED_UE/pucch_pc.c
+++ b/openair1/SCHED_UE/pucch_pc.c
@@ -30,10 +30,11 @@
  * \warning
  */
 
-#include "PHY/defs.h"
-#include "SCHED/defs.h"
-#include "PHY/LTE_TRANSPORT/proto.h"
-#include "PHY/extern.h"
+#include "PHY/defs_UE.h"
+#include "SCHED_UE/sched_UE.h"
+#include "SCHED/sched_common_extern.h"
+#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
+
 
 int16_t pucch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt)
 {
diff --git a/openair1/SCHED_UE/pusch_pc.c b/openair1/SCHED_UE/pusch_pc.c
index caef131627..ad741d47c0 100644
--- a/openair1/SCHED_UE/pusch_pc.c
+++ b/openair1/SCHED_UE/pusch_pc.c
@@ -30,83 +30,11 @@
  * \warning
  */
 
-#include "defs.h"
-#include "PHY/defs.h"
-#include "PHY/LTE_TRANSPORT/proto.h"
-#include "PHY/extern.h"
-
-// This is the formula from Section 5.1.1.1 in 36.213 100*10*log10((2^(MPR*Ks)-1)), where MPR is in the range [0,6] and Ks=1.25
-int16_t hundred_times_delta_TF[100] = {-32768,-1268,-956,-768,-631,-523,-431,-352,-282,-219,-161,-107,-57,-9,36,79,120,159,197,234,269,304,337,370,402,434,465,495,525,555,583,612,640,668,696,723,750,777,803,829,856,881,907,933,958,983,1008,1033,1058,1083,1108,1132,1157,1181,1205,1229,1254,1278,1302,1325,1349,1373,1397,1421,1444,1468,1491,1515,1538,1562,1585,1609,1632,1655,1679,1702,1725,1748,1772,1795,1818,1841,1864,1887,1910,1933,1956,1980,2003,2026,2049,2072,2095,2118,2141,2164,2186,2209,2232,2255};
-uint16_t hundred_times_log10_NPRB[100] = {0,301,477,602,698,778,845,903,954,1000,1041,1079,1113,1146,1176,1204,1230,1255,1278,1301,1322,1342,1361,1380,1397,1414,1431,1447,1462,1477,1491,1505,1518,1531,1544,1556,1568,1579,1591,1602,1612,1623,1633,1643,1653,1662,1672,1681,1690,1698,1707,1716,1724,1732,1740,1748,1755,1763,1770,1778,1785,1792,1799,1806,1812,1819,1826,1832,1838,1845,1851,1857,1863,1869,1875,1880,1886,1892,1897,1903,1908,1913,1919,1924,1929,1934,1939,1944,1949,1954,1959,1963,1968,1973,1977,1982,1986,1991,1995,2000};
-
-int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *eNB,uint8_t UE_id,uint8_t harq_pid, uint8_t bw_factor)
-{
-
-  uint32_t Nre,sumKr,MPR_x100,Kr,r;
-  uint16_t beta_offset_pusch;
-
-  DevAssert( UE_id < NUMBER_OF_UE_MAX+1 );
-  DevAssert( harq_pid < 8 );
-
-  Nre = eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_initial *
-        eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12;
-
-  sumKr = 0;
-
-  for (r=0; r<eNB->ulsch[UE_id]->harq_processes[harq_pid]->C; r++) {
-    if (r<eNB->ulsch[UE_id]->harq_processes[harq_pid]->Cminus)
-      Kr = eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kminus;
-    else
-      Kr = eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus;
-
-    sumKr += Kr;
-  }
-
-  if (Nre==0)
-    return(0);
-
-  MPR_x100 = 100*sumKr/Nre;
-  // Note: MPR=is the effective spectral efficiency of the PUSCH
-  // FK 20140908 sumKr is only set after the ulsch_encoding
-
-  beta_offset_pusch = 8;
-  //(eNB->ulsch[UE_id]->harq_processes[harq_pid]->control_only == 1) ? eNB->ulsch[UE_id]->beta_offset_cqi_times8:8;
-
-  DevAssert( UE_id < NUMBER_OF_UE_MAX );
-//#warning "This condition happens sometimes. Need more investigation" // navid
-  //DevAssert( MPR_x100/6 < 100 );
-
-  if (1==1) { //eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled == 1) {
-    // This is the formula from Section 5.1.1.1 in 36.213 10*log10(deltaIF_PUSCH = (2^(MPR*Ks)-1)*beta_offset_pusch)
-    if (bw_factor == 1) {
-      uint8_t nb_rb = eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb;
-      return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3)) + hundred_times_log10_NPRB[nb_rb-1];
-    } else
-      return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3));
-  } else {
-    return(0);
-  }
-}
-
-int16_t get_hundred_times_delta_IF_mac(module_id_t module_idP, uint8_t CC_id, rnti_t rnti, uint8_t harq_pid)
-{
-
-  int8_t UE_id;
-
-  if ((RC.eNB == NULL) || (module_idP > RC.nb_inst) || (CC_id > RC.nb_CC[module_idP])) {
-    LOG_E(PHY,"get_UE_stats: No eNB found (or not allocated) for Mod_id %d,CC_id %d\n",module_idP,CC_id);
-    return -1;
-  }
-
-  UE_id = find_ulsch( rnti, RC.eNB[module_idP][CC_id],SEARCH_EXIST);
-
-  if (UE_id == -1) {
-    // not found
-    return 0;
-  }
-
-  return get_hundred_times_delta_IF_eNB( RC.eNB[module_idP][CC_id], UE_id, harq_pid, 0 );
-}
+#include "sched_UE.h"
+#include "SCHED/sched_common_extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
+#include "PHY/phy_extern_ue.h"
 
 int16_t get_hundred_times_delta_IF(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t harq_pid)
 {
diff --git a/openair1/SCHED_UE/srs_pc.c b/openair1/SCHED_UE/srs_pc.c
index 04dacecc25..1f5aa8ecbc 100644
--- a/openair1/SCHED_UE/srs_pc.c
+++ b/openair1/SCHED_UE/srs_pc.c
@@ -30,9 +30,9 @@
  * \warning
  */
 
-#include "PHY/defs.h"
-#include "PHY/LTE_TRANSPORT/proto.h"
-#include "PHY/extern.h"
+#include "PHY/defs_UE.h"
+#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
+#include "PHY/phy_extern_ue.h"
 
 void srs_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t *pnb_rb_srs, uint8_t abstraction_flag)
 {
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index 885d29cc4e..db6350df14 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -36,14 +36,15 @@
 #include <execinfo.h>
 #include <signal.h>
 
-#include "SIMULATION/TOOLS/defs.h"
+#include "SIMULATION/TOOLS/sim.h"
 #include "PHY/types.h"
-#include "PHY/defs.h"
-#include "PHY/vars.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_vars.h"
 
-#include "SCHED/defs.h"
-#include "SCHED/vars.h"
-#include "LAYER2/MAC/vars.h"
+#include "SCHED/sched_eNB.h"
+#include "SCHED/sched_common_vars.h"
+#include "LAYER2/MAC/mac_vars.h"
 
 #include "OCG_vars.h"
 #include "UTIL/LOG/log.h"
@@ -56,7 +57,13 @@
 
 #include "dummy_functions.c"
 
-
+#include "PHY/MODULATION/modulation_common.h"
+#include "PHY/MODULATION/modulation_eNB.h"
+#include "PHY/MODULATION/modulation_UE.h"
+#include "PHY/LTE_TRANSPORT/transport_proto.h"
+#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
+#include "SCHED/sched_eNB.h"
+#include "SCHED_UE/sched_UE.h"
 
 double cpuf;
 
@@ -1592,7 +1599,7 @@ int main(int argc, char **argv)
 
 	    eNB->abstraction_flag=0;
 	    schedule_response(&sched_resp);
-	    phy_procedures_eNB_TX(eNB,proc_eNB,no_relay,NULL,1);
+	    phy_procedures_eNB_TX(eNB,proc_eNB,1);
 
 	    if (uncoded_ber_bit == NULL) {
 	      // this is for user 0 only
@@ -1634,7 +1641,7 @@ int main(int argc, char **argv)
 	    proc_eNB->subframe_tx = subframe+1;
 	    sched_resp.subframe=subframe+1;
 	    schedule_response(&sched_resp);
-	    phy_procedures_eNB_TX(eNB,proc_eNB,no_relay,NULL,0);
+	    phy_procedures_eNB_TX(eNB,proc_eNB,0);
 
 
 	    ru->proc.subframe_tx=(subframe+1)%10;
@@ -1723,7 +1730,7 @@ int main(int argc, char **argv)
 
 	  dci_received = UE->pdcch_vars[UE->current_thread_id[proc->subframe_rx]][eNB_id]->dci_received;
 
-	  phy_procedures_UE_RX(UE,proc,0,0,dci_flag,normal_txrx,no_relay,NULL);
+	  phy_procedures_UE_RX(UE,proc,0,0,dci_flag,normal_txrx);
 
 	  dci_received = dci_received - UE->pdcch_vars[UE->current_thread_id[proc->subframe_rx]][eNB_id]->dci_received;
 
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index fc782be07a..cf1b8192b3 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -33,16 +33,22 @@
 #include <string.h>
 #include <math.h>
 #include <unistd.h>
-#include "SIMULATION/TOOLS/defs.h"
+#include "SIMULATION/TOOLS/sim.h"
 #include "PHY/types.h"
-#include "PHY/defs.h"
-#include "PHY/vars.h"
+#include "PHY/defs_common.h"
+#include "PHY/defs_eNB.h"
+#include "PHY/defs_UE.h"
+#include "PHY/phy_vars.h"
 
-#include "SCHED/defs.h"
-#include "SCHED/vars.h"
-#include "LAYER2/MAC/vars.h"
+
+#include "SCHED/sched_common_vars.h"
+#include "SCHED/sched_eNB.h"
+#include "SCHED_UE/sched_UE.h"
+#include "LAYER2/MAC/mac_vars.h"
 #include "OCG_vars.h"
-#include "intertask_interface_init.h"
+
+#include "PHY/LTE_TRANSPORT/transport_proto.h"
+#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
 
 #include "unitary_defs.h"
 
@@ -873,6 +879,7 @@ int main(int argc, char **argv)
   // NN: N_RB_UL has to be defined in ulsim
   for (int k=0;k<NUMBER_OF_UE_MAX;k++) eNB->ulsch[k] = new_eNB_ulsch(max_turbo_iterations,N_RB_DL,0);
   UE->ulsch[0]   = new_ue_ulsch(N_RB_DL,0);
+  printf("ULSCH %p\n",UE->ulsch[0]);
 
   if (parallel_flag == 1) {
     extern void init_fep_thread(PHY_VARS_eNB *, pthread_attr_t *);
@@ -946,34 +953,6 @@ int main(int argc, char **argv)
 
   UE->ulsch_Msg3_active[eNB_id] = 0;
   UE->ul_power_control_dedicated[eNB_id].accumulationEnabled=1;
-  /*
-  generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu,
-                                    14,
-                                    proc_rxtx->subframe_tx,
-                                    format0,
-                                    UE,
-				    proc_rxtx_ue,
-                                    SI_RNTI,
-                                    0,
-                                    P_RNTI,
-                                    CBA_RNTI,
-                                    0,
-                                    srs_flag);
-
-  //  printf("RIV %d\n",UL_alloc_pdu.rballoc);
-
-  generate_eNB_ulsch_params_from_dci(eNB,proc_rxtx,
-				     (void *)&UL_alloc_pdu,
-                                     14,
-                                     format0,
-                                     0,
-				     SI_RNTI,
-                                     0,
-                                     P_RNTI,
-                                     CBA_RNTI,
-                                     srs_flag);
-  */
-
   coded_bits_per_codeword = nb_rb * (12 * get_Qm_ul(mcs)) * nsymb;
 
   if (cqi_flag == 1) coded_bits_per_codeword-=UE->ulsch[0]->O;
@@ -1211,7 +1190,7 @@ int main(int argc, char **argv)
 	    proc_rxtx_ue->subframe_tx = proc_rxtx->subframe_rx;
 	    proc_rxtx_ue->subframe_rx = proc_rxtx->subframe_tx;
 
-	    phy_procedures_UE_TX(UE,proc_rxtx_ue,0,0,normal_txrx,no_relay);
+	    phy_procedures_UE_TX(UE,proc_rxtx_ue,0,0,normal_txrx);
 
 
 	    tx_lev = signal_energy(&UE->common_vars.txdata[0][eNB->frame_parms.samples_per_tti*subframe],
@@ -1339,7 +1318,7 @@ int main(int argc, char **argv)
 
 
 	  ru->feprx(ru);
-	  phy_procedures_eNB_uespec_RX(eNB,proc_rxtx,no_relay);
+	  phy_procedures_eNB_uespec_RX(eNB,proc_rxtx);
 
 
           if (cqi_flag > 0) {
diff --git a/openair1/SIMULATION/RF/dac.c b/openair1/SIMULATION/RF/dac.c
index 8cf6b49623..ce3af07a7d 100644
--- a/openair1/SIMULATION/RF/dac.c
+++ b/openair1/SIMULATION/RF/dac.c
@@ -22,8 +22,8 @@
 //#define DEBUG_DAC 1
 #include <math.h>
 #include <stdio.h>
-#include "PHY/TOOLS/defs.h"
-
+#include "PHY/TOOLS/tools_defs.h"
+#include "rf.h"
 void dac(double *s_re[2],
          double *s_im[2],
          uint32_t **input,
diff --git a/openair1/SIMULATION/RF/rf.c b/openair1/SIMULATION/RF/rf.c
index 3cf770ac7c..51b7e7524d 100644
--- a/openair1/SIMULATION/RF/rf.c
+++ b/openair1/SIMULATION/RF/rf.c
@@ -19,14 +19,13 @@
  *      contact@openairinterface.org
  */
 
-//#include "defs.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 
 //#include "PHY/defs.h"
-#include "SIMULATION/TOOLS/defs.h"
-
+#include "SIMULATION/TOOLS/sim.h"
+#include "rf.h"
 /*
 extern void randominit(void);
 extern double gaussdouble(double,double);
diff --git a/openair1/SIMULATION/RF/defs.h b/openair1/SIMULATION/RF/rf.h
similarity index 98%
rename from openair1/SIMULATION/RF/defs.h
rename to openair1/SIMULATION/RF/rf.h
index 05e74647a0..65055bc71a 100644
--- a/openair1/SIMULATION/RF/defs.h
+++ b/openair1/SIMULATION/RF/rf.h
@@ -76,7 +76,7 @@ void adc(double *r_re[2],
 
 void dac(double *s_re[2],
          double *s_im[2],
-         int **input,
+         unsigned int **input,
          unsigned int input_offset,
          unsigned int nb_tx_antennas,
          unsigned int length,
@@ -87,7 +87,7 @@ void dac(double *s_re[2],
 
 double dac_fixed_gain(double *s_re[2],
                       double *s_im[2],
-                      int **input,
+                      unsigned int **input,
                       unsigned int input_offset,
                       unsigned int nb_tx_antennas,
                       unsigned int length,
diff --git a/openair1/SIMULATION/TOOLS/abstraction.c b/openair1/SIMULATION/TOOLS/abstraction.c
index 7e99371c37..ea27d0e9b7 100644
--- a/openair1/SIMULATION/TOOLS/abstraction.c
+++ b/openair1/SIMULATION/TOOLS/abstraction.c
@@ -26,8 +26,8 @@
 #include <string.h>
 #include <errno.h>
 
-#include "PHY/TOOLS/defs.h"
-#include "defs.h"
+#include "SIMULATION/TOOLS/sim.h"
+#include "PHY/TOOLS/tools_defs.h"
 
 // NEW code with lookup table for sin/cos based on delay profile (TO BE TESTED)
 
diff --git a/openair1/SIMULATION/TOOLS/multipath_channel.c b/openair1/SIMULATION/TOOLS/multipath_channel.c
index 757d5023de..02f4abbc7e 100644
--- a/openair1/SIMULATION/TOOLS/multipath_channel.c
+++ b/openair1/SIMULATION/TOOLS/multipath_channel.c
@@ -23,8 +23,9 @@
 #include <stdlib.h>
 #include <math.h>
 #include <string.h>
-#include "defs.h"
-#include "SIMULATION/RF/defs.h"
+#include "PHY/TOOLS/tools_defs.h"
+#include "SIMULATION/RF/rf.h"
+#include "sim.h"
 
 //#define DEBUG_CH
 uint8_t multipath_channel_nosigconv(channel_desc_t *desc)
diff --git a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c
index c2078b91d4..daa3462b1c 100644
--- a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c
+++ b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c
@@ -23,8 +23,8 @@
 #include <stdlib.h>
 #include <math.h>
 #include <string.h>
-#include "defs.h"
-#include "SIMULATION/RF/defs.h"
+#include "sim.h"
+#include "SIMULATION/RF/rf.h"
 #include <complex.h>
 
 void tv_channel(channel_desc_t *desc,double complex ***H,uint16_t length);
diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c
index 222a196e20..b19572892e 100644
--- a/openair1/SIMULATION/TOOLS/random_channel.c
+++ b/openair1/SIMULATION/TOOLS/random_channel.c
@@ -26,8 +26,8 @@
 #include <string.h>
 
 
-#include "PHY/TOOLS/defs.h"
-#include "defs.h"
+#include "PHY/TOOLS/tools_defs.h"
+#include "sim.h"
 #include "scm_corrmat.h"
 #include "UTIL/LOG/log.h"
 //#define DEBUG_CH
diff --git a/openair1/SIMULATION/TOOLS/rangen_double.c b/openair1/SIMULATION/TOOLS/rangen_double.c
index 0fc01a8d31..6dcdd9418e 100644
--- a/openair1/SIMULATION/TOOLS/rangen_double.c
+++ b/openair1/SIMULATION/TOOLS/rangen_double.c
@@ -24,7 +24,7 @@
 #include <math.h>
 #include <time.h>
 
-#include  "defs.h"
+#include  "sim.h"
 
 static unsigned int seed, iy, ir[98];
 /*
diff --git a/openair1/SIMULATION/TOOLS/defs.h b/openair1/SIMULATION/TOOLS/sim.h
similarity index 99%
rename from openair1/SIMULATION/TOOLS/defs.h
rename to openair1/SIMULATION/TOOLS/sim.h
index a958c6b4eb..420e5d0072 100644
--- a/openair1/SIMULATION/TOOLS/defs.h
+++ b/openair1/SIMULATION/TOOLS/sim.h
@@ -21,7 +21,7 @@
 
 #ifndef __SIMULATION_TOOLS_DEFS_H__
 #define __SIMULATION_TOOLS_DEFS_H__
-#include "PHY/defs.h"
+#include "PHY/defs_common.h"
 
 /** @defgroup _numerical_ Useful Numerical Functions
  *@{
diff --git a/openair2/COMMON/phy_messages_types.h b/openair2/COMMON/phy_messages_types.h
index c425efa89c..cc85a9de83 100644
--- a/openair2/COMMON/phy_messages_types.h
+++ b/openair2/COMMON/phy_messages_types.h
@@ -29,10 +29,8 @@
 #ifndef PHY_MESSAGES_TYPES_H_
 #define PHY_MESSAGES_TYPES_H_
 
-#include "PHY/impl_defs_lte.h"
-#if ENABLE_RAL
-#include "ral_messages_types.h" //LG: MIH moved from repository/trunk to repository/extras
-#endif
+#include "PHY/defs_eNB.h"
+
 //-------------------------------------------------------------------------------------------//
 // Defines to access message fields.
 #define PHY_CONFIGURATION_REQ(mSGpTR)       (mSGpTR)->ittiMsg.phy_configuration_req
diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h
index 42bef9c4e9..0cddad9dcc 100644
--- a/openair2/ENB_APP/enb_config.h
+++ b/openair2/ENB_APP/enb_config.h
@@ -38,7 +38,7 @@
 #include "platform_types.h"
 #include "platform_constants.h"
 #include "PHY/impl_defs_lte.h"
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
 #include "s1ap_messages_types.h"
 #ifdef CMAKER
 #include "SystemInformationBlockType2.h"
@@ -47,7 +47,7 @@
 #include "RRC/LITE/MESSAGES/SystemInformationBlockType2.h"
 #endif
 #include "intertask_interface_types.h"
-#include "RRC/LITE/defs.h"
+#include "RRC/LTE/rrc_defs.h"
 
 #define IPV4_STR_ADDR_TO_INT_NWBO(AdDr_StR,NwBo,MeSsAgE ) do {\
             struct in_addr inp;\
diff --git a/openair2/ENB_APP/flexran_agent_common.h b/openair2/ENB_APP/flexran_agent_common.h
index 242cb55ca8..057c5b9489 100644
--- a/openair2/ENB_APP/flexran_agent_common.h
+++ b/openair2/ENB_APP/flexran_agent_common.h
@@ -42,7 +42,6 @@
 #include "flexran_agent_defs.h"
 #include "enb_config.h"
 
-#include "LAYER2/MAC/extern.h"
 #include "LAYER2/RLC/rlc.h"
 
 # include "tree.h"
diff --git a/openair2/ENB_APP/flexran_agent_ran_api.h b/openair2/ENB_APP/flexran_agent_ran_api.h
index 4e5f214af0..3354d8ace8 100644
--- a/openair2/ENB_APP/flexran_agent_ran_api.h
+++ b/openair2/ENB_APP/flexran_agent_ran_api.h
@@ -36,14 +36,13 @@
 
 
 #include "enb_config.h"
-#include "LAYER2/MAC/extern.h"
 #include "LAYER2/RLC/rlc.h"
-#include "SCHED/defs.h"
+#include "SCHED/sched_eNB.h"
 #include "pdcp.h"
-#include "RRC/LITE/extern.h"
+#include "RRC/LTE/rrc_extern.h"
 #include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
-#include "RRC/LITE/rrc_eNB_UE_context.h"
-#include "PHY/extern.h"
+#include "RRC/LTE/rrc_eNB_UE_context.h"
+#include "PHY/phy_extern.h"
 #include "log.h"
 
 /****************************
diff --git a/openair2/LAYER2/MAC/mac_vars.h b/openair2/LAYER2/MAC/mac_vars.h
index d153c82aee..549e6394d1 100644
--- a/openair2/LAYER2/MAC/mac_vars.h
+++ b/openair2/LAYER2/MAC/mac_vars.h
@@ -32,8 +32,8 @@
 
 #ifndef __MAC_VARS_H__
 #define __MAC_VARS_H__
-#include "PHY/defs.h"
-#include "defs.h"
+#include "PHY/defs_common.h"
+#include "mac.h"
 #include "COMMON/mac_rrc_primitives.h"
 
 const uint32_t BSR_TABLE[BSR_TABLE_SIZE] =
diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h
deleted file mode 100644
index deb07443f1..0000000000
--- a/openair2/PHY_INTERFACE/defs.h
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1  (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- *      contact@openairinterface.org
- */
-
-/*! \file PHY_INTERFACE/defs.h
-* \brief mac phy interface primitives
-* \author Raymond Knopp and Navid Nikaein
-* \date 2011
-* \version 0.5
-* \mail navid.nikaein@eurecom.fr or openair_tech@eurecom.fr
-*/
-
-#ifndef __MAC_PHY_PRIMITIVES_H__
-#    define __MAC_PHY_PRIMITIVES_H__
-
-#include "LAYER2/MAC/defs.h"
-
-
-#define MAX_NUMBER_OF_MAC_INSTANCES 16
-
-#define NULL_PDU 255
-#define DCI 0
-#define DLSCH 1
-#define ULSCH 2
-
-#define mac_exit_wrapper(sTRING)                                                            \
-do {                                                                                        \
-    char temp[300];                                                                         \
-    snprintf(temp, sizeof(temp), "%s in file "__FILE__" at line %d\n", sTRING, __LINE__);   \
-    mac_xface->macphy_exit(temp);                                                           \
-} while(0)
-
-/** @defgroup _phy_if MAC-PHY interface
- * @ingroup _oai2
- * @{
- */
-/*! \brief MACPHY Interface */
-/*
-typedef struct {
-  /// Pointer function that initializes L2
-  int (*macphy_init)(int eMBMS_active, char *uecap_xer, uint8_t CBA_active,uint8_t HO_active);
-
-  /// Pointer function that stops the low-level scheduler due an exit condition
-  void (*macphy_exit)(const char *);
-
-  // eNB functions
-  /// Invoke dlsch/ulsch scheduling procedure for new subframe
-  void (*eNB_dlsch_ulsch_scheduler)(module_id_t Mod_id,uint8_t cooperation_flag, frame_t frameP, sub_frame_t subframeP);//, int calibration_flag);
-
-  /// Fill random access response sdu, passing timing advance
-  uint16_t (*fill_rar)(module_id_t Mod_id,int CC_id,frame_t frameP,uint8_t *dlsch_buffer,uint16_t N_RB_UL, uint8_t input_buffer_length);
-
-  /// Initiate the RA procedure upon reception (hypothetical) of a valid preamble
-  void (*initiate_ra_proc)(module_id_t Mod_id,int CC_id,frame_t frameP,uint16_t preamble,int16_t timing_offset,uint8_t sect_id,sub_frame_t subframe,uint8_t f_id);
-
-  /// cancel an ongoing RA procedure
-  void (*cancel_ra_proc)(module_id_t Mod_id,int CC_id,frame_t frameP,uint16_t preamble);
-
-  /// Inform MAC layer that an uplink is scheduled for Msg3 in given subframe.
-  /// This is used so that the MAC scheduler marks as busy the RBs used by the Msg3.
-  void (*set_msg3_subframe)(module_id_t Mod_id,
-                            int CC_id,
-                            int frame,
-                            int subframe,
-                            int rnti,
-                            int Msg3_frame,
-                            int Msg3_subframe);
-
-  /// Get DCI for current subframe from MAC
-  DCI_PDU* (*get_dci_sdu)(module_id_t Mod_id,int CC_id,frame_t frameP,sub_frame_t subframe);
-
-  /// Get DLSCH sdu for particular RNTI and Transport block index
-  uint8_t* (*get_dlsch_sdu)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,uint8_t TB_index);
-
-  /// Send ULSCH sdu to MAC for given rnti
-  void (*rx_sdu)(module_id_t Mod_id,int CC_id,frame_t frameP, sub_frame_t sub_frameP,rnti_t rnti, uint8_t *sdu,uint16_t sdu_len, int harq_pid,uint8_t *msg3_flag);
-
-  /// Indicate failure to synch to external source
-  void (*mrbch_phy_sync_failure) (module_id_t Mod_id,frame_t frameP, uint8_t free_eNB_index);
-
-  /// Indicate Scheduling Request from UE
-  void (*SR_indication)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,sub_frame_t subframe);
-  /// Indicate UL Failure to eNodeB MAC
-  void (*UL_failure_indication)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,sub_frame_t subframe);
-
-  /// Configure Common PHY parameters from SIB1
-  void (*phy_config_mib_eNB)(module_id_t Mod_id,int CC_id,
-			     int eutra_band,
-			     int N_RB_DL,
-			     PHICH_Config_t *phich_Config,
-			     int Nid_cell,
-			     int Ncp,
-			     int p_eNB,
-			     uint32_t      dl_CarrierFreq,
-			     uint32_t      ul_CarrierFreq);
-
-  /// Configure Common PHY parameters from SIB1
-  void (*phy_config_sib1_eNB)(module_id_t Mod_id,int CC_id,
-                              TDD_Config_t *tdd_config,
-                              uint8_t SIwindowsize,
-                              uint16_t SIperiod);
-
-  /// Configure Common PHY parameters from SIB2
-  void (*phy_config_sib2_eNB)(module_id_t Mod_id, int CC_id,
-                              RadioResourceConfigCommonSIB_t *radioResourceConfigCommon,
-                              ARFCN_ValueEUTRA_t *ul_CArrierFreq,
-                              long *ul_Bandwidth,
-                              AdditionalSpectrumEmission_t *additionalSpectrumEmission,
-                              struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList);
-
-#if defined(Rel10) || defined(Rel14)
-  /// Configure Common PHY parameters from SIB13
-  void (*phy_config_sib13_eNB)(module_id_t Mod_id,int CC_id, int mbsfn_Area_idx,
-                               long mbsfn_AreaId_r9);
-
-  void (*phy_config_dedicated_scell_eNB)(uint8_t Mod_id,
-                                         uint16_t rnti,
-                                         SCellToAddMod_r10_t *sCellToAddMod_r10,
-                                         int CC_id);
-#endif
-
-  /// PHY-Config-Dedicated eNB
-  void (*phy_config_dedicated_eNB)(module_id_t Mod_id,int CC_id,rnti_t rnti,
-                                   struct PhysicalConfigDedicated *physicalConfigDedicated);
-
-#if defined(Rel10) || defined(Rel14)
-  /// Get MCH sdu and corresponding MCS for particular MBSFN subframe
-  MCH_PDU* (*get_mch_sdu)(module_id_t Mod_id, int CC_id, frame_t frameP,sub_frame_t subframe);
-#endif
-  // configure the cba rnti at the physical layer
-  void (*phy_config_cba_rnti)(module_id_t Mod_id,int CC_id,eNB_flag_t eNB_flag, uint8_t index, uint16_t cba_rnti, uint8_t cba_group_id, uint8_t num_active_cba_groups);
-  /// get delta mcs for fast UL AMC
-  int16_t (*estimate_ue_tx_power)(uint32_t tbs, uint32_t nb_rb, uint8_t control_only, lte_prefix_type_t ncp, uint8_t use_srs);
-
-  int (*mac_phy_remove_ue)(module_id_t Mod_idP,rnti_t rntiP);
-  /// UE functions
-
-  /// reset the ue phy
-  void (*phy_reset_ue)(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
-
-  /// Indicate loss of synchronization of PBCH for this eNB to MAC layer
-  void (*out_of_sync_ind)(module_id_t Mod_id,frame_t frameP,uint16_t eNB_index);
-
-  ///  Send a received SI sdu
-  void (*ue_decode_si)(module_id_t Mod_id,int CC_id,frame_t frameP, uint8_t CH_index, void *pdu, uint16_t len);
-
-  ///  Send a received Paging sdu
-  void (*ue_decode_p)(module_id_t Mod_id,int CC_id,frame_t frameP, uint8_t CH_index, void *pdu, uint16_t len);
-
-  /// Send a received DLSCH sdu to MAC
-  void (*ue_send_sdu)(module_id_t Mod_id,uint8_t CC_id,frame_t frameP,sub_frame_t subframe,uint8_t *sdu,uint16_t sdu_len,uint8_t CH_index);
-
-#if defined(Rel10) || defined(Rel14)
-  /// Send a received MCH sdu to MAC
-  void (*ue_send_mch_sdu)(module_id_t Mod_id,uint8_t CC_id, frame_t frameP,uint8_t *sdu,uint16_t sdu_len,uint8_t eNB_index,uint8_t sync_area);
-
-  /// Function to check if UE PHY needs to decode MCH for MAC
-  /// get the sync area id, and return MCS value if need to decode, otherwise -1
-  int (*ue_query_mch)(module_id_t Mod_id, uint8_t CC_id,frame_t frameP,sub_frame_t subframe,uint8_t eNB_index,uint8_t *sync_area, uint8_t *mcch_active);
-#endif
-
-  /// Retrieve ULSCH sdu from MAC
-  void (*ue_get_sdu)(module_id_t Mod_id,int CC_id,frame_t frameP,sub_frame_t subframe, uint8_t CH_index,uint8_t *ulsch_buffer,uint16_t buflen,uint8_t *access_mode);
-
-  /// Retrieve RRCConnectionReq from MAC
-  PRACH_RESOURCES_t* (*ue_get_rach)(module_id_t Mod_id,int CC_id,frame_t frameP,uint8_t Msg3_flag,sub_frame_t subframe);
-
-  /// Process Random-Access Response
-  uint16_t (*ue_process_rar)(module_id_t Mod_id,int CC_id,frame_t frameP, uint16_t ra_rnti, uint8_t *dlsch_buffer, uint16_t *t_crnti,uint8_t preamble_index, uint8_t* selected_rar_buffer);
-
-  /// Get SR payload (0,1) from UE MAC
-  uint32_t (*ue_get_SR)(module_id_t Mod_id,int CC_id,frame_t frameP,uint8_t eNB_id,rnti_t rnti,sub_frame_t subframe);
-
-  /// Indicate synchronization with valid PBCH
-  void (*dl_phy_sync_success) (module_id_t Mod_id,frame_t frameP, uint8_t CH_index,uint8_t first_sync);
-
-  /// Only calls the PDCP for now
-  UE_L2_STATE_t (*ue_scheduler)(module_id_t Mod_id, frame_t rxFrameP,sub_frame_t rxSubframe, frame_t txFrameP,sub_frame_t txSubframe, lte_subframe_t direction, uint8_t eNB_id, int CC_id);
-
-  /// PHY-Config-Dedicated UE
-  void (*phy_config_dedicated_ue)(module_id_t Mod_id,int CC_id,uint8_t CH_index,
-                                  struct PhysicalConfigDedicated *physicalConfigDedicated);
-
-  /// PHY-Config-harq UE
-  void (*phy_config_harq_ue)(module_id_t Mod_id,int CC_id,uint8_t CH_index,
-                             uint16_t max_harq_tx);
-  /// Configure Common PHY parameters from SIB1
-  void (*phy_config_sib1_ue)(module_id_t Mod_id,int CC_id,uint8_t CH_index,
-                             TDD_Config_t *tdd_config,
-                             uint8_t SIwindowsize,
-                             uint16_t SIperiod);
-
-  /// Configure Common PHY parameters from SIB2
-  void (*phy_config_sib2_ue)(module_id_t Mod_id,int CC_id,uint8_t CH_index,
-                             RadioResourceConfigCommonSIB_t *radioResourceConfigCommon,
-                             ARFCN_ValueEUTRA_t *ul_CArrierFreq,
-                             long *ul_Bandwidth,
-                             AdditionalSpectrumEmission_t *additionalSpectrumEmission,
-                             struct MBSFN_SubframeConfigList  *mbsfn_SubframeConfigList);
-
-#if defined(Rel10) || defined(Rel14)
-  /// Configure Common PHY parameters from SIB13
-  void (*phy_config_sib13_ue)(uint8_t Mod_id,int CC_id, uint8_t eNB_index,int mbsfn_Area_idx,
-                              long mbsfn_AreaId_r9);
-
-  void (*phy_config_dedicated_scell_ue)(uint8_t Mod_id,
-                                        uint8_t eNB_index,
-                                        SCellToAddMod_r10_t *sCellToAddMod_r10,
-                                        int CC_id);
-#endif
-  /// Configure Common PHY parameters from mobilityControlInfo
-  void (*phy_config_afterHO_ue)(module_id_t Mod_id,uint8_t CC_id,uint8_t CH_index,
-                                MobilityControlInfo_t *mobilityControlInfo,
-                                uint8_t ho_failed);
-
-  /// Function to indicate failure of contention resolution or RA procedure
-  void (*ra_failed)(module_id_t Mod_id, uint8_t CC_id,uint8_t eNB_index);
-
-  /// Function to indicate success of contention resolution or RA procedure
-  void (*ra_succeeded)(module_id_t Mod_id,uint8_t CC_id, uint8_t eNB_index);
-
-  /// Function to indicate the transmission of msg1/rach to MAC
-  void (*Msg1_transmitted)(module_id_t Mod_id,uint8_t CC_id,frame_t frameP,uint8_t eNB_id);
-
-  /// Function to indicate Msg3 transmission/retransmission which initiates/reset Contention Resolution Timer
-  void (*Msg3_transmitted)(module_id_t Mod_id,uint8_t CC_id,frame_t frameP,uint8_t eNB_id);
-
-  /// Function to pass inter-cell measurement parameters to PHY (cell Ids)
-  void (*phy_config_meas_ue)(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index,uint8_t n_adj_cells,uint32_t *adj_cell_id);
-
-  // PHY Helper Functions
-
-  /// RIV computation from PHY
-  uint16_t (*computeRIV)(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs);
-
-  /// Downlink TBS table lookup from PHY
-  uint32_t (*get_TBS_DL)(uint8_t mcs, uint16_t nb_rb);
-
-  /// Uplink TBS table lookup from PHY
-  uint32_t (*get_TBS_UL)(uint8_t mcs, uint16_t nb_rb);
-
-  /// Function to retrieve the HARQ round index for a particular UL/DLSCH and harq_pid
-  int (*get_ue_active_harq_pid)(module_id_t Mod_id, uint8_t CC_id,rnti_t rnti, int frame, uint8_t subframe, uint8_t *harq_pid, uint8_t *round, uint8_t ul_flag);
-
-  /// Function to retrieve number of CCE
-  uint16_t (*get_nCCE_max)(module_id_t Mod_id,uint8_t  CC_id,int num_pdcch_symbols,int subframe);
-
-
-  int (*get_nCCE_offset)(int *CCE_table,
-                         const unsigned char L,
-                         const int nCCE,
-                         const int common_dci,
-                         const unsigned short rnti,
-                         const unsigned char subframe);
-
-  /// Function to retrieve number of PRB in an rb_alloc
-  uint32_t (*get_nb_rb)(uint8_t ra_header, uint32_t rb_alloc, int n_rb_dl);
-
-  /// Function to convert VRB to PRB for distributed allocation
-  uint32_t (*get_prb)(int N_RB_DL,int odd_slot,int vrb,int Ngap);
-
-  /// Function to retrieve transmission mode for UE
-  uint8_t (*get_transmission_mode)(module_id_t Mod_id,uint8_t CC_id,rnti_t rnti);
-
-  /// Function to retrieve rb_alloc bitmap from dci rballoc field and VRB type
-  uint32_t (*get_rballoc)(vrb_t vrb_type, uint16_t rb_alloc_dci);
-
-  /// Function for UE MAC to retrieve current PHY connectivity mode (PRACH,RA_RESPONSE,PUSCH)
-  UE_MODE_t (*get_ue_mode)(module_id_t Mod_id, uint8_t CC_id,uint8_t eNB_index);
-
-  /// Function for UE MAC to retrieve measured Path Loss
-  int16_t (*get_PL)(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
-
-  /// Function for UE MAC to retrieve the rssi
-  uint32_t (*get_RSSI)(uint8_t Mod_id,uint8_t CC_id);
-
-  /// Function for UE MAC to retrieve the total gain
-  uint32_t (*get_rx_total_gain_dB)(uint8_t Mod_id,uint8_t CC_id);
-
-  /// Function for UE MAC to retrieve the number of adjustent cells
-  uint8_t (*get_n_adj_cells)(uint8_t Mod_id,uint8_t CC_id);
-
-  /// Function for UE MAC to retrieve RSRP/RSRQ measurements
-  uint32_t (*get_RSRP)(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
-
-  /// Function for UE MAC to retrieve RSRP/RSRQ measurements
-  uint32_t (*get_RSRQ)(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
-
-  /// Function for UE MAC to set the layer3 filtered RSRP/RSRQ measurements
-  uint8_t (*set_RSRP_filtered)(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rsrp);
-
-  /// Function for UE MAC to set the layer3 filtered RSRP/RSRQ measurements
-  uint8_t (*set_RSRQ_filtered)(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rsrp);
-
-  /// Function for UE/eNB MAC to retrieve number of PRACH in TDD
-  uint8_t (*get_num_prach_tdd)(LTE_DL_FRAME_PARMS *frame_parms);
-
-  /// Function for UE/eNB MAC to retrieve f_id of particular PRACH resource in TDD
-  uint8_t (*get_fid_prach_tdd)(LTE_DL_FRAME_PARMS *frame_parms,uint8_t tdd_map_index);
-
-  /// Function for eNB MAC to retrieve subframe direction
-  lte_subframe_t (*get_subframe_direction)(module_id_t Mod_id, uint8_t CC_id, uint8_t subframe);
-
-  // MAC Helper functions
-  /// Function for UE/PHY to compute PUSCH transmit power in power-control procedure (Po_NOMINAL_PUSCH parameter)
-  int8_t (*get_Po_NOMINAL_PUSCH)(module_id_t Mod_id,uint8_t  CC_id);
-
-  /// Function for UE/PHY to compute PUSCH transmit power in power-control procedure (deltaP_rampup parameter)
-  int8_t (*get_deltaP_rampup)(module_id_t Mod_id,uint8_t CC_id);
-
-  /// Function for UE/PHY to compute PHR
-  int8_t (*get_PHR)(module_id_t Mod_id, uint8_t CC_id,uint8_t eNB_index);
-
-  /// Function for UE to process the timing advance command
-  void (*process_timing_advance)(module_id_t Mod_id,uint8_t CC_id, int16_t timing_advance);
-  
-  /// Function for MAC to get the UE stats from the PHY   
-  LTE_eNB_UE_stats* (*get_eNB_UE_stats)(module_id_t Mod_id, uint8_t CC_id, rnti_t rnti);
-
-  /// get the frame parameters from the PHY
-  LTE_DL_FRAME_PARMS* (*get_lte_frame_parms)(module_id_t Mod_id, uint8_t CC_id);
-  
-  /// get the Multiuser mimo mode
-  MU_MIMO_mode* (*get_mu_mimo_mode) (module_id_t Mod_id, uint8_t CC_id, rnti_t rnti);
-
-  /// get the delta TF for Uplink Power Control Calculation
-  int16_t (*get_hundred_times_delta_TF) (module_id_t module_idP, uint8_t CC_id, rnti_t rnti, uint8_t harq_pid);
-  /// get target PUSCH received power 
-  int16_t (*get_target_pusch_rx_power) (module_id_t module_idP, uint8_t CC_id);
-  /// get target PUSCH received power 
-  int16_t (*get_target_pucch_rx_power) (module_id_t module_idP, uint8_t CC_id);
-
-  unsigned char is_cluster_head;
-  unsigned char is_primary_cluster_head;
-  unsigned char is_secondary_cluster_head;
-  unsigned char cluster_head_index;
-
-  /// PHY Frame Configuration
-  LTE_DL_FRAME_PARMS *frame_parms;
-
-  uint8_t (*get_prach_prb_offset)(LTE_DL_FRAME_PARMS *frame_parms, uint8_t tdd_mapindex, uint16_t Nf); 
-
-  int (*is_prach_subframe)(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame, uint8_t subframe);
-
-  /// ICIC algos
-  uint8_t (*get_SB_size)(uint8_t n_rb_dl);
-  ///end ALU's algo
-
-} MAC_xface;
-
-*/
-
-#endif
-
-
-/** @} */
diff --git a/openair2/PHY_INTERFACE/phy_interface.h b/openair2/PHY_INTERFACE/phy_interface.h
new file mode 100644
index 0000000000..f275e91ec1
--- /dev/null
+++ b/openair2/PHY_INTERFACE/phy_interface.h
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file PHY_INTERFACE/defs.h
+* \brief mac phy interface primitives
+* \author Raymond Knopp and Navid Nikaein
+* \date 2011
+* \version 0.5
+* \mail navid.nikaein@eurecom.fr or openair_tech@eurecom.fr
+*/
+
+#ifndef __PHY_INTERFACE_H__
+#    define __PHY_INTERFACE_H__
+
+#include "LAYER2/MAC/mac.h"
+
+
+#define MAX_NUMBER_OF_MAC_INSTANCES 16
+
+#define NULL_PDU 255
+#define DCI 0
+#define DLSCH 1
+#define ULSCH 2
+
+#define mac_exit_wrapper(sTRING)                                                            \
+do {                                                                                        \
+    char temp[300];                                                                         \
+    snprintf(temp, sizeof(temp), "%s in file "__FILE__" at line %d\n", sTRING, __LINE__);   \
+    mac_xface->macphy_exit(temp);                                                           \
+} while(0)
+
+
+
+#endif
+
+
+/** @} */
diff --git a/openair2/RRC/LTE/rrc_eNB_UE_context.h b/openair2/RRC/LTE/rrc_eNB_UE_context.h
index 0e813cdee5..289b4d69d6 100644
--- a/openair2/RRC/LTE/rrc_eNB_UE_context.h
+++ b/openair2/RRC/LTE/rrc_eNB_UE_context.h
@@ -30,7 +30,7 @@
 #ifndef __RRC_ENB_UE_CONTEXT_H__
 #include "collection/tree.h"
 #include "COMMON/platform_types.h"
-#include "defs.h"
+#include "rrc_defs.h"
 
 
 void
diff --git a/openair2/RRC/LTE/rrc_extern.h b/openair2/RRC/LTE/rrc_extern.h
index b45dbd11e9..f97b02105f 100644
--- a/openair2/RRC/LTE/rrc_extern.h
+++ b/openair2/RRC/LTE/rrc_extern.h
@@ -30,15 +30,13 @@
 
 #ifndef __OPENAIR_RRC_EXTERN_H__
 #define __OPENAIR_RRC_EXTERN_H__
-#include "defs.h"
+#include "rrc_defs.h"
 #include "COMMON/mac_rrc_primitives.h"
-#include "LAYER2/MAC/defs.h"
-#include "LAYER2/MAC/extern.h"
+#include "LAYER2/MAC/mac.h"
 #include "LAYER2/RLC/rlc.h"
 
 extern UE_RRC_INST *UE_rrc_inst;
 
-#include "LAYER2/MAC/extern.h"
 
 extern uint8_t DRB2LCHAN[8];
 
diff --git a/openair2/UTIL/OCG/OCG.h b/openair2/UTIL/OCG/OCG.h
index 855b7a99fd..0495b139ce 100644
--- a/openair2/UTIL/OCG/OCG.h
+++ b/openair2/UTIL/OCG/OCG.h
@@ -36,7 +36,7 @@
 #ifndef __OCG_H__
 #define __OCG_H__
 
-#include "PHY/defs.h"
+#include "PHY/defs_common.h"
 #include "PHY/impl_defs_top.h"
 #include "platform_types.h"
 
diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h
index e8b9d92490..aed0b8c5bd 100644
--- a/targets/RT/USER/lte-softmodem.h
+++ b/targets/RT/USER/lte-softmodem.h
@@ -28,7 +28,7 @@
 #include "assertions.h"
 #include "msc.h"
 #include "PHY/types.h"
-#include "PHY/defs.h"
+#include "PHY/defs_eNB.h"
 #include "SIMULATION/ETH_TRANSPORT/proto.h"
 
 #include "flexran_agent.h"
-- 
GitLab