Skip to content

Commit 5e4c276

Browse files
committed
Adding post run analysis
1 parent 459bdcc commit 5e4c276

1 file changed

Lines changed: 69 additions & 18 deletions

File tree

examples/baremetal/make.py

Lines changed: 69 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import argparse
22
import subprocess
33
import os
4+
import shutil
45
import sys
6+
import json
7+
import csv
58
from pathlib import Path
69
from jinja2 import Environment, FileSystemLoader
710
from logikbench import *
@@ -23,12 +26,12 @@
2326
2427
""", formatter_class=argparse.RawDescriptionHelpFormatter)
2528

26-
parser.add_argument("-group",
29+
parser.add_argument("-group","-g",
2730
nargs='+',
2831
choices=['basic', 'memory', 'arithmetic', 'epfl', 'block'],
2932
required=True,
3033
help="Benchmark group")
31-
parser.add_argument("-name",
34+
parser.add_argument("-name","-n",
3235
nargs='+',
3336
help="Benchmark name")
3437
parser.add_argument("-tool",
@@ -38,6 +41,12 @@
3841
parser.add_argument("-target",
3942
required=True,
4043
help="Compilation target")
44+
parser.add_argument('-clean','-c',
45+
action='store_true',
46+
help='Clean up build directory')
47+
parser.add_argument('-output','-o',
48+
default="build/results.json",
49+
help='Output file name')
4150

4251
args = parser.parse_args()
4352

@@ -49,6 +58,10 @@
4958
env = Environment(loader=FileSystemLoader('.'))
5059
template = env.get_template(f'{args.tool}_template.j2')
5160

61+
# global analysis
62+
results = {}
63+
results["cells"] = {}
64+
5265
# iterate over all groups
5366
for group in args.group:
5467
group_path = rootdir / "logikbench" / group
@@ -66,19 +79,25 @@
6679
script = f"{name}.tcl"
6780
cmd = ['vivado', '-mode batch', '-source', script]
6881

82+
# clean up old run
83+
if args.clean: # create run dir.clean:
84+
shutil.rmtree(f"build/{group}/{name}")
85+
6986
# create run dir
7087
os.makedirs(f"build/{group}/{name}", exist_ok=True)
7188
os.chdir(f"build/{group}/{name}")
7289

73-
# get top module (not always equal to module name)
90+
# instance of benchmark class
7491
mod = sys.modules[f"logikbench.{group}.{name}.{name}"]
75-
cls = getattr(mod, name.capitalize())
76-
d = cls()
77-
topmodule = d.get_topmodule(fileset='rtl')
92+
bobj = getattr(mod, name.capitalize())
93+
b = bobj()
7894

79-
# write out fileset locally
95+
# get top module
96+
topmodule = b.get_topmodule(fileset='rtl')
97+
98+
# write out design fileset
8099
cmdfile = f"{name}.f"
81-
d.write_fileset(cmdfile, fileset='rtl')
100+
b.write_fileset(cmdfile, fileset='rtl')
82101

83102
# create tool script
84103
context = {
@@ -92,16 +111,48 @@
92111
f.write(output)
93112

94113
# run benchmark
95-
try:
96-
print(f"Running {name} benchmark ({group}). Logfile: build/{group}/{name}/{name}.log")
97-
with open(f'{name}.log', "w") as log:
98-
result = subprocess.run(cmd,
99-
stdout=log,
100-
stderr=subprocess.STDOUT,
101-
check=True)
102-
103-
except subprocess.CalledProcessError as e:
104-
print(f"Error...see logfile!!")
114+
if os.path.exists(f"{name}_stats.json"):
115+
print(f"Found previous results, skipping {name} benchmark ({group}).")
116+
else:
117+
try:
118+
print(f"Running {name} benchmark ({group}). Logfile: build/{group}/{name}/{name}.log")
119+
with open(f'{name}.log', "w") as log:
120+
result = subprocess.run(cmd,
121+
stdout=log,
122+
stderr=subprocess.STDOUT,
123+
check=True)
124+
125+
except subprocess.CalledProcessError as e:
126+
print(f"Error...see logfile!!")
127+
128+
# collect results
129+
if args.tool == 'yosys':
130+
with open(f"{name}_stats.json") as f:
131+
data = json.load(f)
132+
results["cells"][name] = data["design"]["num_cells"]
105133

106134
# go back home
107135
os.chdir(scriptdir)
136+
137+
138+
# writing results to file
139+
_, ext = os.path.splitext(args.output)
140+
if ext == ".json":
141+
with open(args.output, "w") as f:
142+
json.dump(results, f, indent=2)
143+
elif ext == ".csv":
144+
all_rows = set()
145+
for col in results.values():
146+
all_rows.update(col.keys())
147+
all_rows = sorted(all_rows)
148+
columns = sorted(results.keys())
149+
with open(args.output, "w", newline="") as f:
150+
writer = csv.writer(f)
151+
# Write header
152+
writer.writerow([""] + columns)
153+
# Write each row
154+
for row_key in all_rows:
155+
row = [row_key]
156+
for col_key in columns:
157+
row.append(results.get(col_key, {}).get(row_key, ""))
158+
writer.writerow(row)

0 commit comments

Comments
 (0)