From f207ac12be62c13ac4c01648c6bf54d87bd6c198 Mon Sep 17 00:00:00 2001
From: Laurent THOMAS <laurent.thomas@open-cells.com>
Date: Sun, 16 Jun 2024 12:01:16 +0200
Subject: [PATCH] Use gold cache in UCI

---
 .../PHY/NR_TRANSPORT/nr_uci_tools_common.c    | 61 ++++++++-----------
 1 file changed, 26 insertions(+), 35 deletions(-)

diff --git a/openair1/PHY/NR_TRANSPORT/nr_uci_tools_common.c b/openair1/PHY/NR_TRANSPORT/nr_uci_tools_common.c
index da9f1acfe57..b6b56ec79f6 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_uci_tools_common.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_uci_tools_common.c
@@ -31,8 +31,6 @@
  */
 
 #include "nr_dci.h"
-#include "openair1/PHY/LTE_TRANSPORT/transport_proto.h" // for lte_gold_generic()
-
 
 void nr_group_sequence_hopping(pucch_GroupHopping_t PUCCH_GroupHopping,
                                uint32_t n_id,
@@ -65,11 +63,7 @@ void nr_group_sequence_hopping(pucch_GroupHopping_t PUCCH_GroupHopping,
 #endif
   uint8_t f_ss=0,f_gh=0;
   *u=0;
-  *v=0;
-  uint32_t c_init = 0; 
-  uint32_t x1,s; // TS 38.211 Subclause 5.2.1
-  int l = 32, minShift = ((2*nr_slot_tx+n_hop)<<3);
-  int tmpShift =0;
+  *v = 0;
 #ifdef DEBUG_NR_PUCCH_TX
   printf("\t\t [nr_group_sequence_hopping] calculating u,v -> ");
 #endif
@@ -79,41 +73,39 @@ void nr_group_sequence_hopping(pucch_GroupHopping_t PUCCH_GroupHopping,
   }
 
   if (PUCCH_GroupHopping == enable) { // PUCCH_GroupHopping 'enabled'
-    c_init = floor(n_id/30); // we initialize c_init to calculate u,v according to 6.3.2.2.1 of 38.211
-    s = lte_gold_generic(&x1, &c_init, 1); // TS 38.211 Subclause 5.2.1
+    uint32_t c_init = floor(n_id / 30); // we initialize c_init to calculate u,v according to 6.3.2.2.1 of 38.211
+    int l = 32, minShift = (2 * nr_slot_tx + n_hop) << 3;
+    uint32_t *seq = gold_cache(c_init, (minShift + 31) / 32 + 8); // TS 38.211 Subclause 5.2.1
+    int goldIdx = 0;
     for (int m=0; m<8; m++) {
       while(minShift >= l) {
-        s = lte_gold_generic(&x1, &c_init, 0);
+        goldIdx++;
         l = l+32;
       }
-
-      tmpShift = (minShift&((1<<5)-1)); //minShift%32;
-      f_gh = f_gh + ((1<<m)*((uint8_t)((s>>tmpShift)&1)));
+      AssertFatal(goldIdx < 8 + (minShift + 31) / 32, "");
+      int tmpShift = (minShift & ((1 << 5) - 1)); // minShift%32;
+      f_gh = f_gh + ((1 << m) * ((uint8_t)((seq[goldIdx] >> tmpShift) & 1)));
       minShift ++;
     }
 
     f_gh = f_gh%30;
-    f_ss = n_id%30;
-    /*    for (int m=0; m<8; m++){
-          f_gh = f_gh + ((1<<m)*((uint8_t)((s>>(8*(2*nr_slot_tx+n_hop)+m))&1))); // Not sure we have to use nr_slot_tx FIXME!!!
-        }
-        f_gh = f_gh%30;
-        f_ss = n_id%30;*/
+    f_ss = n_id % 30;
   }
 
   if (PUCCH_GroupHopping == disable) { // PUCCH_GroupHopping 'disabled'
-    c_init = (1<<5)*floor(n_id/30)+(n_id%30); // we initialize c_init to calculate u,v
-    s = lte_gold_generic(&x1, &c_init, 1); // TS 38.211 Subclause 5.2.1
+    uint32_t c_init = (1 << 5) * floor(n_id / 30) + (n_id % 30); // we initialize c_init to calculate u,v
+    int goldIdx = 0;
     f_ss = n_id%30;
-    l = 32, minShift = (2*nr_slot_tx+n_hop);
+    int l = 32, minShift = (2 * nr_slot_tx + n_hop);
 
     while(minShift >= l) {
-      s = lte_gold_generic(&x1, &c_init, 0);
+      goldIdx++;
       l = l+32;
     }
-
-    tmpShift = (minShift&((1<<5)-1)); //minShift%32;
-    *v = (uint8_t)((s>>tmpShift)&1);
+    // TS 38.211 Subclause 5.2.1
+    uint32_t *seq = gold_cache(c_init, goldIdx + 1);
+    int tmpShift = (minShift & ((1 << 5) - 1)); // minShift%32;
+    *v = (uint8_t)((seq[goldIdx] >> tmpShift) & 1);
     //    *v = (uint8_t)((s>>(2*nr_slot_tx+n_hop))&1); // Not sure we have to use nr_slot_tx FIXME!!!
   }
 
@@ -141,28 +133,27 @@ double nr_cyclic_shift_hopping(uint32_t n_id,
   double alpha = 0.5235987756;
   uint32_t c_init = n_id; // we initialize c_init again to calculate n_cs
 
-  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_slot_tx )+ 8*(lnormal+lprime);
-  int tmpShift =0;
+  int l = 32, minShift = (14 * 8 * nr_slot_tx) + 8 * (lnormal + lprime);
 #ifdef DEBUG_NR_PUCCH_TX
   printf("\t\t [nr_cyclic_shift_hopping] calculating alpha (cyclic shift) using c_init=%u -> \n",c_init);
 #endif
-
+  uint32_t *seq = gold_cache(c_init, 8 + (minShift + 31) / 32); // TS 38.211 Subclause 5.2.1
+  int goldIdx = 0;
   for (int m=0; m<8; m++) {
     while(minShift >= l) {
-      s = lte_gold_generic(&x1, &c_init, 0);
+      goldIdx++;
       l = l+32;
     }
-
-    tmpShift = (minShift&((1<<5)-1)); //minShift%32;
+    AssertFatal(goldIdx < 8 + (minShift + 31) / 32, "");
+    int tmpShift = (minShift & ((1 << 5) - 1)); // minShift%32;
     minShift ++;
-    n_cs = n_cs+((1<<m)*((uint8_t)((s>>tmpShift)&1)));
+    n_cs += (1 << m) * (uint8_t)((seq[goldIdx] >> tmpShift) & 1);
     // calculating n_cs (Not sure we have to use nr_slot_tx FIXME!!!)
     // n_cs = n_cs+((1<<m)*((uint8_t)((s>>((14*8*nr_slot_tx) + 8*(lnormal+lprime) + m))&1)));
   }
 
-  alpha = (alpha * (double)((m0+mcs+n_cs)%12));
+  alpha = alpha * (double)((m0 + mcs + n_cs) % 12);
 #ifdef DEBUG_NR_PUCCH_TX
   printf("n_cs=%d -> %lf\n",n_cs,alpha);
 #endif
-- 
GitLab