From fdc1049a70ed08d73a038493cd44572d24c4e21b Mon Sep 17 00:00:00 2001
From: frtabu <francois.taburet@nokia-bell-labs.com>
Date: Thu, 3 Dec 2020 23:22:07 +0100
Subject: [PATCH] Fix phy simulators compilation, number of threads for dlsch
 configurable

---
 cmake_targets/CMakeLists.txt                  |   5 +
 common/utils/LOG/log.h                        |   1 +
 executables/nr-ue.c                           |  14 +-
 executables/nr-uesoftmodem.c                  |  32 +-
 executables/nr-uesoftmodem.h                  |  14 +-
 openair1/PHY/NR_TRANSPORT/nr_dlsch.h          |   2 +-
 .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c   | 370 ++++++------------
 openair1/SCHED_NR_UE/defs.h                   |  12 +-
 openair1/SCHED_NR_UE/phy_procedures_nr_ue.c   |  25 +-
 openair1/SIMULATION/NR_PHY/dlsim.c            |  13 +-
 10 files changed, 192 insertions(+), 296 deletions(-)

diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 94d55d5fe50..d918ade2551 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -3231,6 +3231,7 @@ add_executable(nr_dlschsim
   ${OPENAIR_DIR}/common/utils/system.c
   ${OPENAIR_DIR}/common/utils/nr/nr_common.c
   ${OPENAIR_DIR}/common/utils/utils.c
+  ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
   ${UTIL_SRC}
   ${T_SOURCE}
   ${SHLIB_LOADER_SOURCES}
@@ -3245,6 +3246,7 @@ add_executable(nr_pbchsim
   ${OPENAIR_DIR}/common/utils/system.c
   ${OPENAIR_DIR}/common/utils/nr/nr_common.c
   ${OPENAIR_DIR}/common/utils/utils.c
+  ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
   ${UTIL_SRC}
   ${T_SOURCE}
   ${SHLIB_LOADER_SOURCES}
@@ -3261,6 +3263,7 @@ add_executable(nr_pucchsim
   ${OPENAIR_DIR}/common/utils/nr/nr_common.c
   ${OPENAIR_DIR}/common/utils/system.c
   ${OPENAIR_DIR}/common/utils/utils.c
+  ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
   ${UTIL_SRC}
   ${T_SOURCE}
   ${SHLIB_LOADER_SOURCES}
@@ -3279,6 +3282,7 @@ add_executable(nr_dlsim
   ${OPENAIR2_DIR}/RRC/NAS/nas_config.c
   ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
   ${NFAPI_USER_DIR}/nfapi.c
+  ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
   ${UTIL_SRC}
   ${T_SOURCE}
   ${SHLIB_LOADER_SOURCES}
@@ -3298,6 +3302,7 @@ add_executable(nr_prachsim
   ${OPENAIR2_DIR}/RRC/NAS/nas_config.c
   ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
   ${NFAPI_USER_DIR}/nfapi.c
+  ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
   ${UTIL_SRC}
   ${T_SOURCE}
   ${SHLIB_LOADER_SOURCES})
diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h
index 55dea688962..240e89a0e73 100644
--- a/common/utils/LOG/log.h
+++ b/common/utils/LOG/log.h
@@ -148,6 +148,7 @@ extern "C" {
 #define DEBUG_SECURITY     (1<<11)
 #define DEBUG_NAS          (1<<12)
 #define DEBUG_RLC          (1<<13)
+#define DEBUG_DLSCH_DECOD  (1<<14)
 #define UE_TIMING          (1<<20)
 
 
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index 15947ba8811..6afbae91b09 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -411,7 +411,7 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
     phy_procedures_slot_parallelization_nrUE_RX( UE, proc, 0, 0, 1, UE->mode, no_relay, NULL );
 #else
     uint64_t a=rdtsc();
-    phy_procedures_nrUE_RX( UE, proc, 0, UE->mode);
+    phy_procedures_nrUE_RX( UE, proc, 0, UE->mode,get_nrUE_params()->nr_dlsch_parallel);
     LOG_D(PHY,"phy_procedures_nrUE_RX: slot:%d, time %lu\n", proc->nr_slot_rx, (rdtsc()-a)/3500);
     //printf(">>> nr_ue_pdcch_procedures ended\n");
 #endif
@@ -624,7 +624,7 @@ void *UE_thread(void *arg) {
 
   while (!oai_exit) {
     if (syncRunning) {
-      notifiedFIFO_elt_t *res=tryPullTpool(&nf, Tpool);
+      notifiedFIFO_elt_t *res=tryPullTpool(&nf,&(get_nrUE_params()->Tpool));
 
       if (res) {
         syncRunning=false;
@@ -650,7 +650,7 @@ void *UE_thread(void *arg) {
       syncData_t *syncMsg=(syncData_t *)NotifiedFifoData(Msg);
       syncMsg->UE=UE;
       memset(&syncMsg->proc, 0, sizeof(syncMsg->proc));
-      pushTpool(Tpool, Msg);
+      pushTpool(&(get_nrUE_params()->Tpool), Msg);
       trashed_frames=0;
       syncRunning=true;
       continue;
@@ -765,7 +765,7 @@ void *UE_thread(void *arg) {
     notifiedFIFO_elt_t *res;
 
     while (nbSlotProcessing >= RX_NB_TH) {
-      res=pullTpool(&nf, Tpool);
+      res=pullTpool(&nf, &(get_nrUE_params()->Tpool));
       nbSlotProcessing--;
       processingData_t *tmp=(processingData_t *)res->msgData;
 
@@ -798,13 +798,13 @@ void *UE_thread(void *arg) {
 
     nbSlotProcessing++;
     msgToPush->key=slot_nr;
-    pushTpool(Tpool, msgToPush);
+    pushTpool(&(get_nrUE_params()->Tpool), msgToPush);
 
     if (IS_SOFTMODEM_RFSIM || IS_SOFTMODEM_NOS1) {  //getenv("RFSIMULATOR")
       // FixMe: Wait previous thread is done, because race conditions seems too bad
       // in case of actual RF board, the overlap between threads mitigate the issue
       // We must receive one message, that proves the slot processing is done
-      res=pullTpool(&nf, Tpool);
+      res=pullTpool(&nf, &(get_nrUE_params()->Tpool));
       nbSlotProcessing--;
       processingData_t *tmp=(processingData_t *)res->msgData;
 
@@ -860,7 +860,7 @@ void init_NR_UE_threads(int nb_inst) {
     LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]);
     threadCreate(&threads[inst], UE_thread, (void *)UE, "UEthread", -1, OAI_PRIORITY_RT_MAX);
 
-     if( IS_DLSCH_PARALLEL)
+     if(get_nrUE_params()->nr_dlsch_parallel)
      {
        pthread_t dlsch0_threads;
        threadCreate(&dlsch0_threads, dlsch_thread, (void *)UE, "DLthread", -1, OAI_PRIORITY_RT_MAX-1);
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index ebb92fef443..af1b712a706 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -43,6 +43,7 @@
 #include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
 #include "SCHED/sched_common_vars.h"
 #include "PHY/MODULATION/modulation_vars.h"
+#include "PHY/NR_TRANSPORT/nr_dlsch.h"
 //#include "../../SIMU/USER/init_lte.h"
 
 #include "LAYER2/MAC/mac_vars.h"
@@ -97,8 +98,8 @@ pthread_cond_t sync_cond;
 pthread_mutex_t sync_mutex;
 int sync_var=-1; //!< protected by mutex \ref sync_mutex.
 int config_sync_var=-1;
-tpool_t *Tpool;
-tpool_t *Tpool_dl;
+
+
 
 RAN_CONTEXT_t RC;
 volatile int             start_eNB = 0;
@@ -218,11 +219,16 @@ uint64_t set_nrUE_optmask(uint64_t bitmask) {
 nrUE_params_t *get_nrUE_params(void) {
   return &nrUE_params;
 }
-
+/* initialie thread pools used for NRUE processing paralleliation */ 
+void init_tpools(uint8_t nun_dlsch_threads) {
+  
+  initTpool("-1,-1", &(nrUE_params.Tpool), false);
+  init_dlsch_tpool(nrUE_params.nr_dlsch_parallel);
+}
 static void get_options(void) {
 
   char *loopfile=NULL;
-  int32_t nr_dlsch_parallel=0;
+
   paramdef_t cmdline_params[] =CMDLINE_PARAMS_DESC_UE ;
   config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
   paramdef_t cmdline_uemodeparams[] = CMDLINE_UEMODEPARAMS_DESC;
@@ -249,8 +255,6 @@ static void get_options(void) {
   if ((cmdline_uemodeparams[CMDLINE_DUMPMEMORY_IDX].paramflags & PARAMFLAG_PARAMSET) != 0)
     mode = rx_dump_frame;
 
-  if (nr_dlsch_parallel) 
-  	set_nrUE_optmask(NRUE_DLSCH_PARALLEL_BIT);
   if (vcdflag > 0)
     ouput_vcd = 1;
 
@@ -261,6 +265,7 @@ static void get_options(void) {
     printf("%s\n",uecap_xer);
     uecap_xer_in=1;
   } /* UE with config file  */
+    init_tpools(nrUE_params.nr_dlsch_parallel);
 }
 
 // set PHY vars from command line
@@ -450,19 +455,6 @@ void *rrc_enb_process_msg(void *notUsed) {
   return NULL;
 }
 
-/* initialie thread pools used for NRUE processing paralleliation */ 
-void init_tpools(void) {
-  tpool_t pool;
-  Tpool = &pool;
-  char params[]="-1,-1";
-  initTpool(params, Tpool, false);
-  if( IS_DLSCH_PARALLEL) {
-    tpool_t pool_dl;
-    Tpool_dl = &pool_dl;
-    char params_dl[]="-1,-1,-1,-1";
-    initTpool(params_dl, Tpool_dl, false);
-  }
-}
 
 int main( int argc, char **argv ) {
   //uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2;
@@ -489,7 +481,7 @@ int main( int argc, char **argv ) {
 #endif
   //randominit (0);
   set_taus_seed (0);
-  init_tpools();
+
   cpuf=get_cpu_freq_GHz();
   itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info);
 
diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h
index 7e4e18d91cd..ec6409cf80c 100644
--- a/executables/nr-uesoftmodem.h
+++ b/executables/nr-uesoftmodem.h
@@ -53,17 +53,17 @@
   }
 
   
-#define  CONFIG_HLP_DLSCH_PARA             "enable dlsch processing parallelization"
+#define  CONFIG_HLP_DLSCH_PARA             "number of threads for dlsch processing 0 for no parallelization"
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
 /*                                            command line parameters common to gNB and UE                                                            */
 /*   optname                helpstr                 paramflags      XXXptr                                 defXXXval              type         numelt */
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
 #define CMDLINE_PARAMS_DESC_UE {  \
   {"single-thread-disable", CONFIG_HLP_NOSNGLT,     PARAMFLAG_BOOL, iptr:&single_thread_flag,                 defintval:1,           TYPE_INT,    0}, \
-  {"dlsch-parallel",        CONFIG_HLP_DLSCH_PARA,  PARAMFLAG_BOOL, iptr:(int32_t *)&nr_dlsch_parallel,       defintval:0,           TYPE_INT,    0}, \
+  {"dlsch-parallel",        CONFIG_HLP_DLSCH_PARA,  0,              iptr:(int32_t *)&nrUE_params.nr_dlsch_parallel,       defintval:0,           TYPE_UINT8,  0}, \
   {"nr-dlsch-demod-shift",  CONFIG_HLP_DLSHIFT,     0,              iptr:(int32_t *)&nr_dlsch_demod_shift,    defintval:0,           TYPE_INT,    0}, \
   {"A" ,                    CONFIG_HLP_TADV,        0,              uptr:&timing_advance,                     defintval:0,           TYPE_UINT,   0}, \
-  {"E" ,                    CONFIG_HLP_TQFS,        PARAMFLAG_BOOL, i8ptr:&(openair0_cfg[0].threequarter_fs),  defintval:0,          TYPE_INT8,    0}, \
+  {"E" ,                    CONFIG_HLP_TQFS,        PARAMFLAG_BOOL, i8ptr:&(openair0_cfg[0].threequarter_fs), defintval:0,          TYPE_INT8,    0}, \
   {"T" ,                    CONFIG_HLP_TDD,         PARAMFLAG_BOOL, iptr:&tddflag,                            defintval:0,           TYPE_INT,    0}, \
   {"V" ,                    CONFIG_HLP_VCD,         PARAMFLAG_BOOL, iptr:&vcdflag,                            defintval:0,           TYPE_INT,    0}, \
   {"ue-timing-correction-disable", CONFIG_HLP_DISABLETIMECORR, PARAMFLAG_BOOL, iptr:&UE_no_timing_correction, defintval:0,           TYPE_INT,    0}, \
@@ -72,12 +72,11 @@
 
 
 
-#define NRUE_DLSCH_PARALLEL_BIT            (1<<0)
-
-#define IS_DLSCH_PARALLEL            ( get_nrUE_optmask() & NRUE_DLSCH_PARALLEL_BIT)
 
 typedef struct {
   uint64_t       optmask;   //mask to store boolean config options
+  uint8_t        nr_dlsch_parallel; // number of threads for dlsch decoding, 0 means no parallelization
+  tpool_t        Tpool;             // thread pool 
 } nrUE_params_t;
 extern uint64_t get_nrUE_optmask(void);
 extern uint64_t set_nrUE_optmask(uint64_t bitmask);
@@ -96,6 +95,5 @@ extern void reset_opp_meas(void);
 extern void print_opp_meas(void);
 void *UE_thread(void *arg);
 void init_nr_ue_vars(PHY_VARS_NR_UE *ue, uint8_t UE_id, uint8_t abstraction_flag);
-extern tpool_t *Tpool;
-extern tpool_t *Tpool_dl;
+
 #endif
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
index 23ec7565318..6af8f28eac1 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
@@ -95,7 +95,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
 		      time_stats_t *dlsch_interleaving_stats,
 		      time_stats_t *dlsch_segmentation_stats);
 
-
+void init_dlsch_tpool(uint8_t nun_dlsch_threads);
 void nr_emulate_dlsch_payload(uint8_t* payload, uint16_t size);
 
 void dump_pdsch_stats(PHY_VARS_gNB *gNB);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 9c87cf26d5f..8cd59f7d5e6 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -44,7 +44,7 @@
 #include "executables/nr-uesoftmodem.h"
 #include "PHY/CODING/nrLDPC_extern.h"
 #include "LAYER2/NR_MAC_gNB/mac_proto.h"
-//#define DEBUG_DLSCH_DECODING
+
 //#define ENABLE_PHY_PAYLOAD_DEBUG 1
 
 //#define OAI_LDPC_MAX_NUM_LLR 27000//26112 // NR_LDPC_NCOL_BG1*NR_LDPC_ZMAX
@@ -56,7 +56,22 @@ notifiedFIFO_t freeBlocks_dl;
 notifiedFIFO_elt_t *msgToPush_dl;
 int nbDlProcessing =0;
 
+
+static  tpool_t pool_dl;
+
 //extern double cpuf;
+void init_dlsch_tpool(uint8_t nun_dlsch_threads)
+{
+    if( nun_dlsch_threads==0)
+    	return;
+
+    char *params=malloc(nun_dlsch_threads*3*sizeof(char));
+    for (int i=0; i<nun_dlsch_threads; i++) {
+  	  memcpy(params+(i*3),"-1\0",3);
+  }
+    initTpool(params, &pool_dl, false);	
+}
+
 
 void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL)
 {
@@ -140,7 +155,6 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
     dlsch->max_ldpc_iterations = max_ldpc_iterations;
  
     for (i=0; i<Mdlharq; i++) {
-      //      printf("new_ue_dlsch: Harq process %d\n",i);
       dlsch->harq_processes[i] = (NR_DL_UE_HARQ_t *)malloc16(sizeof(NR_DL_UE_HARQ_t));
 
       if (dlsch->harq_processes[i]) {
@@ -188,7 +202,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
       return(dlsch);
   }
 
-  printf("new_ue_dlsch with size %zu: exit_flag = %u\n",sizeof(NR_DL_UE_HARQ_t), exit_flag);
+  LOG_I(PHY,"new_ue_dlsch with size %zu: exit_flag = %u\n",sizeof(NR_DL_UE_HARQ_t), exit_flag);
   free_nr_ue_dlsch(&dlsch,N_RB_DL);
 
   return(NULL);
@@ -250,7 +264,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
   t_nrLDPC_time_stats* p_procTime =&procTime ;
   
   if (!harq_process) {
-    printf("dlsch_decoding.c: NULL harq_process pointer\n");
+    LOG_E(PHY,"dlsch_decoding.c: NULL harq_process pointer\n");
     return(dlsch->max_ldpc_iterations + 1);
   }
   t_nrLDPC_procBuf** p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf;
@@ -290,12 +304,12 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
   //NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[0];
 
   if (!dlsch_llr) {
-    printf("dlsch_decoding.c: NULL dlsch_llr pointer\n");
+    LOG_E(PHY,"dlsch_decoding.c: NULL dlsch_llr pointer\n");
     return(dlsch->max_ldpc_iterations + 1);
   }
 
   if (!frame_parms) {
-    printf("dlsch_decoding.c: NULL frame_parms pointer\n");
+    LOG_E(PHY,"dlsch_decoding.c: NULL frame_parms pointer\n");
     return(dlsch->max_ldpc_iterations + 1);
   }
 
@@ -395,12 +409,10 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
                     &harq_process->F,
                     p_decParams->BG);
 
-#ifdef DEBUG_DLSCH_DECODING
-    if (!frame%100)
-      printf("K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl);
-#endif
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD) && (!frame%100))
+       LOG_I(PHY,"K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl);
   }
-
+  
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
 
   p_decParams->Z = harq_process->Z;
@@ -426,9 +438,9 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
     return((1+dlsch->max_ldpc_iterations));
   }
 
-#ifdef DEBUG_DLSCH_DECODING
-  printf("Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
-#endif
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+    LOG_I(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
+
 
   opp_enabled=1;
 
@@ -456,8 +468,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_OUT);
 
-    //for (int i =0; i<16; i++)
-    //          printf("rx output deinterleaving w[%d]= %d r_offset %d\n", i,harq_process->w[r][i], r_offset);
 
 #if UE_TIMING_TRACE
     stop_meas(dlsch_deinterleaving_stats);
@@ -511,29 +521,20 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
 #endif
     }
 
-
-    //for (int i =0; i<16; i++)
-    //      printf("rx output ratematching d[%d]= %d r_offset %d\n", i,harq_process->d[r][i], r_offset);
-
     r_offset += E;
 
-#ifdef DEBUG_DLSCH_DECODING
-    if (r==0) {
-      write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0);
-      write_output("decoder_in.m","dec",&harq_process->d[0][0],E,1,0);
-    }
-
-    printf("decoder input(segment %u) :",r);
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+  {
+    LOG_I(PHY,"decoder input(segment %u) :",r);
     int i;
     for (i=0;i<E;i++)
-      printf("%d : %d\n",i,harq_process->d[r][i]);
-    printf("\n");
-#endif
+     LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
+    LOG_D(PHY,"\n");
+  }
 
-    //    printf("Clearing c, %p\n",harq_process->c[r]);
     memset(harq_process->c[r],0,Kr_bytes);
 
-    //    printf("done\n");
+
     if (harq_process->C == 1){
     	if (A > 3824) 
     		crc_type = CRC24_A;
@@ -554,9 +555,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
       start_meas(dlsch_turbo_decoding_stats);
 #endif
 
-      //LOG_E(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d A %d ",frame%1024,nr_slot_rx,r,harq_process->C-1, A);
-
-      //printf("harq process dr iteration %d\n", p_decParams->numMaxIter);
 
       memset(pv,0,2*harq_process->Z*sizeof(int16_t));
       //memset(pl,0,2*p_decParams->Z*sizeof(int8_t));
@@ -601,7 +599,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
         ret = no_iteration_ldpc;
       }
       else {
-        LOG_D(PHY,"CRC NOK\n\033[0m");
+        LOG_I(PHY,"CRC NOK\n\033[0m");
         ret = 1 + dlsch->max_ldpc_iterations;
       }
 
@@ -611,24 +609,17 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
         nb_error_decod++;
       }
 
-      //if (!nb_total_decod%10000){
-      //printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);fflush(stdout);
-      //}
-      //else
-      //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc);
-
       for (int m=0; m < Kr>>3; m ++)
       {
         harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
       }
 
-#ifdef DEBUG_DLSCH_DECODING
-      //printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]);
-      for (int k=0;k<A>>3;k++)
-        printf("output decoder [%d] =  0x%02x \n", k, harq_process->c[r][k]);
-      printf("no_iterations_ldpc %d (ret %u)\n",no_iteration_ldpc,ret);
-      //write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4);
-#endif
+      if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+      	{
+        for (int k=0;k<A>>3;k++)
+          LOG_D(PHY,"output decoder [%d] =  0x%02x \n", k, harq_process->c[r][k]);
+        LOG_D(PHY,"no_iterations_ldpc %d (ret %u)\n",no_iteration_ldpc,ret);
+        }
 
 
 #if UE_TIMING_TRACE
@@ -636,33 +627,22 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
 #endif
     }
     
-    
-
-    /*printf("Segmentation: C %d r %d, dlsch_rate_unmatching_stats %5.3f dlsch_deinterleaving_stats %5.3f  dlsch_turbo_decoding_stats %5.3f \n",
-                  harq_process->C,
-                  r,
-                  dlsch_rate_unmatching_stats->p_time/(cpuf*1000.0),
-                  dlsch_deinterleaving_stats->p_time/(cpuf*1000.0),
-                  dlsch_turbo_decoding_stats->p_time/(cpuf*1000.0));*/
-
 
     if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
-      LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
+      LOG_I(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
       err_flag = 1;
     }
   }
 
   if (err_flag == 1) {
-//#if UE_DEBUG_TRACE
-    LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
+    LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
         phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
-//#endif
+
     harq_process->harq_ack.ack = 0;
     harq_process->harq_ack.harq_id = harq_pid;
     harq_process->harq_ack.send_harq_status = 1;
     harq_process->errors[harq_process->round]++;
 
-    //    printf("Rate: [UE %d] DLSCH: Setting NACK for slot %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round);
     if (harq_process->round >= dlsch->Mlimit) {
       harq_process->status = SCH_IDLE;
       harq_process->round  = 0;
@@ -671,16 +651,15 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
 
     if(is_crnti)
     {
-    LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
+    LOG_I(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
                phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
     }
 
     return((1 + dlsch->max_ldpc_iterations));
   } else {
-//#if UE_DEBUG_TRACE
+
     LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
 	  phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
-//#endif
 
     harq_process->status = SCH_IDLE;
     harq_process->round  = 0;
@@ -704,11 +683,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
   Kr = harq_process->K;
   Kr_bytes = Kr>>3;
 
-  /*
-  printf("harq_pid %d\n",harq_pid);
-  printf("F %d, Fbytes %d\n",harq_process->F,harq_process->F>>3);
-  printf("C %d\n",harq_process->C);
-  */
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG, VCD_FUNCTION_IN);
 
@@ -719,30 +693,22 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
 	   Kr_bytes- - (harq_process->F>>3) -((harq_process->C>1)?3:0));
     offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
 
-#ifdef DEBUG_DLSCH_DECODING
-    printf("Segment %u : Kr= %u bytes\n",r,Kr_bytes);
-    printf("copied %d bytes to b sequence (harq_pid %d)\n",
-              (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid);
-              printf("b[0] = %x,c[%d] = %x\n",
-              harq_process->b[offset],
+    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+      {
+      LOG_D(PHY,"Segment %u : Kr= %u bytes\n",r,Kr_bytes);
+      LOG_D(PHY,"copied %d bytes to b sequence (harq_pid %d)\n",
+             (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid);
+      LOG_D(PHY,"b[0] = %p,c[%d] = %p\n",
+              (void *)(uint64_t)(harq_process->b[offset]),
               harq_process->F>>3,
-              harq_process->c[r]);
-
-              /*printf ("Printing payload bytes:");
-                for (int i = 0; i < Kr_bytes; i++){
-                printf("%d : %d \n", i, harq_process->b[i]);
-                }*/
-#endif
-
-#if defined(ENABLE_PHY_PAYLOAD_DEBUG)
-           if (frame%100 == 0){
-              LOG_I (PHY, "Printing 10 first payload bytes at frame: %d ", frame);
-              for (int i = 0; i <10 ; i++){ //Kr_bytes
-            	  LOG_I(PHY, "[%d] : %x ", i, harq_process->b[i]);
-              }
+              (void *)(uint64_t)(harq_process->c[r]) );
+      if (frame%100 == 0){
+          LOG_D (PHY, "Printing 10 first payload bytes at frame: %d ", frame);
+          for (int i = 0; i <10 ; i++){ //Kr_bytes
+            LOG_D(PHY, "[%d] : %x ", i, harq_process->b[i]);
           }
-#endif
-
+        }
+      }
   }
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG, VCD_FUNCTION_OUT);
@@ -790,7 +756,7 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
   t_nrLDPC_time_stats* p_procTime =&procTime ;
   int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
     if (!harq_process) {
-    printf("dlsch_decoding.c: NULL harq_process pointer\n");
+    LOG_E(PHY,"dlsch_decoding.c: NULL harq_process pointer\n");
     return(dlsch->max_ldpc_iterations);
   }
   t_nrLDPC_procBuf* p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[0];
@@ -822,14 +788,14 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN);
 
   if (!dlsch_llr) {
-    printf("dlsch_decoding.c: NULL dlsch_llr pointer\n");
+    LOG_E(PHY,"dlsch_decoding.c: NULL dlsch_llr pointer\n");
     return(dlsch->max_ldpc_iterations);
   }
 
 
 
   if (!frame_parms) {
-    printf("dlsch_decoding.c: NULL frame_parms pointer\n");
+    LOG_E(PHY,"dlsch_decoding.c: NULL frame_parms pointer\n");
     return(dlsch->max_ldpc_iterations);
   }
 
@@ -872,14 +838,12 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
 
   G = harq_process->G;
 
-  LOG_D(PHY,"DLSCH Decoding main, harq_pid %d TBS %d G %d, nb_re_dmrs %d, length_dmrs %d  mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, nb_re_dmrs, length_dmrs, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
+  LOG_I(PHY,"DLSCH Decoding main, harq_pid %d TBS %d G %d, nb_re_dmrs %d, length_dmrs %d  mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, nb_re_dmrs, length_dmrs, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
 
   proc->decoder_main_available = 1;
   proc->decoder_thread_available = 0;
   proc->decoder_thread_available1 = 0;
-  //get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe);
 
-  //  printf("DLSCH Decoding, harq_pid %d Ndi %d\n",harq_pid,harq_process->Ndi);
 
   if ((harq_process->R)<1024)
     Coderate = (float) (harq_process->R) /(float) 1024;
@@ -939,7 +903,6 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
     
     p_decParams->Z = harq_process->Z;
 
-  //printf("coderate %f kc %d \n", Coderate, kc);
   p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
   p_decParams->outMode= 0;
 
@@ -957,15 +920,15 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
     LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,a_segments);
     return((1+dlsch->max_ldpc_iterations));
   }
-#ifdef DEBUG_DLSCH_DECODING
-  printf("Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
-#endif
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+    LOG_I(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
+
 
   notifiedFIFO_elt_t *res_dl;
   opp_enabled=1;
   if (harq_process->C>1) {
 	for (int nb_seg =1 ; nb_seg<harq_process->C; nb_seg++){
-	  if ( (res_dl=tryPullTpool(&nf, Tpool_dl)) != NULL ) {
+	  if ( (res_dl=tryPullTpool(&nf, &pool_dl)) != NULL ) {
 	          pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res_dl);
 	        }
 
@@ -987,7 +950,7 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
 	  curMsg->proc.llr8_flag = llr8_flag;
 
 	  msgToPush_dl->key= (nr_slot_rx%2) ? (nb_seg+30): nb_seg;
-	  pushTpool(Tpool_dl, msgToPush_dl);
+	  pushTpool(&pool_dl, msgToPush_dl);
 
   /*Qm= harq_process->Qm;
     Nl=harq_process->Nl;
@@ -1031,10 +994,9 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
                            harq_process->w[r],
                            dlsch_llr+r_offset);
 
-#ifdef DEBUG_DLSCH_DECODING
+    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
         for (int i =0; i<16; i++)
-              printf("rx output deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset);
-#endif
+              LOG_D(PHY,"rx output deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset);
 
 #if UE_TIMING_TRACE
     stop_meas(dlsch_deinterleaving_stats);
@@ -1044,8 +1006,8 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
     start_meas(dlsch_rate_unmatching_stats);
 #endif
 
-#ifdef DEBUG_DLSCH_DECODING
-    LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+    LOG_I(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
           harq_pid,r, G,
           Kr*3,
           harq_process->TBS,
@@ -1054,7 +1016,7 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
           harq_process->Nl,
           harq_process->rvidx,
           harq_process->round);
-#endif
+ 
 
     // for tbslbrm calculation according to 5.4.2.1 of 38.212
     if (harq_process->Nl < Nl)
@@ -1086,35 +1048,28 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
 #endif
     }
 
-    //for (int i =0; i<16; i++)
-    //      printf("rx output ratematching d[%d]= %d r_offset %d\n", i,harq_process->d[r][i], r_offset);
-
-    //r_offset += E;
-    //printf("main thread r_offset %d\n",r_offset);
  
-#ifdef DEBUG_DLSCH_DECODING   
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))   
     for (int i =0; i<16; i++)
-      printf("rx output ratematching d[%d]= %d r_offset %u\n", i,harq_process->d[r][i], r_offset);
-#endif
+      LOG_I(PHY,"rx output ratematching d[%d]= %d r_offset %u\n", i,harq_process->d[r][i], r_offset);
 
-#ifdef DEBUG_DLSCH_DECODING
+
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) 
+    {
 
     if (r==0) {
-      write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0);
-      write_output("decoder_in.m","dec",&harq_process->d[0][96],(3*8*Kr_bytes)+12,1,0);
+      LOG_M("decoder_llr.m","decllr",dlsch_llr,G,1,0);
+      LOG_M("decoder_in.m","dec",&harq_process->d[0][96],(3*8*Kr_bytes)+12,1,0);
     }
 
-    printf("decoder input(segment %u) :",r);
+    LOG_D(PHY,"decoder input(segment %u) :",r);
     for (int i=0;i<(3*8*Kr_bytes);i++)
-      printf("%d : %d\n",i,harq_process->d[r][i]);
-    printf("\n");
-#endif
-
+      LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
+    LOG_D(PHY,"\n");
+   }
 
-    //    printf("Clearing c, %p\n",harq_process->c[r]);
     memset(harq_process->c[r],0,Kr_bytes);
 
-    //    printf("done\n");
     if (harq_process->C == 1){
       if (A > 3824)
     	crc_type = CRC24_A;
@@ -1140,7 +1095,7 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
 #if UE_TIMING_TRACE
       start_meas(dlsch_turbo_decoding_stats);
 #endif
-      LOG_D(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
+      LOG_I(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
 
       /*for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
         inv_d[cnt] = (1)*harq_process->d[r][cnt];
@@ -1188,7 +1143,7 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
         ret = 2;
       }
       else {
-        LOG_D(PHY,"CRC NOK\n");
+        LOG_I(PHY,"CRC NOK\n");
         ret = 1+dlsch->max_ldpc_iterations;
       }
 
@@ -1196,9 +1151,6 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
         printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);fflush(stdout);
     }
 
-    //else
-      //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc);
-
       for (int m=0; m < Kr>>3; m ++)
       {
         harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
@@ -1220,10 +1172,10 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
     //printf("output channel decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]);
 
     //printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]);
-#ifdef DEBUG_DLSCH_DECODING
-      for (int k=0;k<32;k++)
-        printf("output decoder [%d] =  0x%02x \n", k, harq_process->c[r][k]);
-#endif
+     if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+       for (int k=0;k<32;k++)
+         LOG_D(PHY,"output decoder [%d] =  0x%02x \n", k, harq_process->c[r][k]);
+
 
 #if UE_TIMING_TRACE
       stop_meas(dlsch_turbo_decoding_stats);
@@ -1232,40 +1184,36 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
 
 
     if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
-      LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
+      LOG_I(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
       err_flag = 1;
     }
   //} //loop r
 
   if (err_flag == 1) {
-#if UE_DEBUG_TRACE
-    LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
+    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+      LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
         phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
-#endif
     harq_process->harq_ack.ack = 0;
     harq_process->harq_ack.harq_id = harq_pid;
     harq_process->harq_ack.send_harq_status = 1;
     harq_process->errors[harq_process->round]++;
     harq_process->round++;
 
-
-    //    printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
     if (harq_process->round >= dlsch->Mlimit) {
       harq_process->status = SCH_IDLE;
       harq_process->round  = 0;
     }
     if(is_crnti)
     {
-    LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
+    LOG_I(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
                phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mlimit,harq_process->TBS);
     }
 
     return((1+dlsch->max_ldpc_iterations));
   } else {
-#if UE_DEBUG_TRACE
-      LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d\n",
+   if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+      LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d\n",
            phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
-#endif
 
     harq_process->status = SCH_IDLE;
     harq_process->round  = 0;
@@ -1319,15 +1267,16 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
                Kr_bytes- - (harq_process->F>>3) -((harq_process->C>1)?3:0));
       offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
 
-#ifdef DEBUG_DLSCH_DECODING
-      printf("Segment %u : Kr= %u bytes\n",r,Kr_bytes);
-      printf("copied %d bytes to b sequence (harq_pid %d)\n",
-                (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid);
-                printf("b[0] = %x,c[%d] = %x\n",
-                harq_process->b[offset],
-                harq_process->F>>3,
-                harq_process->c[r]);
-#endif
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+    {
+    LOG_I(PHY,"Segment %u : Kr= %u bytes\n",r,Kr_bytes);
+    LOG_I(PHY,"copied %d bytes to b sequence (harq_pid %d)\n",
+              (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid);
+     LOG_I(PHY,"b[0] = %p,c[%d] = %p\n",
+              (void *)(uint64_t)(harq_process->b[offset]),
+              harq_process->F>>3,
+               (void *)(uint64_t)(harq_process->c[r]));
+    }
   }
   
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
@@ -1402,25 +1351,12 @@ void nr_dlsch_decoding_process(void *arg)
   NR_UE_DLSCH_t *dlsch      = phy_vars_ue->dlsch[proc->thread_id][eNB_id][0];
   NR_DL_UE_HARQ_t *harq_process  = dlsch->harq_processes[harq_pid];
   short *dlsch_llr        = phy_vars_ue->pdsch_vars[proc->thread_id][eNB_id]->llr[0];
-  //printf("2thread0 llr flag %d tdp flag %d\n",llr8_flag1, tdp->llr8_flag);
+
   p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[r];
   nb_symb_sch = harq_process->nb_symbols;
-  printf("dlsch decoding process frame %d slot %d segment %d r %u nb symb %d \n", frame, proc->nr_slot_rx, proc->num_seg, r, harq_process->nb_symbols);
+  LOG_I(PHY,"dlsch decoding process frame %d slot %d segment %d r %u nb symb %d \n", frame, proc->nr_slot_rx, proc->num_seg, r, harq_process->nb_symbols);
 
 
-  /*
-  if (nb_rb > frame_parms->N_RB_DL) {
-    printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb);
-    return(max_ldpc_iterations);
-    }*/
-
-  /*harq_pid = dlsch->current_harq_pid[proc->thread_id];
-  if (harq_pid >= 8) {
-    printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
-    return(max_ldpc_iterations);
-  }
-  */
-
   nb_rb = harq_process->nb_rb;
 
   harq_process->trials[harq_process->round]++;
@@ -1437,7 +1373,7 @@ void nr_dlsch_decoding_process(void *arg)
   harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl);
   G = harq_process->G;
 
-  LOG_D(PHY,"DLSCH Decoding process, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
+  LOG_I(PHY,"DLSCH Decoding process, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
 
   if ((harq_process->R)<1024)
     Coderate = (float) (harq_process->R) /(float) 1024;
@@ -1503,30 +1439,7 @@ void nr_dlsch_decoding_process(void *arg)
   p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
   p_decParams->outMode= 0;
 
-  /*
-  else {
-    printf("dlsch_decoding.c: Ndi>0 not checked yet!!\n");
-    return(max_ldpc_iterations);
-  }
-  */
   err_flag = 0;
-  //r_offset = 0;
-
-  /*
-  uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS;  //number of segments to be allocated
-
-  if (nb_rb != 273) {
-    a_segments = a_segments*nb_rb;
-    a_segments = a_segments/273 +1;
-  }  
-
-  if (harq_process->C > a_segments) {
-    LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,a_segments);
-    return((1+dlsch->max_ldpc_iterations));
-  }*/
-#ifdef DEBUG_DLSCH_DECODING
-  printf("Segmentation: C %d, Cminus %d, Kminus %d, Kplus %d\n",harq_process->C,harq_process->Cminus,harq_process->Kminus,harq_process->Kplus);
-#endif
 
   opp_enabled=1;
   
@@ -1561,10 +1474,10 @@ void nr_dlsch_decoding_process(void *arg)
                            harq_process->w[r],
                            dlsch_llr+r_offset);
 
-#ifdef DEBUG_DLSCH_DECODING
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
     for (int i =0; i<16; i++)
-              printf("rx output thread 0 deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset);
-#endif
+              LOG_D(PHY,"rx output thread 0 deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset);
+
 
 #if UE_TIMING_TRACE
     stop_meas(dlsch_deinterleaving_stats);
@@ -1574,8 +1487,8 @@ void nr_dlsch_decoding_process(void *arg)
     start_meas(dlsch_rate_unmatching_stats);
 #endif
 
-#ifdef DEBUG_DLSCH_DECODING
-    LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+    LOG_I(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
           harq_pid,r, G,
           Kr*3,
           harq_process->TBS,
@@ -1584,7 +1497,7 @@ void nr_dlsch_decoding_process(void *arg)
           harq_process->Nl,
           harq_process->rvidx,
           harq_process->round);
-#endif
+
 
     if (Nl<4)
       Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,Nl);
@@ -1615,25 +1528,14 @@ void nr_dlsch_decoding_process(void *arg)
 #endif
     }
 
-    //for (int i =0; i<16; i++)
-    //      printf("rx output ratematching d[%d]= %d r_offset %d\n", i,harq_process->d[r][i], r_offset);
-
-    //r_offset += E;
-
-#ifdef DEBUG_DLSCH_DECODING
-    if (r==0) {
-              write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0);
-              write_output("decoder_in.m","dec",&harq_process->d[0][0],(3*8*Kr_bytes)+12,1,0);
+    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
+      LOG_D(PHY,"decoder input(segment %u) :",r);
+      for (int i=0;i<(3*8*Kr_bytes)+12;i++)
+        LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
+      LOG_D(PHY,"\n");
     }
 
-    printf("decoder input(segment %u) :",r);
-    int i; for (i=0;i<(3*8*Kr_bytes)+12;i++)
-      printf("%d : %d\n",i,harq_process->d[r][i]);
-      printf("\n");
-#endif
-
 
-    //    printf("Clearing c, %p\n",harq_process->c[r]);
     memset(harq_process->c[r],0,Kr_bytes);
 
     if (harq_process->C == 1){
@@ -1702,39 +1604,23 @@ void nr_dlsch_decoding_process(void *arg)
           ret = 2;
         }
         else {
-          LOG_D(PHY,"Segment %u CRC NOK\n",r);
+          LOG_I(PHY,"Segment %u CRC NOK\n",r);
           ret = 1+dlsch->max_ldpc_iterations;
         }
 
     if (no_iteration_ldpc > 10)
-      LOG_D(PHY,"Error number of iteration LPDC %d\n", no_iteration_ldpc);
-    //else
-      //printf("OK number of iteration LPDC %d\n", no_iteration_ldpc);
+      LOG_I(PHY,"Error number of iteration LPDC %d\n", no_iteration_ldpc);
+
 
     for (int m=0; m < Kr>>3; m ++)
                     {
                   harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
                     }
 
-            /*for (int u=0; u < Kr>>3; u ++)
-                            {
-                      ullrProcBuf[u]= (uint8_t) llrProcBuf[u];
-                            }
-
-
-            printf("output unsigned ullrProcBuf \n");
-
-            for (int j=0; j < Kr>>3; j ++)
-                                    {
-
-                              printf(" %d \n", ullrProcBuf[j]);
+    if ( LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))       
+      for (int k=0;k<2;k++)
+        LOG_D(PHY,"segment 1 output decoder [%d] =  0x%02x \n", k, harq_process->c[r][k]);
 
-                                    }
-          printf(" \n");*/
-#ifdef DEBUG_DLSCH_DECODING       
-  for (int k=0;k<2;k++)
-      printf("segment 1 output decoder [%d] =  0x%02x \n", k, harq_process->c[r][k]);
-#endif 
     
 #if UE_TIMING_TRACE
       stop_meas(dlsch_turbo_decoding_stats);
@@ -1767,7 +1653,7 @@ void *dlsch_thread(void *arg) {
     notifiedFIFO_elt_t *res;
 
     while (nbDlProcessing >= RX_NB_TH_DL) {
-      if ( (res=tryPullTpool(&nf, Tpool_dl)) != NULL ) {
+      if ( (res=tryPullTpool(&nf, &pool_dl)) != NULL ) {
         //nbDlProcessing--;
         pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res);
       }
@@ -1775,7 +1661,7 @@ void *dlsch_thread(void *arg) {
       usleep(200);
     }
     
-    res_dl=pullTpool(&nf, Tpool_dl);
+    res_dl=pullTpool(&nf, &pool_dl);
     nbDlProcessing--;
 	pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res_dl);
     
diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h
index b74494a4041..07bb7a4b3e9 100644
--- a/openair1/SCHED_NR_UE/defs.h
+++ b/openair1/SCHED_NR_UE/defs.h
@@ -110,15 +110,17 @@ int phy_procedures_RN_UE_RX(unsigned char last_slot, unsigned char next_slot, re
 void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t eNB_id);
 
 /*! \brief Scheduling for UE RX procedures in normal subframes.
-  @param ue       Pointer to UE variables on which to act
-  @param proc     Pointer to proc information
-  @param gNB_id   Local id of eNB on which to act
-  @param mode     calibration/debug mode
+  @param ue             Pointer to UE variables on which to act
+  @param proc           Pointer to proc information
+  @param gNB_id         Local id of eNB on which to act
+  @param mode           calibration/debug mode
+  @param dlsch_parallel use multithreaded dlsch processing
 */
 int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
                            UE_nr_rxtx_proc_t *proc,
                            uint8_t gNB_id,
-                           runmode_t mode);
+                           runmode_t mode,
+                           uint8_t dlsch_parallel);
 
 int phy_procedures_slot_parallelization_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_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);
 
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 32e9bff5b41..42ffd348e9e 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -918,7 +918,8 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
        NR_UE_DLSCH_t *dlsch0,
        NR_UE_DLSCH_t *dlsch1,
        int *dlsch_errors,
-       runmode_t mode) {
+       runmode_t mode,
+       uint8_t dlsch_parallel) {
 
   if (dlsch0==NULL)
     AssertFatal(0,"dlsch0 should be defined at this level \n");
@@ -1049,7 +1050,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
       start_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
 #endif
 
-  if( IS_DLSCH_PARALLEL)
+  if( dlsch_parallel)
     {
     ret = nr_dlsch_decoding_mthread(ue,
 			   proc,
@@ -1135,7 +1136,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
           start_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
 #endif
 
-  if( IS_DLSCH_PARALLEL)
+  if(dlsch_parallel)
     {
     ret1 = nr_dlsch_decoding_mthread(ue,
                                      proc,
@@ -1711,8 +1712,10 @@ int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL
 int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
                            UE_nr_rxtx_proc_t *proc,
                            uint8_t gNB_id,
-                           runmode_t mode)
-{
+                           runmode_t mode,
+                           uint8_t dlsch_parallel
+                           )
+{                                         
   int frame_rx = proc->frame_rx;
   int nr_slot_rx = proc->nr_slot_rx;
   int slot_pbch;
@@ -1920,7 +1923,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
                            ue->dlsch_SI[gNB_id],
                            NULL,
                            &ue->dlsch_SI_errors[gNB_id],
-                           mode);
+                           mode,
+                           dlsch_parallel);
 
     // deactivate dlsch once dlsch proc is done
     ue->dlsch_SI[gNB_id]->active = 0;
@@ -1945,7 +1949,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
                            ue->dlsch_p[gNB_id],
                            NULL,
                            &ue->dlsch_p_errors[gNB_id],
-                           mode);
+                           mode,
+                           dlsch_parallel);
 
     // deactivate dlsch once dlsch proc is done
     ue->dlsch_p[gNB_id]->active = 0;
@@ -1970,7 +1975,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
                            ue->dlsch_ra[gNB_id],
                            NULL,
                            &ue->dlsch_ra_errors[gNB_id],
-                           mode);
+                           mode,
+                           dlsch_parallel);
 
     // deactivate dlsch once dlsch proc is done
     ue->dlsch_ra[gNB_id]->active = 0;
@@ -1996,7 +2002,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
 			   ue->dlsch[proc->thread_id][gNB_id][0],
 			   ue->dlsch[proc->thread_id][gNB_id][1],
 			   &ue->dlsch_errors[gNB_id],
-			   mode);
+			   mode,
+			   dlsch_parallel);
 
 
 #if UE_TIMING_TRACE
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 2bd70021f7a..cce2ab41e6a 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -269,7 +269,7 @@ int main(int argc, char **argv)
   uint16_t ptrsSymbPerSlot = 0;
   uint16_t rbSize = 106;
   uint8_t  mcsIndex = 9;
-
+  uint8_t  dlsch_threads = 0;
   if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0) {
     exit_fun("[NR_DLSIM] Error, configuration module init failed\n");
   }
@@ -280,7 +280,7 @@ int main(int argc, char **argv)
 
   FILE *scg_fd=NULL;
   
-  while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:e:m:w:T:U:")) != -1) {
+  while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:d:e:m:w:T:U:")) != -1) {
     switch (c) {
     case 'f':
       scg_fd = fopen(optarg,"r");
@@ -447,7 +447,9 @@ int main(int argc, char **argv)
     case 'b':
       g_rbSize = atoi(optarg);
       break;
-
+    case 'd':
+      dlsch_threads = atoi(optarg);
+      break;    
     case 'e':
       g_mcsIndex = atoi(optarg);
       break;
@@ -512,6 +514,7 @@ int main(int argc, char **argv)
       printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:2}, e.g. -U 2 0 2 \n");
       printf("-P Print DLSCH performances\n");
       printf("-w Write txdata to binary file (one frame)\n");
+      printf("-d number of dlsch threads, 0: no dlsch parallelization\n");
       exit (-1);
       break;
     }
@@ -527,6 +530,7 @@ int main(int argc, char **argv)
   
   if (snr1set==0)
     snr1 = snr0+10;
+  init_dlsch_tpool(dlsch_threads);
 
 
   RC.gNB = (PHY_VARS_gNB**) malloc(sizeof(PHY_VARS_gNB *));
@@ -981,7 +985,8 @@ int main(int argc, char **argv)
         phy_procedures_nrUE_RX(UE,
                                &UE_proc,
                                0,
-                               normal_txrx);
+                               normal_txrx,
+                               dlsch_threads);
         
         //printf("dlsim round %d ends\n",round);
         round++;
-- 
GitLab