scripts/liberty: More aggressive ccsnoise filtering.
Fixes #77.
Signed-off-by: Tim 'mithro' Ansell <me@mith.ro>
diff --git a/scripts/python-skywater-pdk/skywater_pdk/liberty.py b/scripts/python-skywater-pdk/skywater_pdk/liberty.py
index 06d37f4..f0686f9 100755
--- a/scripts/python-skywater-pdk/skywater_pdk/liberty.py
+++ b/scripts/python-skywater-pdk/skywater_pdk/liberty.py
@@ -257,7 +257,7 @@
return libname0, corners, all_cells
-def remove_ccsnoise(data):
+def remove_ccsnoise(data, cellname):
for k, v in list(data.items()):
if "ccsn_" in k:
del data[k]
@@ -271,19 +271,32 @@
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)
+
+ 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 t in pin_timing:
+ for i,t in enumerate(pin_timing):
ccsn_keys = set()
- for k in t:
- if not k.startswith("ccsn_"):
+ for tk in t:
+ if not tk.startswith("ccsn_"):
continue
- ccsn_keys.add(k)
+ ccsn_keys.add(tk)
- for k in ccsn_keys:
- del t[k]
+ 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):
@@ -320,7 +333,7 @@
# Remove the ccsnoise if it exists
if ocorner_type != TimingType.ccsnoise:
- remove_ccsnoise(common_data)
+ remove_ccsnoise(common_data, "library")
output = liberty_dict("library", lib+"__"+corner, common_data)
assert output[-1] == '}', output
@@ -336,7 +349,7 @@
# Remove the ccsnoise if it exists
if ocorner_type != TimingType.ccsnoise:
- remove_ccsnoise(cell_data)
+ remove_ccsnoise(cell_data, cell_with_size)
top_write([''])
top_write(liberty_dict("cell", "%s__%s" % (lib, cell_with_size), cell_data, [cell_with_size]))