[Feature][Modem]Update MTK MODEM V1.6 baseline version: MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6

MTK modem version: MT2735_IVT_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.tar.gz
RF  modem version: NA

Change-Id: I45a4c2752fa9d1a618beacd5d40737fb39ab64fb
diff --git a/mcu/tools/tmd-to-utmd.py b/mcu/tools/tmd-to-utmd.py
new file mode 100755
index 0000000..e7d130d
--- /dev/null
+++ b/mcu/tools/tmd-to-utmd.py
@@ -0,0 +1,233 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+import re
+import os
+import json
+import shlex
+import logging
+import argparse
+import string
+import traceback
+class ParserState():
+    EXPECT_DEFAULT='init'
+    DEFAULT = '\[default\]'
+    MDTYPE= '\[modem_type\]'
+    READ_LEVEL = '\[read_level\]'
+    CLASS = '\[class\]'
+    STRING= '\[string\]'
+    STRING_CONTENT= 'string content'
+    MESSAGE='\[message\]'
+
+parserState = ParserState.DEFAULT
+default = []
+legacyParams = {}
+classes = []
+strings = []
+msgs = []
+traceFamily = ''
+
+def init_logger(log_filename):
+    logging.basicConfig(level=logging.DEBUG,
+            format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
+            datefmt='%m-%d %H:%M:%S',
+            filename=log_filename)
+    console = logging.StreamHandler()
+    console.setLevel(logging.INFO)
+    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
+    console.setFormatter(formatter)
+    logging.getLogger('').addHandler(console)
+#for line in map(lambda x: x.rstrip(), lines):
+def parseTmd(tmd_file):
+    global default
+    global legacyParams
+    global classes
+    global strings
+    global msgs
+    global traceFamily
+    key = ''
+    parserState = ParserState.EXPECT_DEFAULT
+    logging.info('Processing {}'.format(tmd_file))
+    file = open(tmd_file)
+    line = file.readline()
+    while line:
+        line = line.rstrip().lstrip()
+        logging.debug('[IO] State {}: line: {}'.format(parserState, line))
+        if line == '' or line.startswith('//') or line.startswith('#'):
+            logging.debug('skip line comment or empty line')
+            line = file.readline()
+            continue
+        # state change
+        if re.match(ParserState.DEFAULT, line, re.IGNORECASE):
+            parserState = ParserState.DEFAULT
+            line = file.readline()
+            continue
+        elif re.match(ParserState.MDTYPE, line, re.IGNORECASE):
+            parserState = ParserState.MDTYPE
+            line = file.readline()
+            continue
+        elif re.match(ParserState.CLASS, line, re.IGNORECASE):
+            parserState = ParserState.CLASS
+            line = file.readline()
+            continue
+        elif re.match(ParserState.STRING, line, re.IGNORECASE):
+            parserState = ParserState.STRING
+            line = file.readline()
+            continue
+        elif re.match(ParserState.MESSAGE, line, re.IGNORECASE):
+            parserState = ParserState.MESSAGE
+            line = file.readline()
+            continue
+        # parse
+        if parserState == ParserState.DEFAULT:
+            default.append(line)
+            if line.startswith('L2_Buffer'):
+                traceFamily = 'L2'
+                logging.info('This is L2 TMD')
+            elif line.startswith('TCMFORCE') or line.startswith('TCMON'):
+                legacyParams.update({'codeSection': line})
+                logging.info('codesection {}'.format(line))
+            elif line.startswith('L2SRAMFORCE'):
+                legacyParams.update({'codeSection': line})
+                logging.info('codesection {}'.format(line))
+            elif line.startswith('MAX_ARG'):
+                legacyParams.update({'l2MaxArg': int(line.split()[1])})
+                logging.info('MAX_ARG {}'.format(line.split()[1]))
+            elif line.startswith('L2_BUFFER_SETTING'):
+                legacyParams.update({'l2BufferSetting': line.split()[1]})
+                logging.info('L2_BUF {}'.format(line.split()[1]))
+            if traceFamily is '':
+                traceFamily = 'L1'
+                logging.info('This is L1 TMD')
+            if 'l2MaxArg' not in legacyParams.keys() and traceFamily == 'L2':
+                legacyParams.update({'l2MaxArg': 4})
+            if 'l2BufferSetting' not in legacyParams.keys() and traceFamily == 'L2':
+                legacyParams.update({'l2BufferSetting': 'L2_BUFFER_EL2'})
+            logging.debug('Append defaultParams {}'.format(default))
+        elif parserState == ParserState.MDTYPE:
+            legacyParams.update( { 'modemType': line } )
+            logging.info('Update legacyParams {}'.format(legacyParams))
+        elif parserState == ParserState.CLASS:
+            cls = re.split(r' |\t', line)
+            if len(cls) > 1:
+                if cls[0].endswith('_UH'):
+                    debugLevel = 'Ultra-High'
+                if cls[0].endswith('_H'):
+                    debugLevel = 'High'
+                if cls[0].endswith('_M'):
+                    debugLevel = 'Medium'
+                if cls[0].endswith('_L'):
+                    debugLevel = 'Low'
+                if cls[0].endswith('_UL'):
+                    debugLevel = 'Ultra-Low'
+                else:
+                    debugLevel = 'Ultra-Low'
+                _class = { cls[0]: {'tag': ['Baseline'], 'traceType': 'CoreDesign', 'debugLevel': debugLevel, 'filterDefaultValue' : cls[1].upper(), '_comment': 'filterDefaulValue is used in xl1sim, will be phased out later' } }
+                classes.append(_class)
+                logging.info('Append traceClassDef {}'.format(_class))
+            else:
+                logging.error('Invalid Trace Class')
+        elif parserState == ParserState.STRING:
+            if line.startswith('"') or line.startswith(','):
+                allMatches = re.finditer(r'("(.*?)")(\s*,?)', line)
+                for match in allMatches:
+                    strs.append(match.group(2))
+                    logging.debug('Append {} stringTranslationDef {}'.format(key, match.group(1)))
+            elif line.startswith('{'):
+                logging.info('Start Processing StringTranslation {}'.format(key))
+                dictionary = {}
+                strs = []
+                match = re.search(r'("(.*?)")(\s*,?)', line[1::])
+                if match:
+                    strs.append(match.group(2))
+                    logging.debug('Append {} stringTranslationDef {}'.format(key, match.group(1)))
+            elif line.startswith('}'):
+                logging.info('End Processing StringTranslation {}'.format(key))
+                dictionary[key] = strs
+                strings.append(dictionary)
+            else:
+                key = line
+        elif parserState == ParserState.MESSAGE:
+            msg = shlex.split(line)
+            trc = {}
+            if len(msg) >= 4:
+                trc['traceHighlightOption'] = msg[0]
+                trc['traceClass'] = msg[-2]
+                trc['format'] = msg[-1]
+            if len(msg) == 5:
+                rep = re.sub(r'[\(|\)]', r'', msg[1])
+                sep = string.split(rep, '/')
+                for par in sep:
+                    if par == 'ex_force_l1':
+                        trc['dhlReserved'] = par
+                    elif par == 'ex_force_l2':
+                        trc['dhlReserved'] = par
+                    elif par == 'force_l1':
+                        trc['dhlReserved'] = par
+                    elif par == 'force_l2':
+                        trc['dhlReserved'] = par
+                    elif par == 'cond':
+                        trc['traceDataPath'] = par
+                    elif par == 'hw_cond':
+                        trc['traceDataPath'] = par
+                    elif par == 'on_demand':
+                        trc['traceDataPath'] = par
+                    elif par == 'non_smp':
+                        trc['smpProperty'] = par
+                    elif par == 'smp':
+                        trc['smpProperty'] = par
+                _trc = { msg[2] : trc }
+                msgs.append(_trc)
+                logging.info('Append traceDef {}'.format(msg[2]))
+                logging.debug('Append traceDef {}'.format(_trc))
+            elif len(msg) == 4:
+                _trc = { msg[1] : trc }
+                msgs.append(_trc)
+                logging.info('Append traceDef {}'.format(msg[1]))
+                logging.debug('Append traceDef {}'.format(_trc))
+            else:
+                logging.warning('skip line')
+        line = file.readline()
+def main():
+    parser = argparse.ArgumentParser(description='TMD-UTMD',
+            formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+    parser.add_argument("-v", action="version", version='1.0.0')
+    parser.add_argument("tmd_file",
+            help="input TMD file")
+    parser.add_argument("utmd_file",
+            help="output UTMD file")
+    parser.add_argument("-l", dest="log_file",
+            help="log file",
+            default='legacy-utmd.log',
+            action="store")
+    args = parser.parse_args()
+    if args.tmd_file is None:
+        parser.print_help()
+        quit()
+    if args.utmd_file is None:
+        parser.print_help()
+        quit()
+    init_logger(args.log_file)
+    tmp_filename = args.tmd_file + '.tmp'
+    os.system('cat {} |gcc -fpreprocessed -dD -E -P - > {}'.format(args.tmd_file, tmp_filename))
+    parseTmd(tmp_filename)
+    j = json.dumps({'module':default[0],
+        'legacyParameters': legacyParams,
+        'stringTranslationDefs': strings,
+        'traceClassDefs': classes,
+        'traceDefs': msgs,
+        'traceFamily': traceFamily
+        },
+        sort_keys=True,
+        ensure_ascii=False,
+        indent=2
+        )
+    utmd_file = open(args.utmd_file, 'w')
+    utmd_file.write(j)
+    os.system('rm -f {}.tmp'.format(args.tmd_file))
+if __name__ == '__main__':
+    try:
+        main()
+    except:
+        logging.error('WTF')
+        traceback.print_exc(file=sys.stderr)
+