From 4c21c2d172c493a1e73b51e76353802367d1dd8f Mon Sep 17 00:00:00 2001
From: francescomani <email@francescomani.it>
Date: Wed, 28 Sep 2022 14:18:03 +0200
Subject: [PATCH] configurable max nb of rounds in ulsim

---
 openair1/SIMULATION/NR_PHY/ulsim.c | 84 +++++++++++++++---------------
 1 file changed, 42 insertions(+), 42 deletions(-)

diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 54c0d42db16..6bc6dc2ec76 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -1057,20 +1057,21 @@ int main(int argc, char **argv)
   }
 
   int ret = 1;
-  uint32_t errors_scrambling[4][100];
-  int n_errors[4][100];
-  int round_trials[4][100];
-  double blerStats[4][100];
-  double berStats[4][100];
+
+  AssertFatal(max_rounds > 0, "Invalind value for max number of rounds %d\n",max_rounds);
+  uint32_t errors_scrambling[max_rounds][100];
+  int n_errors[max_rounds][100];
+  int round_trials[max_rounds][100];
+  double blerStats[max_rounds][100];
+  double berStats[max_rounds][100];
   double snrStats[100];
-  memset(errors_scrambling, 0, sizeof(uint32_t)*4*100);
-  memset(n_errors, 0, sizeof(int)*4*100);
-  memset(round_trials, 0, sizeof(int)*4*100);
-  memset(blerStats, 0, sizeof(double)*4*100);
-  memset(berStats, 0, sizeof(double)*4*100);
-  memset(snrStats, 0, sizeof(double) * 100);
-
-  for (SNR = snr0; SNR <= snr1; SNR += snr_step) {
+  memset(errors_scrambling, 0, sizeof(uint32_t)*max_rounds*100);
+  memset(n_errors, 0, sizeof(int)*max_rounds*100);
+  memset(round_trials, 0, sizeof(int)*max_rounds*100);
+  memset(blerStats, 0, sizeof(double)*max_rounds*100);
+  memset(berStats, 0, sizeof(double)*max_rounds*100);
+  memset(snrStats, 0, sizeof(double)*100);
+  for (SNR = snr0; SNR < snr1; SNR += snr_step) {
     varArray_t *table_rx=initVarArray(1000,sizeof(double));
     int error_flag = 0;
     n_false_positive = 0;
@@ -1103,7 +1104,7 @@ int main(int argc, char **argv)
       round_trials[round][snrRun]++;
       ulsch_ue->harq_processes[harq_pid]->round = round;
       gNB->ulsch[0]->harq_processes[harq_pid]->round = round;
-      rv_index = nr_rv_round_map[round];
+      rv_index = nr_rv_round_map[round%4];
 
       UE_proc.nr_slot_tx = slot;
       UE_proc.frame_tx = frame;
@@ -1539,28 +1540,28 @@ int main(int argc, char **argv)
     effRate[snrRun] /= (double)n_trials;
     
     printf("*****************************************\n");
-    printf("SNR %f: n_errors (%d/%d,%d/%d,%d/%d,%d/%d) (negative CRC), false_positive %d/%d, errors_scrambling (%u/%u,%u/%u,%u/%u,%u/%u\n", SNR, n_errors[0][snrRun], round_trials[0][snrRun],n_errors[1][snrRun], round_trials[1][snrRun],n_errors[2][snrRun], round_trials[2][snrRun],n_errors[3][snrRun], round_trials[3][snrRun], n_false_positive, n_trials, errors_scrambling[0][snrRun],available_bits*n_trials,errors_scrambling[1][snrRun],available_bits*n_trials,errors_scrambling[2][snrRun],available_bits*n_trials,errors_scrambling[3][snrRun],available_bits*n_trials);
+    printf("SNR %f: n_errors (%d/%d", SNR, n_errors[0][snrRun], round_trials[0][snrRun]);
+    for (int r = 1; r < max_rounds; r++)
+      printf(",%d/%d", n_errors[r][snrRun], round_trials[r][snrRun]);
+    printf(") (negative CRC), false_positive %d/%d, errors_scrambling (%u/%u",
+           n_false_positive, n_trials, errors_scrambling[0][snrRun], available_bits*n_trials);
+    for (int r = 1; r < max_rounds; r++)
+      printf(",%u/%u", errors_scrambling[r][snrRun], available_bits*n_trials);
+    printf(")\n");
     printf("\n");
-    blerStats[0][snrRun] = (double)n_errors[0][snrRun]/round_trials[0][snrRun];
-    blerStats[1][snrRun] = (double)n_errors[1][snrRun]/round_trials[1][snrRun];
-    blerStats[2][snrRun] = (double)n_errors[2][snrRun]/round_trials[2][snrRun];
-    blerStats[3][snrRun] = (double)n_errors[3][snrRun]/round_trials[3][snrRun];
-
-    berStats[0][snrRun] = (double)errors_scrambling[0][snrRun]/available_bits/round_trials[0][snrRun];
-    berStats[1][snrRun] = (double)errors_scrambling[1][snrRun]/available_bits/round_trials[1][snrRun];
-    berStats[2][snrRun] = (double)errors_scrambling[2][snrRun]/available_bits/round_trials[2][snrRun];
-    berStats[3][snrRun] = (double)errors_scrambling[3][snrRun]/available_bits/round_trials[3][snrRun];
+
+    for (int r = 0; r < max_rounds; r++) {
+      blerStats[r][snrRun] = (double)n_errors[r][snrRun]/round_trials[r][snrRun];
+      berStats[r][snrRun] = (double)errors_scrambling[r][snrRun]/available_bits/round_trials[r][snrRun];
+    }
     effTP[snrRun] = effRate[snrRun]/(double)TBS*(double)100;
-    printf("SNR %f: Channel BLER (%e,%e,%e,%e), Channel BER (%e,%e,%e,%e) Avg round %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n", 
-	   SNR,
-     blerStats[0][snrRun],
-     blerStats[1][snrRun],
-     blerStats[2][snrRun],
-     blerStats[3][snrRun],
-     berStats[0][snrRun],
-     berStats[1][snrRun],
-     berStats[2][snrRun],
-     berStats[3][snrRun],
+    printf("SNR %f: Channel BLER (%e", SNR, blerStats[0][snrRun]);
+    for (int r = 1; r < max_rounds; r++)
+      printf(",%e", blerStats[r][snrRun]);
+    printf(" Channel BER (%e", berStats[0][snrRun]);
+    for (int r = 1; r < max_rounds; r++)
+      printf(",%e", berStats[r][snrRun]);
+    printf(") Avg round %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n",
 	   roundStats[snrRun],effRate[snrRun],effTP[snrRun],TBS);
 
     FILE *fd=fopen("nr_ulsim.log","w");
@@ -1632,14 +1633,13 @@ int main(int argc, char **argv)
   char opStatsFile[50];
   sprintf(opStatsFile, "ulsimStats_z%d.m", n_rx);
   LOG_M(opStatsFile,"SNR",snrStats,snrRun,1,7);
-  LOG_MM(opStatsFile,"BLER_round0",blerStats[0],snrRun,1,7);
-  LOG_MM(opStatsFile,"BLER_round1",blerStats[1],snrRun,1,7);
-  LOG_MM(opStatsFile,"BLER_round2",blerStats[2],snrRun,1,7);
-  LOG_MM(opStatsFile,"BLER_round3",blerStats[3],snrRun,1,7);
-  LOG_MM(opStatsFile,"BER_round0",berStats[0],snrRun,1,7);
-  LOG_MM(opStatsFile,"BER_round1",berStats[1],snrRun,1,7);
-  LOG_MM(opStatsFile,"BER_round2",berStats[2],snrRun,1,7);
-  LOG_MM(opStatsFile,"BER_round3",berStats[3],snrRun,1,7);
+  for (uint8_t r = 0; r < max_rounds; r++) {
+    char bler[15], ber[15];
+    sprintf(bler, "BLER_round%d", r);
+    sprintf(bler, "BER_round%d", r);
+    LOG_MM(opStatsFile,bler,blerStats[r],snrRun,1,7);
+    LOG_MM(opStatsFile,ber,berStats[r],snrRun,1,7);
+  }
   LOG_MM(opStatsFile,"EffRate",effRate,snrRun,1,7);
   LOG_MM(opStatsFile,"EffTP",effTP,snrRun,1,7);
 
-- 
GitLab