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

Change-Id: Ie55032217232214ac8544ca76ea34335205329e4
diff --git a/scripts/GtpV2StackCodeGen/groupedIECodeGen.py b/scripts/GtpV2StackCodeGen/groupedIECodeGen.py
new file mode 100644
index 0000000..072ccc0
--- /dev/null
+++ b/scripts/GtpV2StackCodeGen/groupedIECodeGen.py
@@ -0,0 +1,271 @@
+# Copyright 2019-present Infosys Limited     
+# SPDX-License-Identifier: Apache-2.0
+
+
+import re
+import os
+
+from template import Template
+from xlUtils import xlUtils,wb
+templateData = {}
+templateData['instList']=[]
+grpIeDataTypeData={}
+grpIeDataTypeData['grpList']=[]
+grpIeDataTypeData['grpTypeList']=[]
+class GenerateGrpIeClass():
+    def __init__( self ):
+        
+        self.groupIEParser()
+    
+    def groupIEParser(self):
+        
+        
+        sheet = wb['Grouped IE Modeling']
+        state = ''
+        
+        data = {}
+        grpIeData = {}
+        currentGrpie = ''
+        currentMsg = ''
+        currentVar = ''
+        currentInstance = ''
+        currentInstanceValue = 0
+        grpIeList = []
+        ieDetailsList = []
+        ieList = []
+       
+        for i in range(1,sheet.max_row+1):
+            
+            cell_value_B = xlUtils.getCellValue(sheet,i,'B')
+            
+            mGroupedIeDefStart = re.search('Grouped IE Definition Start:(\w+):(\d+):(\w+):(\w+):Instance\[(\d+)]',str(cell_value_B))
+            mGroupedIeDefEnd = re.search('Grouped IE Definition End:(\w+):(\w+)',str(cell_value_B))
+            
+            if mGroupedIeDefStart:
+                
+                state = 'StartDetected'
+                currentGrpie = mGroupedIeDefStart.group(1)
+                currentMsg = mGroupedIeDefStart.group(4)
+                currentVar = mGroupedIeDefStart.group(3)
+                currentInstanceValue = mGroupedIeDefStart.group(5)
+                currentInstance = currentVar + 'In' + currentMsg
+                
+                if currentGrpie not in grpIeList:
+                     grpIeList.append(currentGrpie)
+                     data['grpIeList'] = grpIeList
+                data['grpIeDetails'] = {}
+                data['grpIeDetails'][currentGrpie] = {}
+                data['grpIeDetails'][currentGrpie]['ieTypeValue'] = mGroupedIeDefStart.group(2)
+                data['grpIeDetails'][currentGrpie]['instList'] = []
+                data['grpIeDetails'][currentGrpie]['instList'].append(currentInstance)
+                data['grpIeDetails'][currentGrpie][currentInstance] = {}
+                data['grpIeDetails'][currentGrpie][currentInstance]['instance'] = currentInstanceValue
+                grpIeData = data['grpIeDetails'][currentGrpie][currentInstance]
+                grpIeData['msgName'] = currentMsg
+                
+            elif mGroupedIeDefEnd:
+                state = 'EndDetected'
+                grpIeData = {} 
+                ieList = []
+                grpIeList=[]
+                ieDetailsList = []
+               
+                GenerateGrpIeClass.generateGroupedIeClasses(data)
+                GenerateGrpIeClass.prepareGrpIeMakeFile()
+                
+                
+            elif state == 'StartDetected':
+                state = 'IeListStart'
+                
+            elif state == 'IeListStart':
+                
+                if xlUtils.getCellValue(sheet,i,'D') != None:
+                    ieData = {}
+                    ieDescription = xlUtils.getCellValue(sheet,i,'D')
+                    ieData['ieDescription'] = xlUtils.getCellValue(sheet,i,'D')
+                    ieData['presence'] = xlUtils.getCellValue(sheet,i,'E')
+                    ieData['grouped'] = xlUtils.getCellValue(sheet,i,'B')
+                    ieData['cardinality'] = xlUtils.getCellValue(sheet,i,'C')
+                    ieData['instance'] = xlUtils.getCellValue(sheet,i,'H') 
+                    
+                    if ieData['cardinality'] == None:
+                        ieData['cardinality'] = 1 
+                    ieTypeDescription = xlUtils.getCellValue(sheet,i,'G')
+                    ieData['ieTypeDescription'] = ieTypeDescription
+                    
+                    ieVarName  = xlUtils.getVarNameFromString(ieDescription,0)
+                    
+                    ieTypeName  = xlUtils.getVarNameFromString(ieTypeDescription,1)
+                    
+                    if ieData['grouped'] == 'Yes':
+                        ieData['ieGroupTypeName'] = ieVarName.capitalize() + 'In' + currentMsg
+                        
+                    ieData['ieVarName'] = ieVarName
+                    ieData['ieTypeName'] = ieTypeName
+                    
+                    
+                    ieList.append(ieVarName)
+                    grpIeData['ieList'] = ieList
+                    grpIeData['ieDetails'] = {}
+                    grpIeData['ieDetails'][ieVarName] = ieData
+                    ieDetailsList.append(grpIeData['ieDetails'])
+                    grpIeData['ieDetails'] = ieDetailsList
+                    
+        
+    def generateGroupedIeClasses(data):
+        parsedData = data
+        
+        for grpIe in parsedData['grpIeList']:
+            
+            grpIeDetails = parsedData['grpIeDetails'][grpIe]
+            
+            GenerateGrpIeClass.generateGroupedIeClass(grpIeDetails,grpIe)
+            GenerateGrpIeClass.generateGroupedIeDataType(grpIeDetails, grpIe)
+    def generateGroupedIeClass(grpIeDetails,grpIe):
+        
+        templateData['fileName'] = grpIe[0].lower()+grpIe[1:] + 'Ie'
+        templateData['className'] = grpIe + 'Ie'
+        templateData['classNameUC'] = templateData['fileName'].upper()
+        fileName=templateData['fileName']
+
+        for inst in grpIeDetails['instList']:
+            instanceInfo = {}
+            instDetails  = grpIeDetails[inst]
+            GenerateGrpIeClass.generateGroupedIeInstanceClass(instDetails, inst)
+            
+            instanceInfo['className'] = inst
+            instanceInfo['fileName'] = inst[0].lower()+inst[1:]
+            instanceInfo['msgType'] =  instDetails['msgName'] + 'MsgType'
+            instanceInfo['instance'] = instDetails['instance']
+            
+            if instanceInfo not in templateData['instList']:
+                templateData['instList'].append(instanceInfo)
+            
+        templateData[fileName]=[inst for inst in templateData['instList'] if grpIe in inst['className']]                
+           
+        outputDir = '../../src/gtpV2Codec/ieClasses'
+        ttFileNameCpp = 'tts/grpietemplate.cpp.tt'
+        ttFileNameH = 'tts/grpietemplate.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 generateGroupedIeDataType(grpIeDetails, grpIe):
+        grpIeInfo={}
+        
+        grpIeInfo['iePresenceList']=[]
+        grpIeTypeInfo={}
+        grpIeTypeInfo['grpIeTypeName']=grpIe + 'IeType'
+        grpIeTypeInfo['grpIeTypeValue']=grpIeDetails['ieTypeValue']
+        if grpIeTypeInfo not in grpIeDataTypeData['grpTypeList']:
+            grpIeDataTypeData['grpTypeList'].append(grpIeTypeInfo)
+        
+        for inst in grpIeDetails['instList']:
+            
+            instDetails  = grpIeDetails[inst]
+            grpIeInfo={}
+            grpIeInfo['iePresenceList']=[]
+            grpIeInfo['grpIeName']= inst+'Data'
+            grpIeInfo['ieList']=[]
+            for ieDict in instDetails['ieDetails']:
+                for ieDetails in ieDict:
+                    if ieDict[ieDetails]['presence']!='M':
+                        grpIeInfo['iePresenceList'].append(ieDict[ieDetails]['ieVarName']+'IePresent')
+                    ieInfo={}
+                    ieInfo['ieTypeName']=ieDict[ieDetails]['ieTypeName']+'IeData'
+                    ieInfo['ieVarName']=ieDict[ieDetails]['ieVarName']
+                    grpIeInfo['ieList'].append(ieInfo)
+        
+        if grpIeInfo not in grpIeDataTypeData['grpList']:
+            grpIeDataTypeData['grpList'].append(grpIeInfo)
+        template = Template()
+        ttFileNamefactoryH = 'tts/grpIeDataTypetemplate.h.tt'
+        outputDir = '../../src/gtpV2Codec/ieClasses/'
+        
+        if not os.path.exists(outputDir):
+            os.makedirs(outputDir)
+        outputFileName = 'gtpV2GrpIeDataTypes.h'
+        template.__init__({'OUTPUT' : outputFileName, 'OUTPUT_PATH' : outputDir})
+        template.process(ttFileNamefactoryH, {'tempdata' : grpIeDataTypeData})
+        
+    def generateGroupedIeInstanceClass(instDetails, inst):
+        templateInstData = {}
+        ieTypeList = []
+        ieTypeDetailsList = []
+       
+        ieInfoList =[]
+       
+        templateInstData['fileName'] = inst[0].lower()+inst[1:]
+        
+        templateInstData['msgClassName'] = inst
+        templateInstData['classNameUC'] = templateInstData['fileName'].upper()
+        
+        for ieEntry in instDetails['ieList']:
+            
+            ieInfo = {}
+            ieTypeInfo = {}
+            
+            ies = instDetails['ieDetails']
+            for x in ies:
+                
+                ie = x.get(ieEntry)
+                
+                if ie != None and ieEntry == ie.get('ieVarName'):
+                    ieInfo['ieName'] =  ie['ieVarName']
+                    ieInfo['ieVarName'] = ie['ieVarName']
+                    ieInfo['ieType'] = ie['ieTypeName']
+                    ieInfo['ieFileName'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:] + 'Ie'
+                    ieInfo['ieLocalVar'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:]
+                    ieInfo['iePresence'] = ie['presence']
+                    ieInfo['ieCardinality'] = ie['cardinality']
+                    ieInfo['instance'] = ie['instance']
+                    ieInfo['grouped'] = ie['grouped']
+                   
+                    ieType = ieInfo['ieType']
+                    
+                    ieTypeInfo['ieName'] =  ie['ieVarName']
+                    ieTypeInfo['ieVarName'] = ie['ieVarName']
+                    ieTypeInfo['ieType'] = ie['ieTypeName']
+                    ieTypeInfo['ieFileName'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:] + 'Ie'
+                    ieTypeInfo['ieLocalVar'] = ie['ieTypeName'][0].lower()+ie['ieTypeName'][1:]
+                    ieTypeInfo['iePresence'] = ie['presence']
+                    ieTypeInfo['ieCardinality'] = ie['cardinality']
+                    ieTypeInfo['instance'] = ie['instance']
+                    ieTypeInfo['grouped'] = ie['grouped']
+                                        
+                    if ieInfo['ieType'] not in ieTypeList:   
+                        ieTypeList.append(ieInfo['ieType'])
+                        templateInstData['ieTypeList'] = ieTypeList
+                                        
+                    if ieInfo not in ieInfoList:
+                                              
+                        ieInfoList.append(ieInfo)
+                        templateInstData['ieList'] = ieInfoList
+                    
+                    templateInstData['ieTypeDetails'] = {}
+                    templateInstData['ieTypeDetails'][ieType] = []
+                    if ieTypeInfo not in templateInstData['ieTypeDetails'][ieType]:
+                        templateInstData['ieTypeDetails'][ieType].append(ieTypeInfo)
+                        ieTypeDetailsList.append(templateInstData['ieTypeDetails'])
+                        templateInstData['ieTypeDetails'] = ieTypeDetailsList
+      
+        GenerateGrpIeClass.templateInstanceprocess(templateInstData)
+        outputDirCpp = 'ieClasses/'
+        objectfile = outputDirCpp +templateInstData['fileName'] + '.o'
+        sourcefile = outputDirCpp + templateInstData['fileName'] + '.cpp'
+        xlUtils.addToMakeSo('gtpV2Stack.so',objectfile,sourcefile)
+        
+    def templateInstanceprocess(templateInstData):
+        
+        ttFileNameInstCpp = 'tts/grpieinsttemplate.cpp.tt'
+        outputDir = '../../src/gtpV2Codec/ieClasses'
+        ttFileNameInstH = 'tts/grpieinsttemplate.h.tt'
+        xlUtils.templateProcess(templateInstData,ttFileNameInstCpp,ttFileNameInstH,outputDir,outputDir)
+            
+    def prepareGrpIeMakeFile():
+        outputDirCpp = 'ieClasses/manual/'
+        xlUtils.addToMakeSo("gtpV2Stack.so", outputDirCpp+'gtpV2GroupedIe.o',outputDirCpp+'gtpV2GroupedIe.cpp')
+                    
+GenerateGrpIeClass()