diff --git a/tools/progress.py b/tools/progress.py new file mode 100644 index 0000000000..8364bb5b3a --- /dev/null +++ b/tools/progress.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +import os, struct, sys, ast, argparse + +def read_all_lines(file_name): + lines = list() + try: + with open(file_name) as f: + lines = f.readlines() + except IOError: + print('failed to read file ' + file_name) + sys.exit(1) + + return lines + +if __name__ == "__main__": + map_lines = read_all_lines('build/mm.map') + + current_section = '' + in_section_list = False + asm_amounts = dict() + src_amounts = dict() + src_files = dict() + for line in map_lines: + if in_section_list: + if line.startswith('OUTPUT(build/code.elf elf32-tradbigmips)'): + break + + line_split = list(filter(None, line.split())) + + if (len(line_split) > 0 and not line.startswith(' ')): + current_section = line_split[0] + src_amounts[current_section] = 0 + asm_amounts[current_section] = 0 + src_files[current_section] = [] + + if (len(line_split) == 4 and line_split[0].startswith(".")): + section = line_split[0] + size = int(line_split[2], 16) + obj_file = line_split[3] + + if (section == ".text" and not current_section + '_data' in obj_file and not current_section + '_todata' in obj_file): + if (obj_file.startswith("build/src")): + src_amounts[current_section] += size + formatted_name = obj_file[len('build/'):] # remove build/ prefix + formatted_name = formatted_name[:-1] + 'c' # replace .o preface with .c + src_files[current_section].append(formatted_name) + elif (obj_file.startswith("build/asm")): + asm_amounts[current_section] += size + else: + in_section_list = line.startswith('Linker script and memory map') + + for section in src_files: + for file in src_files[section]: + file_lines = read_all_lines(file) + for line in file_lines: + if line.startswith('GLOBAL_ASM'): + line_split = list(filter(None, line.split('\"'))) + asm_lines = read_all_lines(line_split[1]) + for asm_line in asm_lines: + if asm_line.startswith('/*'): + asm_amounts[section] += 4 + src_amounts[section] -= 4 + + src = 0 + asm = 0 + for section in src_amounts: + src += src_amounts[section] + for section in asm_amounts: + asm += asm_amounts[section] + + total = src + asm + src_percent = 100 * src / total + asm_percent = 100 * asm / total + + print('{} total bytes of decompilable code\n'.format(total)) + print('{} bytes of code in src {}%'.format(src, src_percent)) + print('{} bytes of code in asm {}%\n'.format(asm, asm_percent)) + print("------------------------------------\n") + + num_masks = 24 + max_rupees = 500 + bytes_per_mask = total / num_masks + bytes_per_rupee = bytes_per_mask / max_rupees + masks = int(src / bytes_per_mask) + rupees = int((src % bytes_per_mask) / bytes_per_rupee) + + if (rupees > 0): + print('You have {}/{} masks and {}/{} rupee(s).\n'.format(masks, num_masks, rupees, max_rupees)); + else: + print('You have {}/{} masks .\n'.format(masks, num_masks)); +