Merge pull request #102 from mithro/liberty-ccsnoise-try2
scripts/liberty: Second attempt at filtering all ccsnoise data.
diff --git a/scripts/python-skywater-pdk/skywater_pdk/liberty.py b/scripts/python-skywater-pdk/skywater_pdk/liberty.py
index b7d61b1..c2c8de7 100755
--- a/scripts/python-skywater-pdk/skywater_pdk/liberty.py
+++ b/scripts/python-skywater-pdk/skywater_pdk/liberty.py
@@ -257,46 +257,54 @@
return libname0, corners, all_cells
-def remove_ccsnoise(data, cellname):
- for k, v in list(data.items()):
+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:
- del data[k]
- continue
+ ccsn_keys.add(k)
- if not k.startswith("pin "):
- continue
+ for k in ccsn_keys:
+ if debug:
+ print("{:s}: Removing {}".format(dataname, k))
+ del data[k]
- 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)
+def remove_ccsnoise_from_cell(data, cellname):
+ remove_ccsnoise_from_dict(data, cellname)
- for pk in ccsn_keys:
- if debug:
- print("{:20s} - {:15s}: Removing {}".format(cellname, k, pk))
- del pin_data[pk]
+ for k, v in list(data.items()):
+ if k.startswith("pin "):
+ pin_data = data[k]
+ if "input_voltage" in pin_data:
+ del pin_data["input_voltage"]
- if "timing" not in pin_data:
- continue
- pin_timing = pin_data["timing"]
+ remove_ccsnoise_from_dict(pin_data, "{}.{}".format(cellname, k))
- for i,t in enumerate(pin_timing):
- ccsn_keys = set()
- for tk in t:
- if not tk.startswith("ccsn_"):
- continue
- ccsn_keys.add(tk)
+ if k.startswith("bus"):
+ bus_data = data[k]
+ remove_ccsnoise_from_dict(bus_data, "{}.{}".format(cellname, k))
- 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 +341,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 +357,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]))