Deleted the rlog folder
[o-du/l2.git] / src / 5gnrsch / sch_utils.c
index 1397c65..97c6aa3 100644 (file)
 */
 
 /* header files */
+#include "common_def.h"
+#include "du_app_mac_inf.h"
+#include "lrg.h"
+#include "tfu.h"
+#include "tfu.x"           /* TFU types */
+#include "lrg.x"           /* layer management typedefs for MAC */
+#include "mac_sch_interface.h"
+#include "sch.h"
 #include "sch_utils.h"
 #include "math.h"
 
@@ -260,15 +268,15 @@ uint16_t prachCfgIdxTable[MAX_PRACH_CONFIG_IDX][8] = {
 { 5,  1,  0, 1023,  0,  2,  3,  4 }, /* index 135  */
 { 5,  1,  0,  682,  0,  2,  3,  4 }, /* index 136  */
 {12,  2,  1,  580,  0,  1,  3,  4 }, /* index 137  */
-{12,  2,  2,   16,  0,  1,  3,  4 }, /* index 138  */
-{12,  2,  1,   16,  0,  1,  3,  4 }, /* index 139  */
-{12,  2,  1,   66,  0,  1,  3,  4 }, /* index 140  */
-{12,  2,  1,  528,  0,  1,  3,  4 }, /* index 141  */
-{12,  2,  1,    2,  0,  1,  3,  4 }, /* index 142  */
-{12,  2,  1,  128,  0,  1,  3,  4 }, /* index 143  */
-{12,  2,  1,  146,  0,  1,  3,  4 }, /* index 144  */
-{12,  2,  1,  341,  0,  1,  3,  4 }, /* index 145  */
-{12,  2,  1, 1023,  0,  1,  3,  4 }, /* index 146  */
+{12,  2,  0,   16,  0,  2,  3,  4 }, /* index 138  */
+{12,  1,  0,   16,  0,  1,  3,  4 }, /* index 139  */
+{12,  1,  0,   66,  0,  1,  3,  4 }, /* index 140  */
+{12,  1,  0,  528,  0,  1,  3,  4 }, /* index 141  */
+{12,  1,  0,    2,  0,  2,  3,  4 }, /* index 142  */
+{12,  1,  0,  128,  0,  2,  3,  4 }, /* index 143  */
+{12,  1,  0,  146,  0,  2,  3,  4 }, /* index 144  */
+{12,  1,  0,  341,  0,  2,  3,  4 }, /* index 145  */
+{12,  1,  0, 1023,  0,  2,  3,  4 }, /* index 146  */
 { 6, 16,  1,  528,  0,  1,  2,  6 }, /* index 147  */
 { 6, 16,  1,   16,  0,  2,  2,  6 }, /* index 148  */
 { 6,  8,  1,  528,  0,  1,  2,  6 }, /* index 149  */
@@ -290,15 +298,15 @@ uint16_t prachCfgIdxTable[MAX_PRACH_CONFIG_IDX][8] = {
 { 6,  1,  0, 1023,  0,  2,  2,  6 }, /* index 165  */
 { 6,  1,  0,  682,  0,  2,  2,  6 }, /* index 166  */
 {13,  2,  1,  580,  0,  2,  2,  6 }, /* index 167  */
-{13,  2,  2,   16,  0,  2,  2,  6 }, /* index 168  */
-{13,  2,  1,   16,  0,  1,  2,  6 }, /* index 169  */
-{13,  2,  1,   66,  0,  1,  2,  6 }, /* index 170  */
-{13,  2,  1,  528,  0,  1,  2,  6 }, /* index 171  */
-{13,  2,  1,    2,  0,  2,  2,  6 }, /* index 172  */
-{13,  2,  1,  128,  0,  2,  2,  6 }, /* index 173  */
-{13,  2,  1,  146,  0,  2,  2,  6 }, /* index 174  */
-{13,  2,  1,  341,  0,  2,  2,  6 }, /* index 175  */
-{13,  2,  1, 1023,  0,  2,  2,  6 }, /* index 176  */
+{13,  2,  0,   16,  0,  2,  2,  6 }, /* index 168  */
+{13,  1,  0,   16,  0,  1,  2,  6 }, /* index 169  */
+{13,  1,  0,   66,  0,  1,  2,  6 }, /* index 170  */
+{13,  1,  0,  528,  0,  1,  2,  6 }, /* index 171  */
+{13,  1,  0,    2,  0,  2,  2,  6 }, /* index 172  */
+{13,  1,  0,  128,  0,  2,  2,  6 }, /* index 173  */
+{13,  1,  0,  146,  0,  2,  2,  6 }, /* index 174  */
+{13,  1,  0,  341,  0,  2,  2,  6 }, /* index 175  */
+{13,  1,  0, 1023,  0,  2,  2,  6 }, /* index 176  */
 { 7, 16,  0,  528,  0,  1,  7,  2 }, /* index 177  */
 { 7, 16,  1,   16,  0,  2,  7,  2 }, /* index 178  */
 { 7,  8,  0,  528,  0,  1,  7,  2 }, /* index 179  */
@@ -371,7 +379,7 @@ uint16_t prachCfgIdxTable[MAX_PRACH_CONFIG_IDX][8] = {
 {10,  1,  0,   16,  0,  1,  2,  6 }, /* index 246  */
 {10,  1,  0,   66,  0,  1,  2,  6 }, /* index 247  */
 {10,  1,  0,  528,  0,  1,  2,  6 }, /* index 248  */
-{10,  1,  0,    1,  0,  2,  2,  6 }, /* index 249  */
+{10,  1,  0,    2,  0,  2,  2,  6 }, /* index 249  */
 {10,  1,  0,  128,  0,  2,  2,  6 }, /* index 250  */
 {10,  1,  0,  132,  0,  2,  2,  6 }, /* index 251  */
 {10,  1,  0,  146,  0,  2,  2,  6 }, /* index 252  */
@@ -429,62 +437,26 @@ uint16_t mcsTable[32][3] = {
       {  30,   4,     0},   /* mcs index 30 */
       {  31,   6,     0}};  /* mcs index 31 */
 
-/**
- * @brief frequency domain allocation function. 
- *
- * @details
- *
- *     Function: schAllocFreqDomRscType0
- *     
- *     This function does allocation in frequency domain resource.
- *     This is a bitmap defining  non-overlapping groups of 6 PRBs in ascending order.
- *     
- *  @param[in]  startPrb - start PRB from where the freq alloc starts.  
- *  @param[in]  prbSize - number of PRBs to be allocted.
- *  @param[in]  freqDomain - 6 bytes of info, each bit represents a group of 6 PRB.
- *  @return   void
- **/
-void schAllocFreqDomRscType0(uint16_t startPrb, uint16_t prbSize, uint8_t *freqDomain)
-{
-   uint8_t remBits = prbSize; /* each bit represents 6 PRBs */
-   uint8_t firstByte = 1;
-   uint8_t numBits,startBit,byteCount = 0;
-
-   while(remBits)
-   {
-      /* when the startPrb is not in this byteCount */
-      if(startPrb/8)
-      {
-         startPrb -= 8;
-         byteCount++;
-         continue;
-      }
-
-      /* max bytecount is 6 nearly equal to 45 bits*/
-      if(byteCount >= 6)
-          break;
-
-      /* when we are filling the second byte, then the start should be equal to 0 */
-      if(firstByte)
-         startBit = startPrb;
-      else
-         startBit = 0;
-
-      /* calculate the number of bits to be set in this byte */
-      if((remBits+startPrb) <= 8)
-         numBits = remBits;
-      else
-         numBits = 8 - startBit;
-
-      /* bit operation to set the bits */
-               SET_BITS((startBit % 8),numBits,freqDomain[byteCount])
-      firstByte = 0;
-
-      /* the ramaining bits should be subtracted with the numBits set in this byte */
-      remBits -= numBits;
-      byteCount++;
-   }
-}
+/* PUCCH resource sets before dedicated PUCCH resource configuration */
+/* Table 9.2.1-1 spec 38.213      */ 
+uint8_t pucchResourceSet[MAX_PUCCH_RES_SET_IDX][4] = {
+{ 0,  12,  2,  0 }, /* index  0 */
+{ 0,  12,  2,  0 }, /* index  1 */
+{ 0,  12,  2,  3 }, /* index  2 */
+{ 1,  10,  4,  0 }, /* index  3 */
+{ 1,  10,  4,  0 }, /* index  4 */
+{ 1,  10,  4,  2 }, /* index  5 */
+{ 1,  10,  4,  4 }, /* index  6 */
+{ 1,   4, 10,  0 }, /* index  7 */
+{ 1,   4, 10,  0 }, /* index  8 */
+{ 1,   4, 10,  2 }, /* index  9 */
+{ 1,   4, 10,  4 }, /* index 10 */
+{ 1,   0, 14,  0 }, /* index 11 */
+{ 1,   0, 14,  0 }, /* index 12 */
+{ 1,   0, 14,  2 }, /* index 13 */
+{ 1,   0, 14,  4 }, /* index 14 */
+{ 1,   0, 14,  0 }, /* index 15 */
+};
 
 /**
  * @brief frequency domain allocation function. 
@@ -495,21 +467,26 @@ void schAllocFreqDomRscType0(uint16_t startPrb, uint16_t prbSize, uint8_t *freqD
  *     
  *     This function finds the TBSize from table Table 5.1.3.2-1 spec 38.214
  *     
- *  @param[in]  payLoadSize - size of payload
- *  @return     TBsize from the Table
+ *  @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;
 
-       while(payLoadSize > tbSizeTable[tbsIndex])
-       {
-          tbsIndex++;
-       }
+   payLoadSize = payLoadSize*8;
+   while(payLoadSize > tbSizeTable[tbsIndex])
+   {
+      tbsIndex++;
+   }
 
-       /* return the TBsize in bytes */
-       return (tbSizeTable[tbsIndex]/8);
+   /* return the TBsize in bytes */
+   return (tbSizeTable[tbsIndex]/8);
 }
 
 /**
@@ -521,7 +498,7 @@ uint16_t schCalcTbSize(uint16_t payLoadSize)
  *     
  *     This function calculates the number of PRbs 
  *     
- *  @param[in]  tbSize
+ *  @param[in]  tbSize in bytes
  *  @param[in]  mcs
  *  @param[in]  number of symbols
  *  @return   number PRBs
@@ -530,28 +507,181 @@ uint16_t schCalcNumPrb(uint16_t tbSize, uint16_t mcs, uint8_t numSymbols)
 {
    uint16_t numPrb = 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 */
-       uint8_t numDmrsSymbols = 12; /* considering whole of one symbols with 12 SCs for DMRS */
+   uint16_t nreDash = 0;
+   uint8_t  qm     = mcsTable[mcs][1];
+   uint16_t rValue = mcsTable[mcs][2];
+   uint8_t  numLayer = 1;       /* v value */
+
+   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                                       *
     * Nre' = Nsc . NsymPdsch - NdmrsSymb - Noh                       *
     * Nre = min(156,Nre') . nPrb                                     */
 
-       nre = ceil( (float)tbSize * 1024 / (qm * rValue * numLayer));
+   nre = ceil( (float)tbSize * 1024 / (qm * rValue * numLayer));
 
-       nreDash = ceil( (12 * numSymbols) - numDmrsSymbols - 0);
+   nreDash = ceil( (12 * numSymbols) - NUM_DMRS_SYMBOLS - 0);
 
-       if (nreDash > 156)
-          nre = 156;
+   if (nreDash > 156)
+      nre = 156;
 
    numPrb = ceil((float)nre / nreDash);   
-       return numPrb;
+   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)
+{   
+   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 */
+   
+   /* formula used for calculation of rbSize, 38.213 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;
+
+   nre = nreDash * numPrb;
+   tbSize = ceil(nre * qm * numLayer * rValue/1024.0);
+   tbSize = ceil(tbSize/8.0);
+   
+   while(tbSize > tbSizeTable[tbsIndex])
+   {
+      tbsIndex++;
+   }
+   tbSize = tbSizeTable[tbsIndex];
+
+   return tbSize;
+
+}
+/**
+ * @brief fetching ueCb from cellCb
+ *
+ * @details
+ *
+ *     Function: schGetUeCb
+ *
+ *     This function fetched UeCb based on crnti from cellCb
+ *
+ *  @param[in]  cellCb
+ *  @param[in]  crnti
+ *  @return     ueCb
+ **/
+SchUeCb* schGetUeCb(SchCellCb *cellCb, uint16_t crnti)
+{
+   uint16_t ueIdx;
+   GET_UE_IDX(crnti, ueIdx);
+   return &(cellCb->ueCb[ueIdx -1]);
+}
+
+/**
+ * @brief initialize UL slot info
+ *
+ * @details
+ *
+ *     Function: schInitUlSlot
+ *
+ *     This function intializes UL slot of the cell
+ *
+ *  @param[in]  schUlSlotInfo
+ *  @return     void
+ **/
+void schInitUlSlot(SchUlSlotInfo *schUlSlotInfo)
+{
+   memset(schUlSlotInfo, 0, sizeof(SchUlSlotInfo));
+   schUlSlotInfo->totalPrb = MAX_NUM_RB;
+   for(uint8_t itr=0; itr<SCH_SYMBOL_PER_SLOT; itr++)
+   {
+      schUlSlotInfo->assignedPrb[itr] = 0;
+   }
+   schUlSlotInfo->puschCurrentPrb = PUSCH_START_RB;
+   schUlSlotInfo->schPuschInfo = NULLP;
+
+}
+
+/**
+ * @brief initialize DL slot info
+ *
+ * @details
+ *
+ *     Function: schInitDlSlot
+ *
+ *     This function intializes DL slot of the cell
+ *
+ *  @param[in]  schDlSlotInfo
+ *  @return     void
+ **/
+void schInitDlSlot(SchDlSlotInfo *schDlSlotInfo)
+{
+   memset(schDlSlotInfo, 0, sizeof(SchDlSlotInfo));
+   schDlSlotInfo->totalPrb = MAX_NUM_RB;
+   for(uint8_t itr=0; itr<SCH_SYMBOL_PER_SLOT; itr++)
+   {
+      schDlSlotInfo->assignedPrb[itr] = 0;
+   }
+  
+   for(uint8_t itr=0; itr<MAX_SSB_IDX; itr++)
+   {
+      memset(&schDlSlotInfo->ssbInfo[itr], 0, sizeof(SsbInfo));
+   }
+}
+
+#ifdef NR_TDD
+
+/**
+ * @brief determines slot format
+ *
+ * @details
+ *
+ *     Function : schGetSlotFrmt 
+ *      
+ *      This API is invoked to determine if current slot is DL or UL
+ *           
+ *  @param[in]  uint16_t slot
+ *  @param[in]  uint32_t slotBitMap from cellCb
+ *  @return  SlotConfig
+ *      -# DL    - 0 
+ *      -# UL    - 1
+ *      -# FLEXI - 2
+ **/
+SlotConfig schGetSlotFrmt(uint16_t slot, uint32_t slotBitMap)
+{
+   SlotConfig slotFrmt;
+   int mask1 = 0, mask2 = 0;
+
+   slot = (slot%10)*2;
+   mask1 = 1<<(slot);
+   mask2 = 1<<(slot+1);
+   slotFrmt = ((mask1 & slotBitMap)>>slot) + (2*((mask2 & slotBitMap)>>(slot+1)));
+
+   //printf("\n\n\n\n*****FormatType:%d Slot:%d****\n\n\n\n", slotFrmt, slot/2);
+
+   return slotFrmt;
 }
 
+#endif
 /**********************************************************************
          End of file
 **********************************************************************/