84 lines
3.1 KiB
Python
84 lines
3.1 KiB
Python
import os
|
|
import pandas as pd
|
|
import argparse
|
|
import re
|
|
|
|
parser = argparse.ArgumentParser('')
|
|
parser.add_argument('log_file', type=str, default="./innovus_work/innovus.log")
|
|
args = parser.parse_args()
|
|
|
|
log_root = args.log_file
|
|
df = pd.DataFrame(columns=["placer", "design", "DRWL", "#DRVias", "#DRCs", "place_design_time", "DR Total Time (s)"])
|
|
|
|
|
|
with open(log_root, 'r') as f:
|
|
loglines = f.readlines()
|
|
|
|
design_lines = []
|
|
|
|
for lid, line in enumerate(loglines):
|
|
if line.startswith("=========== "):
|
|
if len(design_lines) > 0:
|
|
design_lines[-1][1] = lid
|
|
design_lines.append([lid, None])
|
|
if line.startswith("Finish all!"):
|
|
design_lines[-1][1] = lid - 1
|
|
break
|
|
|
|
print("#Designs:", len(design_lines))
|
|
|
|
for idx, (lhs, rhs) in enumerate(design_lines):
|
|
design_line = loglines[lhs:rhs]
|
|
findTotalWL, findTotalVia, findDRC = False, False, False
|
|
DrWL, numVia, numDrc = None, None, None
|
|
DrTotalTime, DrCpuTime = -1, -1
|
|
PlaceTime = -1
|
|
tmp = design_line[0].replace("=", "").strip()
|
|
placer, design_name = tmp.split("/")
|
|
for lid, line in enumerate(design_line):
|
|
if "#% Begin route_design " in line and "place_design" in design_line[lid - 1]:
|
|
PlaceTime = int(design_line[lid - 1].split()[2])
|
|
if "End route_design" in line:
|
|
DrCpuTimeStr = line.split("total cpu=")[-1].split(", ")[0]
|
|
DrTotalTimeStr = line.split("real=")[-1].split(", ")[0]
|
|
DrCpuTime = sum(x * int(float(t)) for x, t in zip([3600, 60, 1], DrCpuTimeStr.split(":"))) # seconds
|
|
DrTotalTime = sum(x * int(float(t)) for x, t in zip([3600, 60, 1], DrTotalTimeStr.split(":"))) # seconds
|
|
|
|
if line.startswith("Wire Length Statistics :"):
|
|
findTotalWL = True
|
|
if findTotalWL and "| Total |" in line:
|
|
findTotalWL = False
|
|
line = line.replace("| Total |", "")
|
|
line = line.replace("|", "")
|
|
line = line.replace("um", "")
|
|
DrWL = float(line.strip())
|
|
|
|
if line.startswith("Via Count Statistics :"):
|
|
findTotalVia = True
|
|
if findTotalVia and "| Total |" in line:
|
|
findTotalVia = False
|
|
line = line.replace("| Total |", "")
|
|
line = line.replace("|", "")
|
|
numVia = int(line.strip())
|
|
|
|
if "Violation Summary By Layer and Type" in line:
|
|
findDRC = True
|
|
if findDRC and line.strip().startswith("Totals"):
|
|
findDRC = False
|
|
line = line.replace("Totals", "").strip()
|
|
items = [int(i) for i in line.split(" ") if len(i) > 0]
|
|
numDrc = items[-1]
|
|
if "Verification Complete : 0 Viols" in line:
|
|
findDRC = False
|
|
numDrc = 0
|
|
|
|
df.loc[idx] = [placer, design_name, DrWL, numVia, numDrc, PlaceTime, DrTotalTime]
|
|
|
|
df = df.sort_values(by=['placer', 'design'])
|
|
print(df)
|
|
|
|
csv_file = log_root.replace("innovus_work", "report").replace(".log", ".csv")
|
|
if not os.path.exists(os.path.dirname(csv_file)):
|
|
os.makedirs(os.path.dirname(csv_file))
|
|
df.to_csv(csv_file)
|