Renamed SlotIndInfo to SlotTimingInfo [Issue-ID: ODUHIGH-354]
[o-du/l2.git] / src / 5gnrsch / sch_utils.c
index 364ae5e..600297d 100644 (file)
@@ -765,6 +765,7 @@ uint8_t pucchResourceSet[MAX_PUCCH_RES_SET_IDX][4] = {
 { 1,   0, 14,  0 }, /* index 15 */
 };
 
+uint8_t defaultUlAckTbl[DEFAULT_UL_ACK_LIST_COUNT]= {1, 2, 3 , 4, 5, 6, 7, 8};
 /**
  * @brief frequency domain allocation function. 
  *
@@ -837,6 +838,7 @@ uint16_t schCalcNumPrb(uint16_t tbSize, uint16_t mcs, uint8_t numSymbols)
    numPrb = ceil((float)nre / nreDash);   
    return numPrb;
 }
+
 /**
 * @brief calculation of transport block size.
 *
@@ -853,36 +855,65 @@ uint16_t schCalcNumPrb(uint16_t tbSize, uint16_t mcs, uint8_t numSymbols)
 **/
 uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols)
 {   
-   uint16_t tbSize = 0;
-   uint16_t tbsIndex = 0;
-   uint16_t nre = 0;
-   uint16_t nreDash = 0;
    uint8_t  qm     = mcsTable[mcs][1];
    uint16_t rValue = mcsTable[mcs][2];
-   uint8_t  numLayer = 1;       /* v value */
+   uint16_t tbsIndex = 0;
+   uint32_t tbSize = 0;
+   uint32_t nre = 0;
+   uint32_t nreDash = 0;
+   uint32_t nInfo = 0;
+   uint32_t n = 0;
+   uint32_t nInfoDash = 0;
+   uint32_t c = 0;
+   const uint8_t  numLayer = 1;
+   const uint16_t numRbSc = 12;
+   const uint16_t numDmrsRes = 12;
+   const uint16_t sf = 1;
+//   uint16_t numPrbOvrHead = 0;
    
-   /* formula used for calculation of rbSize, 38.213 section 5.1.3.2 *
-   * Ninfo = Nre . R . Qm . v   where [ NInfo is tbSize]                *
+  /* formula used for calculation of rbSize, 38.214 section 5.1.3.2  *
+   * Ninfo = Nre . R . Qm . v   where [ NInfo is tbSize]             *
    * Nre' = Nsc . NsymPdsch - NdmrsSymb - Noh                        *
    * Nre = min(156,Nre') . nPrb                                      */
-   
-   nreDash = ceil( (12 * numSymbols) - NUM_DMRS_SYMBOLS - 0);
-  
-   if(nreDash > 156)
-      nreDash = 156;
 
+   nreDash = MIN(156, ceil( (numRbSc * numSymbols) - numDmrsRes - 0));
    nre = nreDash * numPrb;
-   tbSize = ceil(nre * qm * numLayer * rValue/1024.0);
-   tbSize = ceil(tbSize/8.0);
-   
-   while(tbSize > tbSizeTable[tbsIndex])
+   nInfo = ceil(nre * qm * numLayer * rValue/(1024.0 * sf));
+
+   if(nInfo <= 3824)
    {
-      tbsIndex++;
+      n = MAX(3, (uint32_t)cmLog2(nInfo) - 6);
+      nInfoDash = MAX(24, (1<<n)*(nInfo/(1<<n)));
+      while(nInfoDash > tbSizeTable[tbsIndex])
+      {
+         tbsIndex++;
+      }
+      tbSize = tbSizeTable[tbsIndex];
    }
-   tbSize = tbSizeTable[tbsIndex];
+   else
+   {
+      n = (uint32_t)cmLog2(nInfo - 24) - 5;
+      nInfoDash = MAX(3840, (1<<n)*ceil((nInfo - 24)/(1<<n)));
 
+      if(rValue<256)
+      {
+         c = ceil((nInfoDash + 24)/3816);
+         tbSize = 8 * c * ceil((nInfoDash + 24)/(8 * c)) - 24;
+      }
+      else
+      {
+         if(nInfoDash > 8424)
+         {
+            c = ceil((nInfoDash + 24)/8424);
+            tbSize = 8 * c * ceil((nInfoDash + 24)/(8 * c)) - 24;
+         }
+         else
+         {
+            tbSize = 8 * ceil((nInfoDash + 24)/(8)) - 24;
+         }
+      }
+   }
    return tbSize;
-
 }
 /**
  * @brief fetching ueCb from cellCb
@@ -1002,6 +1033,69 @@ SlotConfig schGetSlotSymbFrmt(uint16_t slot, uint32_t bitMap)
 #endif
 }
 
+/**
+ * @brief Determine total length of configured slot pattern for specific 
+ *    periodicity for TDD
+ *
+ * @details
+ *
+ *     Function : calculateSlotPatternLength 
+ *      
+ *      Determine total length of configured slot pattern for specific periodicity based
+ *      on slot duration for TDD
+ *           
+ *  @param[in]  uint8_t scs, uint8_t periodicity 
+ *
+ *  @return uint8_t slotPatternLength 
+ **/
+
+uint8_t calculateSlotPatternLength(uint8_t scs, uint8_t periodicity)
+{
+   uint8_t slotPatternLength =0;
+   float   slotDuration = 0;
+   
+   /* Calculating the slot duration with the help of SCS.
+    * This will provides the slot duration in ms like 1, 0.5, 0.25, 0.125. 
+    * If scs value is SCS_30KHZ its enum value is 1, 
+    * slotDuration = pow(0.5, 1);
+    * slotDuration = 0.5 */
+
+   slotDuration = pow(0.5,scs);
+
+   /* Calculating length of pattern based on Transmission Periodicity. 
+    * If periodicity = TX_PRDCTY_MS_5,
+    * slotPatternLength = 5/0.5 
+    * slotPatternLength = 10 i.e. {length of slot pattern DDDDDDDFUU}*/
+
+   switch(periodicity)
+   {
+      case TX_PRDCTY_MS_0P5:
+         slotPatternLength = 0.5/slotDuration;
+         break;
+      case TX_PRDCTY_MS_0P625:
+         slotPatternLength = 0.625/slotDuration;
+         break;
+      case TX_PRDCTY_MS_1:
+         slotPatternLength = 1/slotDuration;
+         break;
+      case TX_PRDCTY_MS_1P25:
+         slotPatternLength = 1.25/slotDuration;
+         break;
+      case TX_PRDCTY_MS_2:
+         slotPatternLength = 2/slotDuration;
+         break;
+      case TX_PRDCTY_MS_2P5:
+         slotPatternLength = 2.5/slotDuration;
+         break;
+      case TX_PRDCTY_MS_5:
+         slotPatternLength = 5/slotDuration;
+         break;
+      case TX_PRDCTY_MS_10:
+         slotPatternLength = 10/slotDuration;
+         break;
+   }
+   return slotPatternLength;
+}
 #endif
 /**********************************************************************
          End of file