scripts/liberty: Second attempt at filtering all ccsnoise data.
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 b7d61b1..54a5c7f 100755
--- a/scripts/python-skywater-pdk/skywater_pdk/liberty.py
+++ b/scripts/python-skywater-pdk/skywater_pdk/liberty.py
@@ -257,46 +257,52 @@
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 @@
# 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 @@
# 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]))