Coverage for qpdk / samples / all_cells.py: 85%
40 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-14 10:27 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-14 10:27 +0000
1"""Component that instantiates and displays all available cells in the PDK.
3This module provides a component that creates an efficient layout containing all cells
4available in qpdk.PDK.cells. This is useful for:
5- Quick visualization of all available components
6- Running cell-level DRC checks on all cells simultaneously
7- Documentation and reference purposes
8"""
10from __future__ import annotations
12import inspect
13import warnings
15import gdsfactory as gf
16from gdsfactory.component import Component
19@gf.cell
20def all_cells(
21 spacing: float = 200.0,
22 **kwargs,
23) -> Component:
24 """Create a component containing all cells from qpdk.PDK.cells.
26 Instantiates and arranges all available cells efficiently. Cells that
27 fail to instantiate are skipped with a warning message.
29 Args:
30 spacing: Spacing between cells in micrometers (default: 200.0).
31 **kwargs: Additional arguments passed to gf.pack.
33 Returns:
34 Component containing all successfully instantiated cells.
36 Example:
37 >>> import qpdk
38 >>> c = qpdk.cells.all_cells()
39 >>> c.show() # Display all cells in KLayout
40 """
41 from qpdk import PDK
43 # Get all cell names, excluding all_cells itself to avoid recursion
44 cell_names = sorted([name for name in PDK.cells if name != "all_cells"])
46 cells = []
48 for name in cell_names:
49 cell_func = PDK.cells[name]
50 sig = inspect.signature(cell_func)
51 required_params = [
52 p
53 for p in sig.parameters.values()
54 if p.default == inspect.Parameter.empty and p.name != "kwargs"
55 ]
57 if required_params:
58 warnings.warn(
59 f"Skipping cell '{name}': requires arguments {[p.name for p in required_params]}",
60 UserWarning,
61 stacklevel=2,
62 )
63 continue
65 try:
66 cell = cell_func()
67 if cell is None:
68 continue
70 if not isinstance(cell, gf.Component):
71 c_wrap = gf.Component(name=f"{name}_wrap")
72 c_wrap.add_ref_off_grid(cell)
73 cell = c_wrap
75 cells.append(cell)
77 except Exception as e:
78 warnings.warn(
79 f"Failed to instantiate cell '{name}': {e}",
80 UserWarning,
81 stacklevel=2,
82 )
84 if not cells:
85 return Component("empty_all_cells")
87 kwargs.setdefault("max_size", (None, None))
88 bins = gf.pack(cells, spacing=spacing, **kwargs)
90 if not bins:
91 return Component("empty_packed_all_cells")
93 if len(bins) > 1:
94 warnings.warn(
95 f"Packed cells resulted in {len(bins)} bins. Returning only the first one.",
96 UserWarning,
97 stacklevel=2,
98 )
100 c = bins[0]
101 c.name = "all_cells"
102 return c
105__all__ = ["all_cells"]
107if __name__ == "__main__":
108 from qpdk import PDK
110 PDK.activate()
111 c = all_cells()
112 c.show()