From b2765ac23a3b07dfd3555f9f1d66cd04614eadf9 Mon Sep 17 00:00:00 2001
From: Francesco Mani <francesco.mani@eurecom.fr>
Date: Tue, 28 Jan 2020 13:41:59 +0100
Subject: [PATCH] some changes in pucchsim

---
 openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c | 13 ++---
 openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h |  4 +-
 openair1/SIMULATION/NR_PHY/pucchsim.c   | 67 ++++++++++++++-----------
 openair2/GNB_APP/RRC_nr_paramsvalues.h  | 24 ++++-----
 4 files changed, 55 insertions(+), 53 deletions(-)

diff --git a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
index 351c4ea22a5..d68b3ea1a4c 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
@@ -46,6 +46,7 @@
   #define DEBUG_PUCCH_TX
   #define DEBUG_NR_PUCCH_TX
 #endif
+
 //#define ONE_OVER_SQRT2 23170 // 32767/sqrt(2) = 23170 (ONE_OVER_SQRT2)
 
 void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
@@ -74,10 +75,7 @@ void nr_group_sequence_hopping (pucch_GroupHopping_t PUCCH_GroupHopping,
   // Corresponds to L1 parameter 'HoppingID' (see 38.211, section 6.3.2.2) BIT STRING (SIZE (10))
   //uint16_t n_id = ue->pucch_config_common_nr->hoppingId; // from higher layers FIXME!!!
 #ifdef DEBUG_NR_PUCCH_TX
-  // initialization to be removed
-  PUCCH_GroupHopping=neither;
-  n_id=10;
-  printf("\t\t [nr_group_sequence_hopping] initialization PUCCH_GroupHopping=%u, n_id=%u -> variable initializations TO BE REMOVED\n",PUCCH_GroupHopping,n_id);
+  printf("\t\t [nr_group_sequence_hopping] PUCCH_GroupHopping=%u, n_id=%u \n",PUCCH_GroupHopping,n_id);
 #endif
   uint8_t f_ss=0,f_gh=0;
   *u=0;
@@ -156,11 +154,7 @@ double nr_cyclic_shift_hopping(uint32_t n_id,
   // alpha_init initialized to 2*PI/12=0.5235987756
   double alpha = 0.5235987756;
   uint32_t c_init = n_id; // we initialize c_init again to calculate n_cs
-#ifdef DEBUG_NR_PUCCH_TX
-  // initialization to be remo.ved
-  c_init=10;
-  printf("\t\t [nr_cyclic_shift_hopping] initialization c_init=%u -> variable initialization TO BE REMOVED\n",c_init);
-#endif
+
   uint32_t x1,s = lte_gold_generic(&x1, &c_init, 1); // TS 38.211 Subclause 5.2.1
   uint8_t n_cs=0;
   int l = 32, minShift = (14*8*nr_tti_tx )+ 8*(lnormal+lprime);
@@ -188,6 +182,7 @@ double nr_cyclic_shift_hopping(uint32_t n_id,
 #endif
   return(alpha);
 }
+
 void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
                         int32_t **txdataF,
                         NR_DL_FRAME_PARMS *frame_parms,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h
index e8cd147526b..fbc193e7b13 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h
@@ -139,8 +139,8 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
                           uint8_t occ_index_format4);
 
 // tables for mcs values for different payloads 
- static const uint8_t table1_mcs[]={0,3,6,9};
- static const uint8_t table2_mcs[]={0,1,3,4,6,7,9,10};
+ static const uint8_t table1_mcs[]={0,6,3,9};
+ static const uint8_t table2_mcs[]={0,3,9,6,1,4,10,7};
 
   /*
    * The following tables implement TS 38.211 Subclause 5.2.2.2 Base sequences of length less than 36 (rows->u {0,1,..,29} / columns->n {0,1,...,M_ZC-1)
diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c
index 6af28379015..a9dcdca754e 100644
--- a/openair1/SIMULATION/NR_PHY/pucchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pucchsim.c
@@ -87,12 +87,13 @@ int main(int argc, char **argv)
   uint8_t nacktoack_flag=0;
   int16_t amp=0x7FFF;
   int nr_tti_tx=0; 
-  uint64_t actual_payload=0,payload_received;//payload bits b7b6...b2b1b0 where b7..b3=0 b2b1=HARQ b0 is SR. payload maximum value is 7 for pucch format 0 
+  uint64_t actual_payload=0,payload_received;
   int nr_bit=1; // maximum value possible is 2
   uint8_t m0=0;// higher layer paramater initial cyclic shift
   uint8_t nrofSymbols=1; //number of OFDM symbols can be 1-2 for format 1
   uint8_t startingSymbolIndex=0; // resource allocated see 9.2.1, 38.213 for more info.should be actually present in the resource set provided
   uint16_t startingPRB=0,startingPRB_intraSlotHopping=0; //PRB number not sure see 9.2.1, 38.213 for more info. Should be actually present in the resource set provided
+  uint32_t hoppingId=40;
   uint8_t timeDomainOCC=0;
   SCM_t channel_model=AWGN;//Rayleigh1_anticorr;
   
@@ -114,7 +115,7 @@ int main(int argc, char **argv)
   logInit();
   set_glog(loglvl);
 
-  while ((c = getopt (argc, argv, "f:hA:f:g:i:P:b:T:n:o:s:S:x:y:z:N:F:GR:IL")) != -1) {
+  while ((c = getopt (argc, argv, "f:hA:f:g:i:I:P:B:b:T:m:n:r:o:s:S:x:y:z:N:F:GR:IL")) != -1) {
     switch (c) {
     case 'f':
       //write_output_file=1;
@@ -257,12 +258,24 @@ int main(int argc, char **argv)
     case 'i':
       nrofSymbols=(uint8_t)atoi(optarg);
       break;
+    case 'I':
+      startingSymbolIndex=(uint8_t)atoi(optarg);
+      break;
+    case 'r':
+      startingPRB=atoi(optarg);
+      break;
     case 'P':
       format=atoi(optarg);
       break;
+    case 'm':
+      m0=atoi(optarg);
+      break;
     case 'b':
       nr_bit=atoi(optarg);
       break;
+    case 'B':
+      actual_payload=atoi(optarg);
+      break;
     case 'T':
       nacktoack_flag=(uint8_t)atoi(optarg);
       target_error_rate=0.001;
@@ -292,8 +305,11 @@ int main(int argc, char **argv)
       printf("-f Output filename (.txt format) for Pe/SNR results\n");
       printf("-F Input filename (.txt format) for RX conformance testing\n");
       printf("-i Enter number of ofdm symbols for pucch\n");
+      printf("-r PUCCCH starting PRB\n");
       printf("-P Enter the format of PUCCH\n");
       printf("-b number of HARQ bits (1-2)\n");
+      printf("-B payload to be transmitted on PUCCH\n");
+      printf("-m initial cyclic shift m0\n");
       printf("-T to check nacktoack miss for format 1");
       exit (-1);
       break;
@@ -304,6 +320,16 @@ int main(int argc, char **argv)
 
   printf("Initializing gNodeB for mu %d, N_RB_DL %d\n",mu,N_RB_DL);
 
+  if((format!=0) && (format!=1)){
+    printf("PUCCH format %d not supported\n",format);
+    exit(0); 
+  }
+
+  AssertFatal((nr_bit<3)&&(actual_payload<4),"Only format 0 and 1 currently supported. 2 bits max supported");
+
+  if (nr_bit==1) actual_payload = actual_payload&1;
+
+  printf("Transmitted payload is %ld\n",actual_payload);
 
   RC.gNB = (PHY_VARS_gNB**) malloc(sizeof(PHY_VARS_gNB *));
   RC.gNB[0] = malloc(sizeof(PHY_VARS_gNB));
@@ -398,6 +424,7 @@ int main(int argc, char **argv)
   //configure UE
   UE = malloc(sizeof(PHY_VARS_NR_UE));
   memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS));
+  UE->pucch_config_common_nr->hoppingId = hoppingId;
   //phy_init_nr_top(UE); //called from init_nr_ue_signal
                       
   UE->perfect_ce = 0;
@@ -414,35 +441,15 @@ int main(int argc, char **argv)
   startingPRB_intraSlotHopping=N_RB_DL-1;
   pucch_GroupHopping_t PUCCH_GroupHopping=UE->pucch_config_common_nr->pucch_GroupHopping;
   uint32_t n_id=UE->pucch_config_common_nr->hoppingId;
-  if((format!=0) && (format!=1)){
-    printf("format not supported\n");
-    exit(0); 
+
+  if(format==0){
+  // for now we are not considering SR just HARQ-ACK
+    if(nr_bit==1)
+      mcs=table1_mcs[actual_payload];
+    else if(nr_bit==2)
+      mcs=table2_mcs[actual_payload];
   }
-  if(nacktoack_flag==0){ 
-    if(format==0){
-      if(nr_bit==1){
-        actual_payload=2;
-        mcs=table1_mcs[actual_payload];
-      }
-      else if(nr_bit==2){
-        actual_payload=6;
-        mcs=table2_mcs[actual_payload];
-      }
-      else{
-        printf("Number of HARQ bits possible is 1-2\n");
-        exit(0);
-      }
-    }
-    else {
-      if(nr_bit==1)
-        actual_payload=1;
-      else if(nr_bit==2)
-        actual_payload=3;
-      else{
-        printf("number of bits carried by PUCCH format1 is 1-2\n");
-      }
-    }
-  }   
+
   for(SNR=snr0;SNR<=snr1;SNR=SNR+1){
     ack_nack_errors=0;
     n_errors = 0;
diff --git a/openair2/GNB_APP/RRC_nr_paramsvalues.h b/openair2/GNB_APP/RRC_nr_paramsvalues.h
index 0b54b62e4a4..847936179e7 100644
--- a/openair2/GNB_APP/RRC_nr_paramsvalues.h
+++ b/openair2/GNB_APP/RRC_nr_paramsvalues.h
@@ -128,18 +128,18 @@
 #define GNB_CONFIG_STRING_RARESPONSEWINDOW                      "ra_ResponseWindow"
 #define GNB_CONFIG_STRING_SSBPERRACHOCCASIONANDCBPREAMBLESPERSSBPR   "ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR"
 #define GNB_CONFIG_STRING_SSBPERRACHOCCASIONANDCBPREAMBLESPERSSB     "ssb_perRACH_OccasionAndCB_PreamblesPerSSB"
-#define GNB_CONFIG_STRING_RACONTENTIONRESOLUTIONTIMER                    "ra_ContentionResolutionTimer"                     
-#define GNB_CONFIG_STRING_RSRPTHRESHOLDSSB                               "rsrp_ThresholdSSB"                                
-#define GNB_CONFIG_STRING_PRACHROOTSEQUENCEINDEXPR                     "prach_RootSequenceIndex_PR"                     
-#define GNB_CONFIG_STRING_PRACHROOTSEQUENCEINDEX                     "prach_RootSequenceIndex"                     
-#define GNB_CONFIG_STRING_MSG1SUBCARRIERSPACING                          "msg1_SubcarrierSpacing"                           
-#define GNB_CONFIG_STRING_RESTRICTEDSETCONFIG                            "restrictedSetConfig"                              
-#define GNB_CONFIG_STRING_PUSCHTIMEDOMAINALLOCATIONLIST                  "puschTimeDomainAllocationList"
-#define GNB_CONFIG_STRING_MSG3DELTAPREABMLE                              "msg3_DeltaPreamble"
-#define GNB_CONFIG_STRING_P0NOMINALWITHGRANT                             "p0_NominalWithGrant"
-#define GNB_CONFIG_STRING_PUCCHGROUPHOPPING                              "pucchGroupHopping"
-#define GNB_CONFIG_STRING_HOPPINGID                                      "hoppingId"
-#define GNB_CONFIG_STRING_P0NOMINAL                                      "p0_nominal"
+#define GNB_CONFIG_STRING_RACONTENTIONRESOLUTIONTIMER           "ra_ContentionResolutionTimer"                     
+#define GNB_CONFIG_STRING_RSRPTHRESHOLDSSB                      "rsrp_ThresholdSSB"                                
+#define GNB_CONFIG_STRING_PRACHROOTSEQUENCEINDEXPR              "prach_RootSequenceIndex_PR"                     
+#define GNB_CONFIG_STRING_PRACHROOTSEQUENCEINDEX                "prach_RootSequenceIndex"                     
+#define GNB_CONFIG_STRING_MSG1SUBCARRIERSPACING                 "msg1_SubcarrierSpacing"                           
+#define GNB_CONFIG_STRING_RESTRICTEDSETCONFIG                   "restrictedSetConfig"                              
+#define GNB_CONFIG_STRING_PUSCHTIMEDOMAINALLOCATIONLIST         "puschTimeDomainAllocationList"
+#define GNB_CONFIG_STRING_MSG3DELTAPREABMLE                     "msg3_DeltaPreamble"
+#define GNB_CONFIG_STRING_P0NOMINALWITHGRANT                    "p0_NominalWithGrant"
+#define GNB_CONFIG_STRING_PUCCHGROUPHOPPING                     "pucchGroupHopping"
+#define GNB_CONFIG_STRING_HOPPINGID                             "hoppingId"
+#define GNB_CONFIG_STRING_P0NOMINAL                             "p0_nominal"
 #define GNB_CONFIG_STRING_INITIALULBWPK2_0                      "initialULBWPk2_0"
 #define GNB_CONFIG_STRING_INITIALULBWPMAPPINGTYPE_0             "initialULBWPmappingType_0"
 #define GNB_CONFIG_STRING_INITIALULBWPSTARTSYMBOLANDLENGTH_0    "initialULBWPstartSymbolAndLength_0"
-- 
GitLab