Merge pull request #102 from mithro/liberty-ccsnoise-try2

scripts/liberty: Second attempt at filtering all ccsnoise data.
This commit is contained in:
Tim Ansell 2020-07-15 07:03:42 -07:00 committed by GitHub
commit c6b5b6e5c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 41 additions and 33 deletions

View File

@ -257,46 +257,54 @@ def collect(library_dir) -> Tuple[Dict[str, TimingType], List[str]]:
return libname0, corners, all_cells return libname0, corners, all_cells
def remove_ccsnoise(data, cellname): def remove_ccsnoise_from_timing(data, dataname):
for k, v in list(data.items()): assert "timing" in data, (dataname, data.keys(), data)
timing = data["timing"]
if isinstance(timing, list):
for i, t in enumerate(timing):
assert isinstance(t, dict), (dataname, i, t)
remove_ccsnoise_from_dict(t, "{}.timing[{:3d}]".format(dataname, i))
elif isinstance(timing, dict):
remove_ccsnoise_from_dict(timing, dataname+".timing")
else:
assert False, (dataname, type(timing), timing)
def remove_ccsnoise_from_dict(data, dataname):
if "timing" in data:
remove_ccsnoise_from_timing(data, dataname)
ccsn_keys = set()
for k in data:
if "ccsn_" in k: if "ccsn_" in k:
ccsn_keys.add(k)
for k in ccsn_keys:
if debug:
print("{:s}: Removing {}".format(dataname, k))
del data[k] del data[k]
continue
if not k.startswith("pin "):
continue
def remove_ccsnoise_from_cell(data, cellname):
remove_ccsnoise_from_dict(data, cellname)
for k, v in list(data.items()):
if k.startswith("pin "):
pin_data = data[k] pin_data = data[k]
if "input_voltage" in pin_data: if "input_voltage" in pin_data:
del pin_data["input_voltage"] del pin_data["input_voltage"]
ccsn_keys = set() remove_ccsnoise_from_dict(pin_data, "{}.{}".format(cellname, k))
for pk in pin_data:
if not pk.startswith("ccsn_"):
continue
ccsn_keys.add(pk)
for pk in ccsn_keys: if k.startswith("bus"):
if debug: bus_data = data[k]
print("{:20s} - {:15s}: Removing {}".format(cellname, k, pk)) remove_ccsnoise_from_dict(bus_data, "{}.{}".format(cellname, k))
del pin_data[pk]
if "timing" not in pin_data:
continue
pin_timing = pin_data["timing"]
for i,t in enumerate(pin_timing): remove_ccsnoise_from_library = remove_ccsnoise_from_dict
ccsn_keys = set()
for tk in t:
if not tk.startswith("ccsn_"):
continue
ccsn_keys.add(tk)
for tk in ccsn_keys:
if debug:
print("{:20s} - {:15s}.timing[{:3d}]: Removing {}".format(cellname, k, i, tk))
del t[tk]
def generate(library_dir, lib, corner, ocorner_type, icorner_type, cells): def generate(library_dir, lib, corner, ocorner_type, icorner_type, cells):
@ -333,7 +341,7 @@ def generate(library_dir, lib, corner, ocorner_type, icorner_type, cells):
# Remove the ccsnoise if it exists # Remove the ccsnoise if it exists
if ocorner_type != TimingType.ccsnoise: if ocorner_type != TimingType.ccsnoise:
remove_ccsnoise(common_data, "library") remove_ccsnoise_from_library(common_data, "library")
output = liberty_dict("library", lib+"__"+corner, common_data) output = liberty_dict("library", lib+"__"+corner, common_data)
assert output[-1] == '}', output assert output[-1] == '}', output
@ -349,7 +357,7 @@ def generate(library_dir, lib, corner, ocorner_type, icorner_type, cells):
# Remove the ccsnoise if it exists # Remove the ccsnoise if it exists
if ocorner_type != TimingType.ccsnoise: if ocorner_type != TimingType.ccsnoise:
remove_ccsnoise(cell_data, cell_with_size) remove_ccsnoise_from_cell(cell_data, cell_with_size)
top_write(['']) top_write([''])
top_write(liberty_dict("cell", "%s__%s" % (lib, cell_with_size), cell_data, [cell_with_size])) top_write(liberty_dict("cell", "%s__%s" % (lib, cell_with_size), cell_data, [cell_with_size]))