scripts/liberty: Second attempt at filtering all ccsnoise data.
Fixes #77. Signed-off-by: Tim 'mithro' Ansell <me@mith.ro>
This commit is contained in:
parent
20971447cb
commit
463f2fd6aa
|
@ -257,46 +257,52 @@ def collect(library_dir) -> Tuple[Dict[str, TimingType], List[str]]:
|
|||
return libname0, corners, all_cells
|
||||
|
||||
|
||||
def remove_ccsnoise(data, cellname):
|
||||
for k, v in list(data.items()):
|
||||
if "ccsn_" in k:
|
||||
del data[k]
|
||||
continue
|
||||
def remove_ccsnoise_from_timing(data, dataname):
|
||||
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:
|
||||
ccsn_keys.add(k)
|
||||
|
||||
for k in ccsn_keys:
|
||||
if debug:
|
||||
print("{:s}: Removing {}".format(dataname, k))
|
||||
del data[k]
|
||||
|
||||
|
||||
|
||||
def remove_ccsnoise_from_cell(data, cellname):
|
||||
remove_ccsnoise_from_dict(data, cellname)
|
||||
|
||||
for k, v in list(data.items()):
|
||||
if not k.startswith("pin "):
|
||||
continue
|
||||
|
||||
pin_data = data[k]
|
||||
|
||||
if "input_voltage" in pin_data:
|
||||
del pin_data["input_voltage"]
|
||||
|
||||
ccsn_keys = set()
|
||||
for pk in pin_data:
|
||||
if not pk.startswith("ccsn_"):
|
||||
continue
|
||||
ccsn_keys.add(pk)
|
||||
remove_ccsnoise_from_dict(pin_data, "{}.{}".format(cellname, k))
|
||||
|
||||
for pk in ccsn_keys:
|
||||
if debug:
|
||||
print("{:20s} - {:15s}: Removing {}".format(cellname, k, pk))
|
||||
del pin_data[pk]
|
||||
|
||||
if "timing" not in pin_data:
|
||||
continue
|
||||
pin_timing = pin_data["timing"]
|
||||
|
||||
for i,t in enumerate(pin_timing):
|
||||
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]
|
||||
remove_ccsnoise_from_library = remove_ccsnoise_from_dict
|
||||
|
||||
|
||||
def generate(library_dir, lib, corner, ocorner_type, icorner_type, cells):
|
||||
|
@ -333,7 +339,7 @@ def generate(library_dir, lib, corner, ocorner_type, icorner_type, cells):
|
|||
|
||||
# Remove the ccsnoise if it exists
|
||||
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)
|
||||
assert output[-1] == '}', output
|
||||
|
@ -349,7 +355,7 @@ def generate(library_dir, lib, corner, ocorner_type, icorner_type, cells):
|
|||
|
||||
# Remove the ccsnoise if it exists
|
||||
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(liberty_dict("cell", "%s__%s" % (lib, cell_with_size), cell_data, [cell_with_size]))
|
||||
|
|
Loading…
Reference in New Issue