Source code for qpdk.samples.all_cells
"""Component that instantiates and displays all available cells in the PDK.
This module provides a component that creates an efficient layout containing all cells
available in qpdk.PDK.cells. This is useful for:
- Quick visualization of all available components
- Running cell-level DRC checks on all cells simultaneously
- Documentation and reference purposes
"""
from __future__ import annotations
import inspect
import warnings
import gdsfactory as gf
from gdsfactory.component import Component
[docs]
@gf.cell
def all_cells(
spacing: float = 200.0,
**kwargs,
) -> Component:
"""Create a component containing all cells from qpdk.PDK.cells.
Instantiates and arranges all available cells efficiently. Cells that
fail to instantiate are skipped with a warning message.
Args:
spacing: Spacing between cells in micrometers (default: 200.0).
**kwargs: Additional arguments passed to gf.pack.
Returns:
Component containing all successfully instantiated cells.
Example:
>>> import qpdk
>>> c = qpdk.cells.all_cells()
>>> c.show() # Display all cells in KLayout
"""
from qpdk import PDK
# Get all cell names, excluding all_cells itself to avoid recursion
cell_names = sorted([name for name in PDK.cells if name != "all_cells"])
cells = []
for name in cell_names:
cell_func = PDK.cells[name]
sig = inspect.signature(cell_func)
required_params = [
p
for p in sig.parameters.values()
if p.default == inspect.Parameter.empty and p.name != "kwargs"
]
if required_params:
warnings.warn(
f"Skipping cell '{name}': requires arguments {[p.name for p in required_params]}",
UserWarning,
stacklevel=2,
)
continue
try:
cell = cell_func()
if cell is None:
continue
if not isinstance(cell, gf.Component):
c_wrap = gf.Component(name=f"{name}_wrap")
c_wrap.add_ref_off_grid(cell)
cell = c_wrap
cells.append(cell)
except Exception as e:
warnings.warn(
f"Failed to instantiate cell '{name}': {e}",
UserWarning,
stacklevel=2,
)
if not cells:
return Component("empty_all_cells")
kwargs.setdefault("max_size", (None, None))
bins = gf.pack(cells, spacing=spacing, **kwargs)
if not bins:
return Component("empty_packed_all_cells")
if len(bins) > 1:
warnings.warn(
f"Packed cells resulted in {len(bins)} bins. Returning only the first one.",
UserWarning,
stacklevel=2,
)
c = bins[0]
c.name = "all_cells"
return c
__all__ = ["all_cells"]
if __name__ == "__main__":
from qpdk import PDK
PDK.activate()
c = all_cells()
c.show()