blob: 602833edf8d689a25965206c774fab598d169b24 [file] [log] [blame]
"""
Utilities for fuzzing cell timing
"""
from fuzzconfig import FuzzConfig
import fuzzloops
import cell_timings
import timing_dbs
from os import path
def timing_configs(job, design, density="45"):
# speedgrade, fuzzconfig
return [
("6", FuzzConfig(job + "_6", "ECP5", "LFE5U-{}F".format(density), [], design, "-s 6")),
("7", FuzzConfig(job + "_7", "ECP5", "LFE5U-{}F".format(density), [], design, "-s 7")),
("8", FuzzConfig(job + "_8", "ECP5", "LFE5U-{}F".format(density), [], design, "-s 8")),
("8_5G", FuzzConfig(job + "_8_5G", "ECP5", "LFE5UM5G-{}F".format(density), [], design, "-s 8"))
]
def build_and_add(designs, density="45", inc_cell=cell_timings.include_cell, rw_cell_func=cell_timings.rewrite_celltype,
rw_pin_func=cell_timings.rewrite_pin):
jobs = []
sdfs = dict()
for des in designs:
jobs += timing_configs(path.basename(des).replace(".v", ""), des, density)
for job in jobs:
grade, cfg = job
sdfs[grade] = []
def per_job(job):
grade, cfg = job
cfg.setup(skip_specimen=True)
bitf = cfg.build_design(cfg.ncl, {}, backanno=True, substitute=False)
sdf = bitf.replace(".bit", ".sdf")
sdfs[grade].append(sdf)
fuzzloops.parallel_foreach(jobs, per_job)
for grade in sdfs.keys():
db = timing_dbs.cells_db_path("ECP5", grade)
for sdf in sdfs[grade]:
cell_timings.add_sdf_to_database(db, sdf, include_cell_predicate=inc_cell, rewrite_cell_func=rw_cell_func,
rewrite_pin_func=rw_pin_func)