RAR and MSG3 scheduling in TDD [Issue-ID: ODUHIGH-342]
[o-du/l2.git] / src / 5gnrsch / sch_utils.c
index 0a79d67..3331915 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"
 
-/* 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  */
@@ -54,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 */
@@ -100,6 +133,288 @@ uint16_t numRbForPrachTable[MAX_RACH_NUM_RB_IDX][5] = {
 {   139,  120,   120,  12,  2    }, /* index 15 */
 };
 
+#ifdef NR_TDD
+
+/* prach config index Table 6.3.3.2-3 spec 38.211 
+ * PRACH format given as follows:
+ * 0 = 0
+ * 1 = 1
+ * 2 = 2
+ * 3 = 3
+ * 4 = A1
+ * 5 = A2
+ * 6 = A3
+ * 7 = B1
+ * 8 = B4
+ * 9 = C0
+ * 10 = C2
+ * 11 = A1/B1
+ * 12 = A2/B2
+ * 13 = A3/B3 
+ * Subframe num is represented considering 0-9 bits and
+ * value 1 corresponds to the subframe that is valid 
+ */
+
+uint16_t prachCfgIdxTable[MAX_PRACH_CONFIG_IDX][8] = {
+{ 0, 16,  1,  512,  0,  0,  0,  0 }, /* index 0   */
+{ 0,  8,  1,  512,  0,  0,  0,  0 }, /* index 1   */
+{ 0,  4,  1,  512,  0,  0,  0,  0 }, /* index 2   */
+{ 0,  2,  0,  512,  0,  0,  0,  0 }, /* index 3   */
+{ 0,  2,  1,  512,  0,  0,  0,  0 }, /* index 4   */
+{ 0,  2,  0,   16,  0,  0,  0,  0 }, /* index 5   */
+{ 0,  2,  1,   16,  0,  0,  0,  0 }, /* index 6   */
+{ 0,  1,  0,  512,  0,  0,  0,  0 }, /* index 7   */
+{ 0,  1,  0,  256,  0,  0,  0,  0 }, /* index 8   */
+{ 0,  1,  0,  128,  0,  0,  0,  0 }, /* index 9   */
+{ 0,  1,  0,   64,  0,  0,  0,  0 }, /* index 10  */
+{ 0,  1,  0,   32,  0,  0,  0,  0 }, /* index 11  */
+{ 0,  1,  0,   16,  0,  0,  0,  0 }, /* index 12  */
+{ 0,  1,  0,    8,  0,  0,  0,  0 }, /* index 13  */
+{ 0,  1,  0,    4,  0,  0,  0,  0 }, /* index 14  */
+{ 0,  1,  0,   66,  0,  0,  0,  0 }, /* index 15  */
+{ 0,  1,  0,   66,  7,  0,  0,  0 }, /* index 16  */
+{ 0,  1,  0,  528,  0,  0,  0,  0 }, /* index 17  */
+{ 0,  1,  0,  264,  0,  0,  0,  0 }, /* index 18  */
+{ 0,  1,  0,  132,  0,  0,  0,  0 }, /* index 19  */
+{ 0,  1,  0,  768,  0,  0,  0,  0 }, /* index 20  */
+{ 0,  1,  0,  784,  0,  0,  0,  0 }, /* index 21  */
+{ 0,  1,  0,  536,  0,  0,  0,  0 }, /* index 22  */
+{ 0,  1,  0,  896,  0,  0,  0,  0 }, /* index 23  */
+{ 0,  1,  0,  792,  0,  0,  0,  0 }, /* index 24  */
+{ 0,  1,  0,  960,  0,  0,  0,  0 }, /* index 25  */
+{ 0,  1,  0,  594,  0,  0,  0,  0 }, /* index 26  */
+{ 0,  1,  0,  682,  0,  0,  0,  0 }, /* index 27  */
+{ 1, 16,  1,  128,  0,  0,  0,  0 }, /* index 28  */
+{ 1,  8,  1,  128,  0,  0,  0,  0 }, /* index 29  */
+{ 1,  4,  1,  128,  0,  0,  0,  0 }, /* index 30  */
+{ 1,  2,  0,  128,  0,  0,  0,  0 }, /* index 31  */
+{ 1,  2,  1,  128,  0,  0,  0,  0 }, /* index 32  */
+{ 1,  1,  0,  128,  0,  0,  0,  0 }, /* index 33  */
+{ 2, 16,  1,   64,  0,  0,  0,  0 }, /* index 34  */
+{ 2,  8,  1,   64,  0,  0,  0,  0 }, /* index 35  */
+{ 2,  4,  1,   64,  0,  0,  0,  0 }, /* index 36  */
+{ 2,  2,  0,   64,  7,  0,  0,  0 }, /* index 37  */
+{ 2,  2,  1,   64,  7,  0,  0,  0 }, /* index 38  */
+{ 2,  1,  0,   64,  7,  0,  0,  0 }, /* index 39  */
+{ 3, 16,  1,  512,  0,  0,  0,  0 }, /* index 40  */
+{ 3,  8,  1,  512,  0,  0,  0,  0 }, /* index 41  */
+{ 3,  4,  1,  512,  0,  0,  0,  0 }, /* index 42  */
+{ 3,  2,  0,  512,  0,  0,  0,  0 }, /* index 43  */
+{ 3,  2,  1,  512,  0,  0,  0,  0 }, /* index 44  */
+{ 3,  2,  0,   16,  0,  0,  0,  0 }, /* index 45  */
+{ 3,  2,  1,   16,  0,  0,  0,  0 }, /* index 46  */
+{ 3,  1,  0,  512,  0,  0,  0,  0 }, /* index 47  */
+{ 3,  1,  0,  256,  0,  0,  0,  0 }, /* index 48  */
+{ 3,  1,  0,  128,  0,  0,  0,  0 }, /* index 49  */
+{ 3,  1,  0,   64,  0,  0,  0,  0 }, /* index 50  */
+{ 3,  1,  0,   32,  0,  0,  0,  0 }, /* index 51  */
+{ 3,  1,  0,   16,  0,  0,  0,  0 }, /* index 52  */
+{ 3,  1,  0,    8,  0,  0,  0,  0 }, /* index 53  */
+{ 3,  1,  0,    4,  0,  0,  0,  0 }, /* index 54  */
+{ 3,  1,  0,   66,  0,  0,  0,  0 }, /* index 55  */
+{ 3,  1,  0,   66,  7,  0,  0,  0 }, /* index 56  */
+{ 3,  1,  0,  528,  0,  0,  0,  0 }, /* index 57  */
+{ 3,  1,  0,  264,  0,  0,  0,  0 }, /* index 58  */
+{ 3,  1,  0,  132,  0,  0,  0,  0 }, /* index 59  */
+{ 3,  1,  0,  768,  0,  0,  0,  0 }, /* index 60  */
+{ 3,  1,  0,  784,  0,  0,  0,  0 }, /* index 61  */
+{ 3,  1,  0,  536,  0,  0,  0,  0 }, /* index 62  */
+{ 3,  1,  0,  896,  0,  0,  0,  0 }, /* index 63  */
+{ 3,  1,  0,  792,  0,  0,  0,  0 }, /* index 64  */
+{ 3,  1,  0,  594,  0,  0,  0,  0 }, /* index 65  */
+{ 3,  1,  0,  682,  0,  0,  0,  0 }, /* index 66  */
+{ 4, 16,  1,  512,  0,  2,  6,  2 }, /* index 67  */
+{ 4,  8,  1,  512,  0,  2,  6,  2 }, /* index 68  */
+{ 4,  4,  1,  512,  0,  1,  6,  2 }, /* index 69  */
+{ 4,  2,  1,  512,  0,  1,  6,  2 }, /* index 70  */
+{ 4,  2,  1,  528,  7,  1,  3,  2 }, /* index 71  */
+{ 4,  2,  1,  640,  7,  1,  3,  2 }, /* index 72  */
+{ 4,  2,  1,  640,  0,  1,  6,  2 }, /* index 73  */
+{ 4,  2,  1,  768,  0,  2,  6,  2 }, /* index 74  */
+{ 4,  2,  1,  528,  0,  2,  6,  2 }, /* index 75  */
+{ 4,  2,  1,  924,  0,  1,  6,  2 }, /* index 76  */
+{ 4,  1,  0,  512,  0,  2,  6,  2 }, /* index 77  */
+{ 4,  1,  0,  512,  7,  1,  3,  2 }, /* index 78  */
+{ 4,  1,  0,  512,  0,  1,  6,  2 }, /* index 79  */
+{ 4,  1,  0,  768,  0,  2,  6,  2 }, /* index 80  */
+{ 4,  1,  0,  528,  0,  1,  6,  2 }, /* index 81  */
+{ 4,  1,  0,  640,  7,  1,  3,  2 }, /* index 82  */
+{ 4,  1,  0,  792,  0,  1,  6,  2 }, /* index 83  */
+{ 4,  1,  0,  792,  0,  2,  6,  2 }, /* index 84  */
+{ 4,  1,  0,  682,  0,  1,  6,  2 }, /* index 85  */
+{ 4,  1,  0, 1023,  7,  1,  3,  2 }, /* index 86  */
+{ 5, 16,  1,  512,  0,  2,  3,  4 }, /* index 87  */
+{ 5,  8,  1,  512,  0,  2,  3,  4 }, /* index 88  */
+{ 5,  4,  1,  512,  0,  1,  3,  4 }, /* index 89  */
+{ 5,  2,  1,  640,  0,  1,  3,  4 }, /* index 90  */
+{ 5,  2,  1,  768,  0,  2,  3,  4 }, /* index 91  */
+{ 5,  2,  1,  640,  9,  1,  1,  4 }, /* index 92  */
+{ 5,  2,  1,  528,  9,  1,  1,  4 }, /* index 93  */
+{ 5,  2,  1,  528,  0,  2,  3,  4 }, /* index 94  */
+{ 5,  2,  1,  924,  0,  1,  3,  4 }, /* index 95  */
+{ 5,  1,  0,    4,  0,  1,  3,  4 }, /* index 96  */
+{ 5,  1,  0,  128,  0,  1,  3,  4 }, /* index 97  */
+{ 5,  2,  1,  512,  0,  1,  3,  4 }, /* index 98  */
+{ 5,  1,  0,  512,  0,  2,  3,  4 }, /* index 99  */
+{ 5,  1,  0,  512,  9,  1,  1,  4 }, /* index 100  */
+{ 5,  1,  0,  512,  0,  1,  3,  4 }, /* index 101  */
+{ 5,  1,  0,  132,  0,  1,  3,  4 }, /* index 102  */
+{ 5,  1,  0,  768,  0,  2,  3,  4 }, /* index 103  */
+{ 5,  1,  0,  528,  0,  1,  3,  4 }, /* index 104  */
+{ 5,  1,  0,  640,  9,  1,  1,  4 }, /* index 105  */
+{ 5,  1,  0,  792,  0,  1,  3,  4 }, /* index 106  */
+{ 5,  1,  0,  792,  0,  2,  3,  4 }, /* index 107  */
+{ 5,  1,  0,  682,  0,  1,  3,  4 }, /* index 108  */
+{ 5,  1,  0, 1023,  9,  1,  1,  4 }, /* index 109  */
+{ 6, 16,  1,  512,  0,  2,  2,  6 }, /* index 110  */
+{ 6,  8,  1,  512,  0,  2,  2,  6 }, /* index 111  */
+{ 6,  4,  1,  512,  0,  1,  2,  6 }, /* index 112  */
+{ 6,  2,  1,  528,  7,  1,  1,  6 }, /* index 113  */
+{ 6,  2,  1,  640,  7,  1,  1,  6 }, /* index 114  */
+{ 6,  2,  1,  640,  0,  1,  2,  6 }, /* index 115  */
+{ 6,  2,  1,  528,  0,  2,  2,  6 }, /* index 116  */
+{ 6,  2,  1,  768,  0,  2,  2,  6 }, /* index 117  */
+{ 6,  2,  1,  924,  0,  1,  2,  6 }, /* index 118  */
+{ 6,  1,  0,    4,  0,  1,  2,  6 }, /* index 119  */
+{ 6,  1,  0,  128,  0,  1,  2,  6 }, /* index 120  */
+{ 6,  2,  1,  512,  0,  1,  2,  6 }, /* index 121  */
+{ 6,  1,  0,  512,  0,  2,  2,  6 }, /* index 122  */
+{ 6,  1,  0,  512,  7,  1,  1,  6 }, /* index 123  */
+{ 6,  1,  0,  512,  0,  1,  2,  6 }, /* index 124  */
+{ 6,  1,  0,  132,  0,  1,  2,  6 }, /* index 125  */
+{ 6,  1,  0,  768,  0,  2,  2,  6 }, /* index 126  */
+{ 6,  1,  0,  528,  0,  1,  2,  6 }, /* index 127  */
+{ 6,  1,  0,  640,  7,  1,  1,  6 }, /* index 128  */
+{ 6,  1,  0,  792,  0,  1,  2,  6 }, /* index 129  */
+{ 6,  1,  0,  792,  0,  2,  2,  6 }, /* index 130  */
+{ 6,  1,  0,  682,  0,  1,  2,  6 }, /* index 131  */
+{ 6,  1,  0, 1023,  7,  1,  1,  6 }, /* index 132  */
+{ 7,  4,  1,  512,  2,  1,  6,  2 }, /* index 133  */
+{ 7,  2,  1,  512,  2,  1,  6,  2 }, /* index 134  */
+{ 7,  2,  1,  640,  2,  1,  6,  2 }, /* index 135  */
+{ 7,  2,  1,  528,  8,  1,  3,  2 }, /* index 136  */
+{ 7,  2,  1,  528,  2,  2,  6,  2 }, /* index 137  */
+{ 7,  1,  0,  512,  2,  2,  6,  2 }, /* index 138  */
+{ 7,  1,  0,  512,  8,  1,  3,  2 }, /* index 139  */
+{ 7,  1,  0,  512,  2,  1,  6,  2 }, /* index 140  */
+{ 7,  1,  0,  768,  2,  2,  6,  2 }, /* index 141  */
+{ 7,  1,  0,  528,  2,  1,  6,  2 }, /* index 142  */
+{ 7,  1,  0,  640,  8,  1,  3,  2 }, /* index 143  */
+{ 7,  1,  0,  682,  2,  1,  6,  2 }, /* index 144  */
+{ 8, 16,  1,  512,  0,  2,  1, 12 }, /* index 145  */
+{ 8,  8,  1,  512,  0,  2,  1, 12 }, /* index 146  */
+{ 8,  4,  1,  512,  2,  1,  1, 12 }, /* index 147  */
+{ 8,  2,  1,  512,  0,  1,  1, 12 }, /* index 148  */
+{ 8,  2,  1,  512,  2,  1,  1, 12 }, /* index 149  */
+{ 8,  2,  1,  640,  2,  1,  1, 12 }, /* index 150  */
+{ 8,  2,  1,  528,  2,  1,  1, 12 }, /* index 151  */
+{ 8,  2,  1,  528,  0,  2,  1, 12 }, /* index 152  */
+{ 8,  2,  1,  768,  0,  2,  1, 12 }, /* index 153  */
+{ 8,  2,  1,  924,  0,  1,  1, 12 }, /* index 154  */
+{ 8,  1,  0,    2,  0,  1,  1, 12 }, /* index 155  */
+{ 8,  1,  0,    4,  0,  1,  1, 12 }, /* index 156  */
+{ 8,  1,  0,   16,  0,  1,  1, 12 }, /* index 157  */
+{ 8,  1,  0,  128,  0,  1,  1, 12 }, /* index 158  */
+{ 8,  1,  0,  512,  0,  1,  1, 12 }, /* index 159  */
+{ 8,  1,  0,  512,  2,  1,  1, 12 }, /* index 160  */
+{ 8,  1,  0,  512,  0,  2,  1, 12 }, /* index 161  */
+{ 8,  1,  0,  528,  2,  1,  1, 12 }, /* index 162  */
+{ 8,  1,  0,  640,  2,  1,  1, 12 }, /* index 163  */
+{ 8,  1,  0,  768,  0,  2,  1, 12 }, /* index 164  */
+{ 8,  1,  0,  792,  2,  1,  1, 12 }, /* index 165  */
+{ 8,  1,  0,  682,  2,  1,  1, 12 }, /* index 166  */
+{ 8,  1,  0, 1023,  0,  2,  1, 12 }, /* index 167  */
+{ 8,  1,  0, 1023,  2,  1,  1, 12 }, /* index 168  */
+{ 9, 16,  1,  512,  2,  2,  6,  2 }, /* index 169  */
+{ 9,  8,  1,  512,  2,  2,  6,  2 }, /* index 170  */
+{ 9,  4,  1,  512,  2,  1,  6,  2 }, /* index 171  */
+{ 9,  2,  1,  512,  2,  1,  6,  2 }, /* index 172  */
+{ 9,  2,  1,  768,  2,  2,  6,  2 }, /* index 173  */
+{ 9,  2,  1,  640,  2,  1,  6,  2 }, /* index 174  */
+{ 9,  2,  1,  640,  8,  1,  3,  2 }, /* index 175  */
+{ 9,  2,  1,  528,  8,  1,  3,  2 }, /* index 176  */
+{ 9,  2,  1,  528,  2,  2,  6,  2 }, /* index 177  */
+{ 9,  2,  1,  924,  2,  1,  6,  2 }, /* index 178  */
+{ 9,  1,  0,  512,  2,  2,  6,  2 }, /* index 179  */
+{ 9,  1,  0,  512,  8,  1,  3,  2 }, /* index 180  */
+{ 9,  1,  0,  512,  2,  1,  6,  2 }, /* index 181  */
+{ 9,  1,  0,  768,  2,  2,  6,  2 }, /* index 182  */
+{ 9,  1,  0,  528,  2,  1,  6,  2 }, /* index 183  */
+{ 9,  1,  0,  640,  8,  1,  3,  2 }, /* index 184  */
+{ 9,  1,  0,  792,  2,  1,  6,  2 }, /* index 185  */
+{ 9,  1,  0,  792,  2,  2,  6,  2 }, /* index 186  */
+{ 9,  1,  0,  682,  2,  1,  6,  2 }, /* index 187  */
+{ 9,  1,  0, 1023,  8,  1,  3,  2 }, /* index 188  */
+{10, 16,  1,  512,  2,  2,  2,  6 }, /* index 189  */
+{10,  8,  1,  512,  2,  2,  2,  6 }, /* index 190  */
+{10,  4,  1,  512,  2,  1,  2,  6 }, /* index 191  */
+{10,  2,  1,  512,  2,  1,  2,  6 }, /* index 192  */
+{10,  2,  1,  768,  2,  2,  2,  6 }, /* index 193  */
+{10,  2,  1,  640,  2,  1,  2,  6 }, /* index 194  */
+{10,  2,  1,  640,  8,  1,  1,  6 }, /* index 195  */
+{10,  2,  1,  528,  8,  1,  1,  6 }, /* index 196  */
+{10,  2,  1,  528,  2,  2,  2,  6 }, /* index 197  */
+{10,  2,  1,  924,  2,  1,  2,  6 }, /* index 198  */
+{10,  8,  1,  512,  8,  2,  1,  6 }, /* index 199  */
+{10,  4,  1,  512,  8,  1,  1,  6 }, /* index 200  */
+{10,  1,  0,  512,  2,  2,  2,  6 }, /* index 201  */
+{10,  1,  0,  512,  8,  1,  1,  6 }, /* index 202  */
+{10,  1,  0,  512,  2,  1,  2,  6 }, /* index 203  */
+{10,  1,  0,  768,  2,  2,  2,  6 }, /* index 204  */
+{10,  1,  0,  528,  2,  1,  2,  6 }, /* index 205  */
+{10,  1,  0,  640,  8,  1,  1,  6 }, /* index 206  */
+{10,  1,  0,  792,  2,  1,  2,  6 }, /* index 207  */
+{10,  1,  0,  792,  2,  2,  2,  6 }, /* index 208  */
+{10,  1,  0,  682,  2,  1,  2,  6 }, /* index 209  */
+{10,  1,  0, 1023,  8,  1,  1,  6 }, /* index 210  */
+{11,  2,  1,  512,  2,  1,  6,  2 }, /* index 211  */
+{11,  2,  1,  528,  8,  1,  3,  2 }, /* index 212  */
+{11,  2,  1,  640,  8,  1,  3,  2 }, /* index 213  */
+{11,  2,  1,  640,  2,  1,  6,  2 }, /* index 214  */
+{11,  2,  1,  528,  2,  2,  6,  2 }, /* index 215  */
+{11,  2,  1,  768,  2,  2,  6,  2 }, /* index 216  */
+{11,  1,  0,  512,  2,  2,  6,  2 }, /* index 217  */
+{11,  1,  0,  512,  8,  1,  3,  2 }, /* index 218  */
+{11,  1,  0,  512,  2,  1,  6,  2 }, /* index 219  */
+{11,  1,  0,  768,  2,  2,  6,  2 }, /* index 220  */
+{11,  1,  0,  528,  2,  1,  6,  2 }, /* index 221  */
+{11,  1,  0,  640,  8,  1,  3,  2 }, /* index 222  */
+{11,  1,  0,  792,  2,  2,  6,  2 }, /* index 223  */
+{11,  1,  0,  682,  2,  1,  6,  2 }, /* index 224  */
+{11,  1,  0, 1023,  8,  1,  3,  2 }, /* index 225  */
+{12,  2,  1,  512,  0,  1,  3,  4 }, /* index 226  */
+{12,  2,  1,  528,  6,  1,  2,  4 }, /* index 227  */
+{12,  2,  1,  640,  6,  1,  2,  4 }, /* index 228  */
+{12,  2,  1,  528,  0,  2,  3,  4 }, /* index 229  */
+{12,  2,  1,  768,  0,  2,  3,  4 }, /* index 230  */
+{12,  1,  0,  512,  0,  2,  3,  4 }, /* index 231  */
+{12,  1,  0,  512,  6,  1,  2,  4 }, /* index 232  */
+{12,  1,  0,  512,  0,  1,  3,  4 }, /* index 233  */
+{12,  1,  0,  768,  0,  2,  3,  4 }, /* index 234  */
+{12,  1,  0,  528,  0,  1,  3,  4 }, /* index 235  */
+{12,  1,  0,  640,  6,  1,  2,  4 }, /* index 236  */
+{12,  1,  0,  792,  0,  1,  3,  4 }, /* index 237  */
+{12,  1,  0,  792,  0,  2,  3,  4 }, /* index 238  */
+{12,  1,  0,  682,  0,  1,  3,  4 }, /* index 239  */
+{12,  1,  0, 1023,  6,  1,  2,  4 }, /* index 240  */
+{13,  2,  1,  512,  0,  1,  2,  6 }, /* index 241  */
+{13,  2,  1,  528,  2,  1,  2,  6 }, /* index 242  */
+{13,  2,  1,  640,  0,  1,  2,  6 }, /* index 243  */
+{13,  2,  1,  640,  2,  1,  2,  6 }, /* index 244  */
+{13,  2,  1,  528,  0,  2,  2,  6 }, /* index 245  */
+{13,  2,  1,  768,  0,  2,  2,  6 }, /* index 246  */
+{13,  1,  0,  512,  0,  2,  2,  6 }, /* index 247  */
+{13,  1,  0,  512,  2,  1,  2,  6 }, /* index 248  */
+{13,  1,  0,  512,  0,  1,  2,  6 }, /* index 249  */
+{13,  1,  0,  768,  0,  2,  2,  6 }, /* index 250  */
+{13,  1,  0,  528,  0,  1,  2,  6 }, /* index 251  */
+{13,  1,  0,  640,  2,  1,  2,  6 }, /* index 252  */
+{13,  1,  0,  792,  0,  2,  2,  6 }, /* index 253  */
+{13,  1,  0,  682,  0,  1,  2,  6 }, /* index 254  */
+{13,  1,  0, 1023,  2,  1,  2,  6 }  /* index 255  */
+};
+
+#else
 /* prach config index Table 6.3.3.2-2 spec 38.211 
  * PRACH format given as follows:
  * 0 = 0
@@ -259,15 +574,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  */
@@ -289,15 +604,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  */
@@ -370,7 +685,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  */
@@ -378,67 +693,417 @@ uint16_t prachCfgIdxTable[MAX_PRACH_CONFIG_IDX][8] = {
 {10,  1,  0, 1023,  0,  2,  2,  6 }, /* index 254  */
 {10,  1,  0,  682,  0,  2,  2,  6 }  /* index 255  */
 };
+#endif
 
 /* Defintion of delta value Table 6.1.2.1.1-5 spec 38.214 */
 uint8_t puschDeltaTable[MAX_MU_PUSCH] = { 2, 3, 4, 6 };
 
+uint16_t tbSizeTable[TOTAL_TBSIZE_VALUES] = {
+         24,    32,    40,    48,    56,    64,    72,    80,    88,    96, \
+        104,   112,   120,   128,   136,   144,   152,   160,   168,   176, \
+        184,   192,   208,   224,   240,   256,   272,   288,   304,   320, \
+        336,   352,   368,   384,   408,   432,   456,   480,   504,   528, \
+        552,   576,   608,   640,   672,   704,   736,   768,   808,   848, \
+        888,   928,   984,  1032,  1064,  1128,  1160,  1192,  1224,  1256, \
+       1288,  1320,  1352,  1416,  1480,  1544,  1608,  1672,  1736,  1800, \
+       1864,  1928,  2024,  2088,  2152,  2216,  2280,  2408,  2472,  2536, \
+       2600,  2664,  2728,  2792,  2856,  2976,  3104,  3240,  3368,  3496, \
+       3624,  3752,  3824 };
+
+uint16_t mcsTable[32][3] = {
+      {   0,   2,   120},   /* mcs index  0 */ 
+      {   1,   2,   157},   /* mcs index  1 */ 
+      {   2,   2,   193},   /* mcs index  2 */ 
+      {   3,   2,   251},   /* mcs index  3 */ 
+      {   4,   2,   308},   /* mcs index  4 */ 
+      {   5,   2,   379},   /* mcs index  5 */ 
+      {   6,   2,   449},   /* mcs index  6 */ 
+      {   7,   2,   526},   /* mcs index  7 */ 
+      {   8,   2,   602},   /* mcs index  8 */ 
+      {   9,   2,   679},   /* mcs index  9 */ 
+      {  10,   4,   340},   /* mcs index 10 */ 
+      {  11,   4,   378},   /* mcs index 11 */ 
+      {  12,   4,   434},   /* mcs index 12 */ 
+      {  13,   4,   490},   /* mcs index 13 */ 
+      {  14,   4,   553},   /* mcs index 14 */ 
+      {  15,   4,   616},   /* mcs index 15 */
+      {  16,   4,   658},   /* mcs index 16 */
+      {  17,   6,   438},   /* mcs index 17 */
+      {  18,   6,   466},   /* mcs index 18 */
+      {  19,   6,   517},   /* mcs index 19 */
+      {  20,   6,   567},   /* mcs index 20 */
+      {  21,   6,   616},   /* mcs index 21 */
+      {  22,   6,   666},   /* mcs index 22 */
+      {  23,   6,   719},   /* mcs index 23 */
+      {  24,   6,   772},   /* mcs index 24 */
+      {  25,   6,   822},   /* mcs index 25 */
+      {  26,   6,   873},   /* mcs index 26 */
+      {  27,   6,   910},   /* mcs index 27 */
+      {  28,   6,   948},   /* mcs index 28 */
+      {  29,   2,     0},   /* mcs index 29 */
+      {  30,   4,     0},   /* mcs index 30 */
+      {  31,   6,     0}};  /* mcs index 31 */
+
+/* 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 */
+};
+
+/* Minimum Msg3 scheduling time should be calculated based on N1+N2+NTAmax+0.5
+ * ms formula.
+ * Refer spec 38.213 section 8.3.
+ * Harcoding the minimum msg3 scheduling for now */
+uint8_t minMsg3SchTime[MAX_NUM_MU] = {6, 6, 6, 6};
+
+uint8_t defaultUlAckTbl[DEFAULT_UL_ACK_LIST_COUNT]= {1, 2, 3 , 4, 5, 6, 7, 8};
+/**
+ * @brief frequency domain allocation function. 
+ *
+ * @details
+ *
+ *     Function: schCalcTbSize
+ *     
+ *     This function finds the TBSize from table Table 5.1.3.2-1 spec 38.214
+ *     
+ *  @param[in]  payLoadSize - size of payload in bytes
+ *  @return     TBsize from the Table in bytes
+ **/
+uint16_t schCalcTbSize(uint32_t payLoadSize)
+{
+   uint8_t tbsIndex = 0;
+   uint16_t maxTbSize;
+
+   maxTbSize = tbSizeTable[TOTAL_TBSIZE_VALUES -1]/8;
+   if(payLoadSize >= maxTbSize)
+      return maxTbSize;
+
+   payLoadSize = payLoadSize*8;
+   while(payLoadSize > tbSizeTable[tbsIndex])
+   {
+      tbsIndex++;
+   }
+
+   /* return the TBsize in bytes */
+   return (tbSizeTable[tbsIndex]/8);
+}
+
 /**
  * @brief frequency domain allocation function. 
  *
  * @details
  *
- *     Function: canclulatePRB
+ *     Function: schCalcNumPrb
  *     
- *     This function does allocation in frequency domain resource. using 
- *     bitwise operator, the bits are set for the PRBs.
+ *     This function calculates the number of PRbs 
  *     
- *  @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
+ *  @param[in]  tbSize in bytes
+ *  @param[in]  mcs
+ *  @param[in]  number of symbols
+ *  @return   number PRBs
  **/
-void calculatePRB(uint16_t startPrb, uint16_t prbSize, uint8_t *freqDomain)
+uint16_t schCalcNumPrb(uint16_t tbSize, uint16_t mcs, uint8_t numSymbols)
 {
-   uint8_t remBits = prbSize; /* each bit represents 6 PRBs */
-   uint8_t firstByte = 1;
-   uint8_t numBits,startBit,byteCount = 0;
+   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  numDmrsRePerPrb = 12;
+
+   tbSize = tbSize * 8; //Calculate tbSize in bits
 
-   while(remBits)
+   /* 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                                     */
+
+   nre = ceil( (float)tbSize * 1024 / (qm * rValue * numLayer));
+
+   nreDash = ceil( (12 * numSymbols) - numDmrsRePerPrb - 0);
+
+   if (nreDash > 156)
+      nre = 156;
+
+   numPrb = ceil((float)nre / nreDash);   
+   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)
    {
-      /* when the startPrb is not in this byteCount */
-      if(startPrb/8)
+      n = MAX(3, (uint32_t)cmLog2(nInfo) - 6);
+      nInfoDash = MAX(24, (1<<n)*(nInfo/(1<<n)));
+      while(nInfoDash > tbSizeTable[tbsIndex])
       {
-         startPrb -= 8;
-         byteCount++;
-         continue;
+         tbsIndex++;
       }
+      tbSize = tbSizeTable[tbsIndex];
+   }
+   else
+   {
+      n = (uint32_t)cmLog2(nInfo - 24) - 5;
+      nInfoDash = MAX(3840, (1<<n)*ceil((nInfo - 24)/(1<<n)));
 
-      /* 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;
+      if(rValue<256)
+      {
+         c = ceil((nInfoDash + 24)/3816);
+         tbSize = 8 * c * ceil((nInfoDash + 24)/(8 * c)) - 24;
+      }
       else
-         startBit = 0;
+      {
+         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
+ *
+ * @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]);
+}
 
-      /* calculate the number of bits to be set in this byte */
-      if((remBits+startPrb) <= 8)
-         numBits = remBits;
-      else
-         numBits = 8 - startBit;
+/**
+ * @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->resAllocBitMap = 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;
+   }
+   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/symbol 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)
+{
+   uint32_t offset = (slot)*2;
+   return (bitMap & 0x3<<offset)>>offset;
+#if 0
+   SlotConfig slotFrmt;
+   int mask1 = 0, mask2 = 0;
+
+   slot = (slot%n)*2;//n num of slots in defined periodicity or num of symbols
+   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
+}
+
+/**
+ * @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 
+ **/
 
-      /* bit operation to set the bits */
-               SET_BITS((startBit % 8),numBits,freqDomain[byteCount])
-      firstByte = 0;
+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);
 
-      /* the ramaining bits should be subtracted with the numBits set in this byte */
-      remBits -= numBits;
-      byteCount++;
+   /* 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
 **********************************************************************/