diff options
Diffstat (limited to 'tools/metrics.py')
-rwxr-xr-x | tools/metrics.py | 87 |
1 files changed, 49 insertions, 38 deletions
diff --git a/tools/metrics.py b/tools/metrics.py index 0cc6db510..5f1560287 100755 --- a/tools/metrics.py +++ b/tools/metrics.py @@ -45,7 +45,8 @@ Other commands: import sys, re, subprocess -MAKE_FLAGS = ['-j3', 'CFLAGS_EXTRA=-DNDEBUG'] +MAKE_FLAGS = ["-j3", "CFLAGS_EXTRA=-DNDEBUG"] + class PortData: def __init__(self, name, dir, output, make_flags=None): @@ -54,19 +55,21 @@ class PortData: self.output = output self.make_flags = make_flags + port_data = { - 'b': PortData('bare-arm', 'bare-arm', 'build/firmware.elf'), - 'm': PortData('minimal x86', 'minimal', 'build/firmware.elf'), - 'u': PortData('unix x64', 'unix', 'micropython'), - 'n': PortData('unix nanbox', 'unix', 'micropython-nanbox', 'VARIANT=nanbox'), - 's': PortData('stm32', 'stm32', 'build-PYBV10/firmware.elf', 'BOARD=PYBV10'), - 'c': PortData('cc3200', 'cc3200', 'build/WIPY/release/application.axf', 'BTARGET=application'), - '8': PortData('esp8266', 'esp8266', 'build-GENERIC/firmware.elf'), - '3': PortData('esp32', 'esp32', 'build-GENERIC/application.elf'), - 'r': PortData('nrf', 'nrf', 'build-pca10040/firmware.elf'), - 'd': PortData('samd', 'samd', 'build-ADAFRUIT_ITSYBITSY_M4_EXPRESS/firmware.elf'), + "b": PortData("bare-arm", "bare-arm", "build/firmware.elf"), + "m": PortData("minimal x86", "minimal", "build/firmware.elf"), + "u": PortData("unix x64", "unix", "micropython"), + "n": PortData("unix nanbox", "unix", "micropython-nanbox", "VARIANT=nanbox"), + "s": PortData("stm32", "stm32", "build-PYBV10/firmware.elf", "BOARD=PYBV10"), + "c": PortData("cc3200", "cc3200", "build/WIPY/release/application.axf", "BTARGET=application"), + "8": PortData("esp8266", "esp8266", "build-GENERIC/firmware.elf"), + "3": PortData("esp32", "esp32", "build-GENERIC/application.elf"), + "r": PortData("nrf", "nrf", "build-pca10040/firmware.elf"), + "d": PortData("samd", "samd", "build-ADAFRUIT_ITSYBITSY_M4_EXPRESS/firmware.elf"), } + def syscmd(*args): sys.stdout.flush() a2 = [] @@ -77,6 +80,7 @@ def syscmd(*args): a2.extend(a) subprocess.run(a2) + def parse_port_list(args): if not args: return list(port_data.values()) @@ -87,10 +91,11 @@ def parse_port_list(args): try: ports.append(port_data[port_char]) except KeyError: - print('unknown port:', port_char) + print("unknown port:", port_char) sys.exit(1) return ports + def read_build_log(filename): data = dict() lines = [] @@ -98,7 +103,7 @@ def read_build_log(filename): with open(filename) as f: for line in f: line = line.strip() - if line.strip() == 'COMPUTING SIZES': + if line.strip() == "COMPUTING SIZES": found_sizes = True elif found_sizes: lines.append(line) @@ -109,14 +114,15 @@ def read_build_log(filename): data[fields[-1]] = [int(f) for f in fields[:-2]] is_size_line = False else: - is_size_line = line.startswith('text\t ') + is_size_line = line.startswith("text\t ") return data + def do_diff(args): """Compute the difference between firmware sizes.""" if len(args) != 2: - print('usage: %s diff <out1> <out2>' % sys.argv[0]) + print("usage: %s diff <out1> <out2>" % sys.argv[0]) sys.exit(1) data1 = read_build_log(args[0]) @@ -125,81 +131,86 @@ def do_diff(args): for key, value1 in data1.items(): value2 = data2[key] for port in port_data.values(): - if key == 'ports/{}/{}'.format(port.dir, port.output): + if key == "ports/{}/{}".format(port.dir, port.output): name = port.name break data = [v2 - v1 for v1, v2 in zip(value1, value2)] - warn = '' - board = re.search(r'/build-([A-Za-z0-9_]+)/', key) + warn = "" + board = re.search(r"/build-([A-Za-z0-9_]+)/", key) if board: board = board.group(1) else: - board = '' - if name == 'cc3200': + board = "" + if name == "cc3200": delta = data[0] percent = 100 * delta / value1[0] if data[1] != 0: - warn += ' %+u(data)' % data[1] + warn += " %+u(data)" % data[1] else: delta = data[3] percent = 100 * delta / value1[3] if data[1] != 0: - warn += ' %+u(data)' % data[1] + warn += " %+u(data)" % data[1] if data[2] != 0: - warn += ' %+u(bss)' % data[2] + warn += " %+u(bss)" % data[2] if warn: - warn = '[incl%s]' % warn - print('%11s: %+5u %+.3f%% %s%s' % (name, delta, percent, board, warn)) + warn = "[incl%s]" % warn + print("%11s: %+5u %+.3f%% %s%s" % (name, delta, percent, board, warn)) + def do_clean(args): """Clean ports.""" ports = parse_port_list(args) - print('CLEANING') + print("CLEANING") for port in ports: - syscmd('make', '-C', 'ports/{}'.format(port.dir), port.make_flags, 'clean') + syscmd("make", "-C", "ports/{}".format(port.dir), port.make_flags, "clean") + def do_build(args): """Build ports and print firmware sizes.""" ports = parse_port_list(args) - print('BUILDING MPY-CROSS') - syscmd('make', '-C', 'mpy-cross', MAKE_FLAGS) + print("BUILDING MPY-CROSS") + syscmd("make", "-C", "mpy-cross", MAKE_FLAGS) - print('BUILDING PORTS') + print("BUILDING PORTS") for port in ports: - syscmd('make', '-C', 'ports/{}'.format(port.dir), MAKE_FLAGS, port.make_flags) + syscmd("make", "-C", "ports/{}".format(port.dir), MAKE_FLAGS, port.make_flags) do_sizes(args) + def do_sizes(args): """Compute and print sizes of firmware.""" ports = parse_port_list(args) - print('COMPUTING SIZES') + print("COMPUTING SIZES") for port in ports: - syscmd('size', 'ports/{}/{}'.format(port.dir, port.output)) + syscmd("size", "ports/{}/{}".format(port.dir, port.output)) + def main(): # Get command to execute if len(sys.argv) == 1: - print('Available commands:') + print("Available commands:") for cmd in globals(): - if cmd.startswith('do_'): - print(' {:9} {}'.format(cmd[3:], globals()[cmd].__doc__)) + if cmd.startswith("do_"): + print(" {:9} {}".format(cmd[3:], globals()[cmd].__doc__)) sys.exit(1) cmd = sys.argv.pop(1) # Dispatch to desired command try: - cmd = globals()['do_{}'.format(cmd)] + cmd = globals()["do_{}".format(cmd)] except KeyError: print("{}: unknown command '{}'".format(sys.argv[0], cmd)) sys.exit(1) cmd(sys.argv[1:]) -if __name__ == '__main__': + +if __name__ == "__main__": main() |