MME2 changes - Propped commits from openmme/paging branch. Added scripts
for code gen

Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/scripts/GtpV2StackCodeGen/iECodeGen.py b/scripts/GtpV2StackCodeGen/iECodeGen.py
new file mode 100644
index 0000000..2a90656
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/iECodeGen.py
@@ -0,0 +1,318 @@
+# Copyright 2019-present Infosys Limited     
+# SPDX-License-Identifier: Apache-2.0
+
+
+import re
+import os
+from template import Template
+from xlUtils import xlUtils,wb
+
+ieFactoryData = {}
+ieFactoryData['ieList'] = []
+
+ieDataTypeData = {}
+ieDataTypeData['ieTypeList'] = []
+ieDataTypeData['ieList'] = []
+class GenerateIeClass:
+    
+    def __init__( self ):
+        
+        self.ieParser()
+    
+    #Parse the data from excel sheet 'IE Modeling' 
+    #and build to a dict 'iedata'
+    def ieParser(self):
+        
+        sheet = wb['IE Modeling']
+        state = ''
+        
+        encodeSeq = []
+        byteLength = 0
+        currentType = ''
+        validation = ''
+        count = ''
+        decodeCondition = ''
+        encodeCondition = ''
+        typeVal = ''
+        presence = ''
+        bitLength = 0        
+        varDetailList = []
+        ieData = dict()         
+        ieTypeList = []
+        lengthStr = ''        
+        varType = ''
+        varName = ''
+        mType=0
+        varList=[]
+        grpIeList = []
+        
+        for i in range(1,sheet.max_row+1):
+            presence = ''
+            bitLength = 0
+            byteLength = 0
+            cell_value_B = xlUtils.getCellValue(sheet,i,'B')
+            cell_value_D = xlUtils.getCellValue(sheet,i,'D')
+            cell_value_H = xlUtils.getCellValue(sheet,i,'H')
+            
+            # Search pattern for IE definition start,end 
+            mGroupedIe = re.search('Grouped IE Definition:(\w+)',str(cell_value_B))
+            mIeDefStart = re.search('IE Definition Start:(\w+)',str(cell_value_B))
+            mIeDefEnd = re.search('IE Definition End:(\w+)' ,str(cell_value_B))
+             
+            if mGroupedIe:
+                
+                grpIeName = mGroupedIe.group(1)
+                grpIeList.append(grpIeName)
+                for grpie in grpIeList:
+                    self.generateIeFactory(grpie)
+                
+            if mIeDefStart:
+                currentType = mIeDefStart.group(1)
+                state = 'StartDetected'
+                ieTypeList.append(currentType)
+                
+            elif mIeDefEnd:
+                
+                state = 'EndDetected' 
+                self.templateIes(ieData,currentType)
+                self.generateIeFactory(currentType)
+                self.generateIeDataType(currentType,typeVal,varList)
+                self.prepareIeMakeFile()
+                varList = []
+                
+            elif state == 'StartDetected':
+                varDetailList = []
+                encodeSeq = []
+                
+                colDValue = str(cell_value_D)
+                mType = re.search('Type = (\d+)',colDValue)
+                mSpare = re.search('Spare',colDValue)
+                mInstance = re.search('Instance',str(cell_value_H))
+                
+                if mType:
+                    typeVal = mType.group(1)
+                    ieData['ieDetails'] = {}
+                    ieData['ieDetails'][currentType] = {}
+                    ieData['ieDetails'][currentType]['ieName'] = currentType
+                    ieData['ieDetails'][currentType]['ieTypeVal'] = typeVal
+                    
+                if mSpare and mInstance:
+                    state = 'TypeDefinitionStart'
+                                    
+            elif state == 'TypeDefinitionStart':
+                
+                (byteLength,lengthStr) = xlUtils.getByteLength(sheet,i)
+                
+                #for fields less than 1 bytelength
+                if byteLength == 0:
+                    
+                   for j in map(chr, range( ord('D'), ord('L'))):
+                       field = xlUtils.getCellValue(sheet,i,j)
+                       fieldDetails=dict()
+                       if field != None:
+                           
+                           bitLength = xlUtils.getBitLength(sheet,i,j) 
+                           (varName,varType,encodeCondition,decodeCondition,validation,count) = xlUtils.extractField(field)
+                           
+                           if varType == '':
+                               varType = 'Uint8'
+                           if bitLength == 8:
+                               byteLength = 1
+                               bitLength = 0        
+                           if varName != 'Spare':
+                               fieldDetails['varName']=varName
+                               fieldDetails['varType']=varType
+                               fieldDetails['presence']=presence
+                               varList.append(fieldDetails)
+                              
+                               ieData['varDetails'] = {}
+                               ieData['varDetails'][varName] = {}
+                               ieData['varDetails'][varName]['varType'] = varType
+                               ieData['varDetails'][varName]['decodeCondition'] = decodeCondition
+                               ieData['varDetails'][varName]['encodeCondition'] = encodeCondition
+                               ieData['varDetails'][varName]['validation'] = validation
+                               ieData['varDetails'][varName]['bitLength'] = bitLength
+                               ieData['varDetails'][varName]['byteLength'] = byteLength
+                               ieData['varDetails'][varName]['lengthStr'] = lengthStr
+                               ieData['varDetails'][varName]['presence'] = presence
+                               ieData['varDetails'][varName]['count'] = count
+                               varDetailList.append(ieData['varDetails'])
+                               ieData['varDetails'] = varDetailList
+                               
+                               encStrBit = 'encode:' + varName + ':' + str(bitLength) + ':Bits'
+                               encodeSeq.append(encStrBit)
+                               ieData['encodeSeq'] = encodeSeq
+                               
+                           else:
+                               skipStrBit = 'skip:'+ str(bitLength) + ':Bits'
+                               encodeSeq.append(skipStrBit)
+                               ieData['encodeSeq'] = encodeSeq
+                
+                #for fields of length 1 byte
+                else:
+                                        
+                    field = sheet.cell(row=i, column=4).value
+                    (varName,varType,encodeCondition,decodeCondition,validation,count) = xlUtils.extractField(field)
+                    fieldDetails=dict()
+                    if varType == '':
+                        varType = xlUtils.lengthToType(byteLength)
+                
+                    if varName != 'Spare':
+                        fieldDetails['varName']=varName
+                        fieldDetails['varType']=varType
+                        if xlUtils.getCellValue(sheet,i,'B') == 'Yes':
+                             presence = 'optional'
+                        fieldDetails['presence']=presence
+                        varList.append(fieldDetails)
+                                              
+                        ieData['varDetails'] = {}
+                        ieData['varDetails'][varName] = {}
+                        ieData['varDetails'][varName]['varType'] = varType
+                        ieData['varDetails'][varName]['decodeCondition'] = decodeCondition
+                        ieData['varDetails'][varName]['encodeCondition'] = encodeCondition
+                        ieData['varDetails'][varName]['validation'] = validation
+                        ieData['varDetails'][varName]['bitLength'] = bitLength
+                        ieData['varDetails'][varName]['byteLength'] = byteLength
+                        ieData['varDetails'][varName]['lengthStr'] = lengthStr
+                        ieData['varDetails'][varName]['count'] = count
+                                           
+                        if xlUtils.getCellValue(sheet,i,'B') == 'Yes':
+                             presence = 'optional' 
+                             
+                             ieData['varDetails'][varName]['presence'] = presence
+                        varDetailList.append(ieData['varDetails'])
+                        ieData['varDetails'] = varDetailList
+                        
+                        encstrbyte = 'encode:' + varName + ':' + str(byteLength) + ':Bytes'
+                        encodeSeq.append(encstrbyte)
+                        ieData['encodeSeq'] = encodeSeq
+                    else:
+                        skipstrbyte = 'skip:'+ str(byteLength) + ':Bytes'
+                        encodeSeq.append(skipstrbyte)
+                        ieData['encodeSeq'] = encodeSeq    
+        return ieData    
+    
+    def templateIes(self,ieData,currentType):
+        
+        templateData = dict()  
+        varDetailsList = []
+        sequenceList = []
+        varDetailsList = ieData['varDetails']
+        templateData['className'] = ieData['ieDetails'][currentType]['ieName']+'Ie'
+        templateData['fileName'] = templateData['className'][0].lower() + templateData['className'][1:] 
+        templateData['classNameUC'] = templateData['className'].upper()
+        templateData['ieTypeVal'] = ieData['ieDetails'][currentType]['ieTypeVal']
+        
+        #building the dictionary obtained to a dict 'templateData'
+        #which is the input to template process 
+        
+        for en in ieData['encodeSeq']:   
+            mEncode = re.search('encode:(\w+):',en)
+            mSkip = re.search('skip:(\d+):(\w+)',en)
+            item = dict()
+            if mSkip:
+                bitByte = mSkip.group(2)
+                skipValue = mSkip.group(1)
+                item['skipType'] = 'y'
+                item['bitByte'] = bitByte
+                item['skipValue'] = skipValue
+            elif mEncode:
+                varName = mEncode.group(1)
+                for variableDetails in varDetailsList:
+                    for key,value in variableDetails.items():
+                        if key == varName:
+                            item['fieldName'] = varName
+                            if value['bitLength'] != 0:
+                                item['bitField'] = 'y'
+                                item['fieldSize'] = value['bitLength']
+                                item['leafType'] = 'y'
+                            else:
+                                item['fieldSize'] = value['byteLength']
+                            if value['decodeCondition'] != '':
+                                item['decodeConditional'] = 'y'
+                                item['decodeCondition'] = value['decodeCondition']
+                            if value['encodeCondition'] != '':
+                                item['encodeConditional'] = 'y'
+                                item['encodeCondition'] = value['encodeCondition']
+                            if value.get('presence') == 'optional':
+                                item['presence'] = 'optional'
+                            item['fieldType'] = value['varType']
+                            mUint = re.search('^Uint(\d+)$',value['varType'])
+                            if mUint or value['varType'] == 'bool':
+                                item['leafType'] = 'y'                    
+                            else:
+                                if value['lengthStr'] == 'EOI' or value['lengthStr'] == '':
+                                    item['length'] = 'lengthLeft'
+                                else:
+                                    item['length'] = value['lengthStr']
+                            if value['validation'] != '':
+                    
+                                item['validationPresent'] = 'y'
+                                item['validationRule'] = value['validation']
+                            mArray = re.search('Array',value['varType'])
+                            if mArray:
+                                item['arrayType']='y'
+                                if value['count'] =='':
+                                    item['count']=0
+                                else:
+                                    item['count']=value['count']
+                                
+            if  item != {}:
+                sequenceList.append(item)
+                templateData['sequence'] = sequenceList
+   
+        outputDir = '../../src/gtpV2Codec/ieClasses'
+        ttFileNameCpp = 'tts/ietemplate.cpp.tt'
+        ttFileNameH = 'tts/ietemplate.h.tt'
+        xlUtils.templateProcess(templateData,ttFileNameCpp,ttFileNameH,outputDir,outputDir)
+        
+        objectFile = 'ieClasses/' +templateData['fileName'] + '.o'
+        sourceFile ='ieClasses/' + templateData['fileName'] + '.cpp'
+        xlUtils.addToMakeSo('gtpV2Stack.so',objectFile,sourceFile)
+       
+    def ieFactoryTemplate(self,ieFactoryData):
+        
+        ieFactoryData['fileName']='gtpV2IeFactory'
+        ttFileNameFactoryCpp = 'tts/iefactorytemplate.cpp.tt'
+        outputDir = '../../src/gtpV2Codec/ieClasses'
+        ttFileNamefactoryH = 'tts/iefactorytemplate.h.tt'
+        xlUtils.templateProcess(ieFactoryData,ttFileNameFactoryCpp,ttFileNamefactoryH,outputDir,outputDir)
+        
+    def generateIeFactory(self,currentType):
+        ieinfo = {}
+        ieinfo['className'] = currentType + 'Ie'
+        ieinfo['ieFileName'] = currentType[0].lower()+currentType[1:] + 'Ie'
+        if ieinfo not in ieFactoryData['ieList']:
+            ieFactoryData['ieList'].append(ieinfo)
+        outputDir = 'ieClasses/'
+        self.ieFactoryTemplate(ieFactoryData)
+        xlUtils.addToMakeSo('gtpV2Stack.so',outputDir+'gtpV2IeFactory.o',outputDir+'gtpV2IeFactory.cpp')
+        
+    def generateIeDataType(self,currentType,typeVal,varList):
+        ieinfo = {}
+        ieTypeInfo={}    
+        ieinfo['ieName'] = currentType + 'IeData'
+        ieinfo['varList'] = varList
+        ieTypeInfo['ieName']=currentType + 'IeType'
+        ieTypeInfo['value']=typeVal
+        if ieinfo not in ieDataTypeData['ieList']:
+            ieDataTypeData['ieList'].append(ieinfo)
+        if ieTypeInfo not in ieDataTypeData['ieTypeList']:
+            ieDataTypeData['ieTypeList'].append(ieTypeInfo)
+        #print(ieDataTypeData)
+        template = Template()
+        ttFileNamefactoryH = 'tts/ieDataTypetemplate.h.tt'
+        outputDir = '../../src/gtpV2Codec/ieClasses'
+        
+        if not os.path.exists(outputDir):
+            os.makedirs(outputDir)
+        outputFileName = 'gtpV2IeDataTypes.h'
+        template.__init__({'OUTPUT' : outputFileName, 'OUTPUT_PATH' : outputDir})
+        template.process(ttFileNamefactoryH, {'tempdata' : ieDataTypeData})
+        
+    def prepareIeMakeFile(self):
+        outputDir = 'ieClasses/'
+        xlUtils.addToMakeSo('gtpV2Stack.so', outputDir+'dataTypeCodecUtils.o', outputDir+'dataTypeCodecUtils.cpp')
+        xlUtils.addToMakeSo('gtpV2Stack.so', outputDir+'manual/gtpV2Ie.o', outputDir+'manual/gtpV2Ie.cpp')
+        
+GenerateIeClass()