Skip to content

Commit

Permalink
Fix "Reload Libraries macro issues" (#95)
Browse files Browse the repository at this point in the history
Reload Libraries macro issues resolved

* Non-KQC elements placed on the layout no longer cause errors

* Better error handling, for example if there are compilation errors in the KQC code
  • Loading branch information
PietroCampana authored Jun 10, 2024
1 parent 096ef44 commit 609d0ab
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 10 deletions.
17 changes: 10 additions & 7 deletions klayout_package/python/kqcircuits/util/layout_to_code.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,31 +358,34 @@ def get_node_params(node: Node):


def extract_pcell_data_from_views():
"""Remove all PCells and return their data.
"""Iterate over all KQCircuits PCells and return their data and instances.
Returns: A list of lists. Each element corresponds to a view in KLayout and it is a list of
``(type, location, parameters)`` tuples. These tuples completely describe the type, position and
parameters of a single PCell in the "Top Cell" of this view.
Returns: a tuple (views, instances) where
views: a list of lists. Each element corresponds to a view in KLayout and it is a list of
``(type, location, parameters)`` tuples. These tuples completely describe the type, position
and parameters of a single PCell in the "Top Cell" of this view.
instances: flattened list of all instances of KQCircuits PCells found.
"""

views = []
instances = []
main_window = pya.Application.instance().main_window()
for vid in range(main_window.views()):
top_cell = main_window.view(vid).active_cellview().cell
pcells = []
for inst in top_cell.each_inst():
pc = inst.pcell_declaration()
if pc:
if isinstance(pc, Element):
instances.append(inst)
params = inst.pcell_parameters_by_name()
def_params = pc.__class__.get_schema()
for k, v in def_params.items():
if params[k] == v.default:
del params[k]
pcells.append((pc.__class__, inst.dtrans, params))
inst.delete()
views.append(pcells)

return views
return views, instances


def restore_pcells_to_views(views):
Expand Down
4 changes: 3 additions & 1 deletion klayout_package/python/kqcircuits/util/library_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ def load_libraries(flush=False, path=""):
Returns:
A dictionary of libraries that have been loaded, keys are library names and values are libraries.
"""
# Try reloading all pcells before deleting libraries, otherwise classes are lost in case of errors
all_pcell_classes = _get_all_pcell_classes(flush, path)

if flush:
delete_all_libraries()
Expand All @@ -95,7 +97,7 @@ def load_libraries(flush=False, path=""):
if lib_path == path:
return {key: value[0] for key, value in _kqc_libraries.items()}

for cls in _get_all_pcell_classes(flush, path):
for cls in all_pcell_classes:

library_name = cls.LIBRARY_NAME
library_path = cls.LIBRARY_PATH
Expand Down
11 changes: 9 additions & 2 deletions klayout_package/python/scripts/macros/0system/0reload.lym
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,15 @@ Note that this does not reload the ``defaults`` file.
from kqcircuits.util.library_helper import load_libraries
from kqcircuits.util.layout_to_code import extract_pcell_data_from_views, restore_pcells_to_views

views = extract_pcell_data_from_views()
load_libraries(flush=True)
views, instances = extract_pcell_data_from_views()
for inst in instances:
inst.delete()
try:
load_libraries(flush=True)
except Exception as e:
restore_pcells_to_views(views)
raise RuntimeError("Failed to reload KQCircuits libraries and redraw cells." +
f"\nThe following exception was raised: \n{type(e).__name__}: {e}")
restore_pcells_to_views(views)
</text>
</klayout-macro>

0 comments on commit 609d0ab

Please sign in to comment.