import re # Разбирает инструкции текстового дизассемблера TI C2000. import sys # Получает путь к проверяемому листингу OUT. from pathlib import Path # Читает сохранённый результат dis2000. text = Path(sys.argv[1]).read_text(encoding="utf-8-sig") # Использует UTF-8-вывод дизассемблера. for name in ("Seeprom_read", "Seeprom_write"): # Проверяет оба пути публикации задания Timer2. match = re.search(r"^\w+\s+_" + name + r":$", text, re.M) # Находит начало настоящей функции в готовом OUT. assert match, "Missing function: " + name # Не допускает успешной проверки неполного листинга. body = text[match.end():] # Отделяет инструкции от заголовка функции. end = re.search(r"^\w+\s+_\w+:$", body, re.M) # Ограничивает анализ следующим именованным символом. body = body[:end.start()] if end else body # Не учитывает записи из другой функции. request = re.search(r"\bOR\s+\*\+XAR\d\[2\], #0x000[12]", body) # Находит установку запроса чтения 2 или записи 1 в csr. assert request, "Missing request publication: " + name # Требует известную форму TI O3, иначе проверку нужно пересмотреть. stores = re.findall(r"\bMOVL\s+\*\+XAR(\d)\[(0|2|4)\],", body[:request.start()]) # Собирает только записи, выполненные до публикации запроса. groups = {} # Группирует смещения полей по базовому регистру дескриптора. for register, offset in stores: # Обрабатывает каждую инструкцию записи 32-битного поля. groups.setdefault(register, set()).add(int(offset)) # Отмечает указатель 0, длину 2 и адрес 4 в словах C28x. assert any({0, 2, 4} <= offsets for offsets in groups.values()), "Descriptor stores follow request/wait: " + name # Отвергает установленный дефект с отложенными до выхода из ожидания параметрами. print("PASS TI O3 publication: " + name) # Подтверждает порядок инструкций конкретной функции в данном OUT.