diff --git a/tools/memap.py b/tools/memap.py index adc9f98259..b465cb44f3 100644 --- a/tools/memap.py +++ b/tools/memap.py @@ -7,6 +7,7 @@ import sys import os import re +import csv import json import argparse from prettytable import PrettyTable @@ -335,7 +336,7 @@ class MemapParser(object): else: self.object_to_module.update({object_name:module_name}) - def generate_output(self, json_mode, file_output=None): + def generate_output(self, export_format, file_output=None): """ Generates summary of memory map data @@ -346,7 +347,7 @@ class MemapParser(object): try: if file_output: - file_desc = open(file_output, 'w') + file_desc = open(file_output, 'wb') else: file_desc = sys.stdout except IOError as error: @@ -361,11 +362,11 @@ class MemapParser(object): misc_flash_mem += self.modules[i][k] # Create table - colums = ['Module'] + columns = ['Module'] for i in list(self.print_sections): - colums.append(i) + columns.append(i) - table = PrettyTable(colums) + table = PrettyTable(columns) table.align["Module"] = "l" subtotal = dict() @@ -395,7 +396,7 @@ class MemapParser(object): table.add_row(subtotal_row) - if json_mode: + if export_format == 'json': json_obj.append({\ 'summary':{\ 'static_ram':(subtotal['.data']+subtotal['.bss']),\ @@ -406,7 +407,37 @@ class MemapParser(object): file_desc.write(json.dumps(json_obj, indent=4)) file_desc.write('\n') - else: + + elif export_format == 'csv-ci': # CSV format for the CI system + + csv_writer = csv.writer(file_desc, delimiter=',', quoting=csv.QUOTE_NONE) + + csv_module_section = [] + csv_sizes = [] + for i in sorted(self.modules): + for k in self.print_sections: + csv_module_section += [i+k] + csv_sizes += [self.modules[i][k]] + + csv_module_section += ['static_ram'] + csv_sizes += [subtotal['.data']+subtotal['.bss']] + + csv_module_section += ['heap'] + csv_sizes += [subtotal['.heap']] + + csv_module_section += ['stack'] + csv_sizes += [subtotal['.stack']] + + csv_module_section += ['total_ram'] + csv_sizes += [subtotal['.data']+subtotal['.bss']+subtotal['.heap']+subtotal['.stack']] + + csv_module_section += ['total_flash'] + csv_sizes += [subtotal['.text']+subtotal['.data']+misc_flash_mem] + + csv_writer.writerow(csv_module_section) + csv_writer.writerow(csv_sizes) + + else: # default format is 'table' file_desc.write(table.get_string()) file_desc.write('\n') file_desc.write("Static RAM memory (data + bss): %s\n" % (str(subtotal['.data']+subtotal['.bss']))) @@ -448,7 +479,7 @@ class MemapParser(object): def main(): - version = '0.3.9' + version = '0.3.10' # Parser handling parser = argparse.ArgumentParser(description="Memory Map File Analyser for ARM mbed OS\nversion %s" % version) @@ -460,8 +491,8 @@ def main(): parser.add_argument('-o', '--output', help='output file name', required=False) - parser.add_argument('-j', '--json', dest='json', required=False, action="store_true",\ - help='output in JSON formatted list') + parser.add_argument('-e', '--export', dest='export', required=False,\ + help="export format (examples: 'json', 'csv-ci', 'table': default)") parser.add_argument('-v', '--version', action='version', version=version) @@ -470,6 +501,7 @@ def main(): parser.print_help() sys.exit(1) + args, remainder = parser.parse_known_args() # Create memap object @@ -481,11 +513,15 @@ def main(): print "Unknown toolchain for memory statistics %s" % args.toolchain sys.exit(0) + # default export format is table + if not args.export: + args.export = 'table' + # Write output in file if args.output != None: - memap.generate_output(args.json, args.output) + memap.generate_output(args.export, args.output) else: # Write output in screen - memap.generate_output(args.json) + memap.generate_output(args.export) sys.exit(0) diff --git a/tools/toolchains/__init__.py b/tools/toolchains/__init__.py index 71158bef5e..cdb4fa2c94 100644 --- a/tools/toolchains/__init__.py +++ b/tools/toolchains/__init__.py @@ -831,13 +831,16 @@ class mbedToolchain: self.info("Unknown toolchain for memory statistics %s" % toolchain) return - # Write output to stdout - memap.generate_output(False) - - map_out = splitext(map)[0] + "_map.json" + # Write output to stdout in text (pretty table) format + memap.generate_output('table') # Write output to file in JSON format - memap.generate_output(True, map_out) + map_out = splitext(map)[0] + "_map.json" + memap.generate_output('json', map_out) + + # Write output to file in CSV format for the CI + map_csv = splitext(map)[0] + "_map.csv" + memap.generate_output('csv-ci', map_csv) from tools.settings import ARM_BIN