| """ |
| 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) |