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 a grid 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 gdsfactory as gf
from gdsfactory.component import Component
[docs]
@gf.cell
def all_cells(
spacing: float = 200.0,
cells_per_row: int = 5,
) -> Component:
"""Create a component containing all cells from qpdk.PDK.cells.
Instantiates and arranges all available cells in a grid layout. Cells that
fail to instantiate are skipped with a warning message.
Args:
spacing: Spacing between cells in micrometers (default: 200.0).
cells_per_row: Number of cells to place per row (default: 5).
Returns:
Component containing all successfully instantiated cells arranged in a grid.
Example:
>>> import qpdk
>>> c = qpdk.cells.all_cells()
>>> c.show() # Display all cells in KLayout
"""
from qpdk import PDK
c = Component()
# Get all cell names, excluding all_cells itself to avoid recursion
cell_names = sorted([name for name in PDK.cells if name != "all_cells"])
# Grid layout parameters
x_pos = 0.0
y_pos = 0.0
row_height = 0.0
cells_in_current_row = 0
for name in cell_names:
# Check if cell requires arguments before attempting instantiation
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:
# Skip cells that require arguments - these are helper functions
# not meant to be instantiated standalone
import warnings
warnings.warn(
f"Skipping cell '{name}': requires arguments {[p.name for p in required_params]}",
UserWarning,
stacklevel=2,
)
continue
try:
# Instantiate the cell
cell = cell_func()
# Add reference based on cell type
if isinstance(cell, gf.Component):
ref = c.add_ref(cell)
else: # ComponentAllAngle or other types
ref = c.add_ref_off_grid(cell)
# Position the reference
ref.dmovex(x_pos)
ref.dmovey(y_pos)
# Get bounding box for spacing calculations
bbox = ref.dbbox()
width = bbox.width()
height = bbox.height()
# Update row height to accommodate tallest cell in row
row_height = max(row_height, height)
# Move to next position
cells_in_current_row += 1
if cells_in_current_row >= cells_per_row:
# Start new row
x_pos = 0.0
y_pos += row_height + spacing
row_height = 0.0
cells_in_current_row = 0
else:
# Move to next column
x_pos += width + spacing
except Exception as e:
# Log warning for cells that fail to instantiate for other reasons
import warnings
warnings.warn(
f"Failed to instantiate cell '{name}': {e}",
UserWarning,
stacklevel=2,
)
return c
__all__ = ["all_cells"]
if __name__ == "__main__":
from qpdk import PDK
PDK.activate()
c = all_cells()
c.show()