pmd-sky/tools/sync_pmdsky_debug/count_documented_symbols.py
2024-06-09 01:48:22 -04:00

59 lines
2.3 KiB
Python

import re
from typing import Dict
from xmap_reader import read_xmap_symbols
UNDOCUMENTED_SYMBOL_MATCHER = re.compile(r'_[0-9A-F]{8}$')
xmap_symbols = read_xmap_symbols()
def get_fraction_and_percent(documented_count, total_count):
return f'{documented_count}/{total_count} ({documented_count / total_count:.4%})'
class SymbolCount:
num_documented_data_symbols: int = 0
total_data_symbols: int = 0
num_documented_symbols: int = 0
total_symbols: int = 0
def print_counts(self):
if self.total_data_symbols != self.total_symbols:
print(f'Total: {get_fraction_and_percent(self.num_documented_symbols, self.total_symbols)}')
print(f'Functions: {get_fraction_and_percent(self.num_documented_symbols - self.num_documented_data_symbols, self.total_symbols - self.total_data_symbols)}')
print(f'Data: {get_fraction_and_percent(self.num_documented_data_symbols, self.total_data_symbols)}')
print()
symbol_counts: Dict[str, SymbolCount] = {}
for overlay, symbols in xmap_symbols['us'].items():
if overlay == 'ram':
continue
symbol_count = SymbolCount()
symbol_counts[overlay] = symbol_count
symbol_count.total_symbols = len(symbols)
for symbol in symbols.values():
if not UNDOCUMENTED_SYMBOL_MATCHER.search(symbol.name) and 'UNKNOWN' not in symbol.name:
symbol_count.num_documented_symbols += 1
if symbol.is_data:
symbol_count.num_documented_data_symbols += 1
if symbol.is_data:
symbol_count.total_data_symbols += 1
if symbol_count.total_symbols > 0:
if overlay == 'main':
overlay = 'ARM9'
elif overlay == 'arm7':
overlay = 'ARM7'
else:
overlay = f'Overlay {overlay}'
print(overlay)
symbol_count.print_counts()
all_symbol_count = SymbolCount()
all_symbol_count.num_documented_data_symbols = sum([count.num_documented_data_symbols for count in symbol_counts.values()])
all_symbol_count.num_documented_symbols = sum([count.num_documented_symbols for count in symbol_counts.values()])
all_symbol_count.total_data_symbols = sum([count.total_data_symbols for count in symbol_counts.values()])
all_symbol_count.total_symbols = sum([count.total_symbols for count in symbol_counts.values()])
all_symbol_count.print_counts()