<JIRA ID: ODUHIGH-332 : Change in TBS calculation part as per TS 38.214 section 5...
[o-du/l2.git] / src / 5gnrsch / sch_utils.c
index 7e4b59a..5e014f9 100644 (file)
 #include "sch_utils.h"
 #include "math.h"
 
-/* spec-38.213 Table 13-1 */
+#ifdef NR_TDD
+/* spec-38.213 Table 13-4 for SCS=30KHz */
+/* Note: Picking Table 13-4 and not 13-6 since band supported is n78 and
+ * corresponding minimum B/W is 10 MHz */
+int8_t coresetIdxTable[MAX_CORESET_INDEX][4] = {
+{   1,   24,   2,   0}, /* index 0  */
+{   1,   24,   2,   1}, /* index 1  */
+{   1,   24,   2,   2}, /* index 2  */
+{   1,   24,   2,   3}, /* index 3  */
+{   1,   24,   2,   4}, /* index 4  */
+{   1,   24,   3,   0}, /* index 5  */
+{   1,   24,   3,   1}, /* index 6  */
+{   1,   24,   3,   2}, /* index 7  */
+{   1,   24,   3,   3}, /* index 8  */
+{   1,   24,   3,   4}, /* index 9  */
+{   1,   48,   1,  12}, /* index 10 */
+{   1,   48,   1,  14}, /* index 11 */
+{   1,   48,   1,  16}, /* index 12 */
+{   1,   48,   2,  12}, /* index 13 */
+{   1,   48,   2,  14}, /* index 14 */
+{   1,   48,   2,  16}, /* index 15 */
+};
+#else
+/* spec-38.213 Table 13-1 for SCS=15KHz */
 int8_t coresetIdxTable[MAX_CORESET_INDEX][4] = {
 {   1,   24,   2,   0}, /* index 0  */
 {   1,   24,   2,   2}, /* index 1  */
@@ -63,6 +86,7 @@ int8_t coresetIdxTable[MAX_CORESET_INDEX][4] = {
 {   1,   96,   3,  38}, /* index 14 */
 {   0,    0,   0,   0}, /* index 15 */
 };
+#endif
 
 /* spec-38.213 Table 13-11 */
 /* m value is scaled to 2, when using it in formula, divide by 2 */
@@ -470,11 +494,16 @@ uint8_t pucchResourceSet[MAX_PUCCH_RES_SET_IDX][4] = {
  *  @param[in]  payLoadSize - size of payload in bytes
  *  @return     TBsize from the Table in bytes
  **/
-uint16_t schCalcTbSize(uint16_t payLoadSize)
+uint16_t schCalcTbSize(uint32_t payLoadSize)
 {
    uint8_t tbsIndex = 0;
-   payLoadSize = payLoadSize*8;
+   uint16_t maxTbSize;
 
+   maxTbSize = tbSizeTable[TOTAL_TBSIZE_VALUES -1]/8;
+   if(payLoadSize >= maxTbSize)
+      return maxTbSize;
+
+   payLoadSize = payLoadSize*8;
    while(payLoadSize > tbSizeTable[tbsIndex])
    {
       tbsIndex++;
@@ -509,8 +538,8 @@ uint16_t schCalcNumPrb(uint16_t tbSize, uint16_t mcs, uint8_t numSymbols)
 
    tbSize = tbSize * 8; //Calculate tbSize in bits
 
-   /* formula used for calculation of rbSize, 38.213 section 5.1.3.2 *
-    * Ninfo = Nre . R . Qm . v                                       *
+   /* formula used for calculation of rbSize, 38.214 section 5.1.3.2 *
+    * Ninfo = S . Nre . R . Qm . v                                       *
     * Nre' = Nsc . NsymPdsch - NdmrsSymb - Noh                       *
     * Nre = min(156,Nre') . nPrb                                     */
 
@@ -525,6 +554,82 @@ uint16_t schCalcNumPrb(uint16_t tbSize, uint16_t mcs, uint8_t numSymbols)
    return numPrb;
 }
 
+/**
+* @brief calculation of transport block size.
+*
+* @details
+*
+*     Function: schCalcTbSizeFromNPrb
+*
+*     This function calculates the transport block size
+*
+*  @param[in]  nPrb is num PRB
+*  @param[in]  mcs
+*  @param[in]  number of symbols
+*  @return   tbSize
+**/
+uint16_t schCalcTbSizeFromNPrb(uint16_t numPrb, uint16_t mcs, uint8_t numSymbols)
+{   
+   uint8_t  qm     = mcsTable[mcs][1];
+   uint16_t rValue = mcsTable[mcs][2];
+   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.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 = MIN(156, ceil( (numRbSc * numSymbols) - numDmrsRes - 0));
+   nre = nreDash * numPrb;
+   nInfo = ceil(nre * qm * numLayer * rValue/(1024.0 * sf));
+
+   if(nInfo <= 3824)
+   {
+      n = MAX(3, (uint32_t)cmLog2(nInfo) - 6);
+      nInfoDash = MAX(24, (1<<n)*(nInfo/(1<<n)));
+      while(nInfoDash > tbSizeTable[tbsIndex])
+      {
+         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
  *
@@ -565,6 +670,7 @@ void schInitUlSlot(SchUlSlotInfo *schUlSlotInfo)
    {
       schUlSlotInfo->assignedPrb[itr] = 0;
    }
+   schUlSlotInfo->resAllocBitMap = 0;
    schUlSlotInfo->puschCurrentPrb = PUSCH_START_RB;
    schUlSlotInfo->schPuschInfo = NULLP;
 
@@ -590,14 +696,55 @@ void schInitDlSlot(SchDlSlotInfo *schDlSlotInfo)
    {
       schDlSlotInfo->assignedPrb[itr] = 0;
    }
-  
+   schDlSlotInfo->resAllocBitMap = 0; 
    for(uint8_t itr=0; itr<MAX_SSB_IDX; itr++)
    {
       memset(&schDlSlotInfo->ssbInfo[itr], 0, sizeof(SsbInfo));
    }
+#if 0
+   //make allocation for SSB
+   if(cell->firstSsbTransmitted)
+   {
+      //TODO check if this slot and sfn are for ssb
+
+   }
+#endif
+}
+
+#ifdef NR_TDD
+
+/**
+ * @brief determines slot format
+ *
+ * @details
+ *
+ *     Function : schGetSlotSymbFrmt 
+ *      
+ *      This API is invoked to determine if current slot is DL or UL
+ *           
+ *  @param[in]  uint16_t slot
+ *  @param[in]  uint32_t bitMap from cellCb
+ *  @return  SlotConfig
+ *      -# DL    - 0 
+ *      -# UL    - 1
+ *      -# FLEXI - 2
+ **/
+SlotConfig schGetSlotSymbFrmt(uint16_t slot, uint32_t bitMap)
+{
+   SlotConfig slotFrmt;
+   int mask1 = 0, mask2 = 0;
 
+   slot = (slot%10)*2;
+   mask1 = 1<<(slot);
+   mask2 = 1<<(slot+1);
+   slotFrmt = ((mask1 & bitMap)>>slot) + (2*((mask2 & bitMap)>>(slot+1)));
 
+   //printf("\n\n\n\n*****FormatType:%d Slot:%d****\n\n\n\n", slotFrmt, slot/2);
+
+   return slotFrmt;
 }
+
+#endif
 /**********************************************************************
          End of file
 **********************************************************************/