
Добавил:
deadpigeon
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:lab7 / lab7
.pyimport re
import argparse
import sys
def extract_antenna_violators(output, report):
"""
Usage: extract_antenna_violators.py -o <output text file> <input ARC report>
Extracts the list of violating nets from an ARC report file"
"""
pin_pattern = re.compile(r"\s*([\S+]+)\s*\([\S+]+\)\s*\s*")
layout_pattern = re.compile(r"\s*\b(met3|met2|met1|li1|M2M3_PR|M1M2_PR|L1M1_PR_MR)\b\s*")
msr_pattern = re.compile(r"\s*(\w+):\s*(\S+)\s*Ratio:\s*(\S+)\s*\((Area|S.Area|C.Area|C.S.Area)\)\s*")
vios_list = []
current_pin = ""
current_layout = ""
current_values = ""
printed = False
with open(report, "r") as f:
for line in f:
pin = pin_pattern.match(line)
layout = layout_pattern.match(line)
values = msr_pattern.match(line)
if pin is not None:
current_pin = pin.group(1)
printed = False
if layout is not None:
current_layout = layout.group(1)
printed = False
if values is not None:
current_values = values.group(2)
current_values = re.sub(r'[^\d.]', '', current_values)
current_values = float(current_values)
normal_values = float(values.group(3))
printed = False
if "*" in line and not printed:
print(f"{current_pin}:{current_layout} {current_values / normal_values:.2f}")
vios_list.append(f"{current_pin}:{current_layout} {current_values / normal_values:.2f}")
printed = True
with open(output, "w") as f:
f.write("\n".join(vios_list))
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="lab7")
parser.add_argument('-o', '--output', type=str, help='Ключ для сохранения значения в переменную')
parser.add_argument('report', type=str, help='Файл с отчетом о запуске')
args = parser.parse_args()
if len(args.__dict__) != 2:
print('Неверное число аргументов')
sys.exit(1)
if args.report:
report = args.report
else:
print('Неверное имя файла с отчетом')
sys.exit(1)
if args.output:
output = args.output
else:
print('Неверное имя выходного файла')
sys.exit(1)
extract_antenna_violators(output, report)
sys.exit(0)