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

1"""Component that instantiates and displays all available cells in the PDK. 

2 

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""" 

9 

10from __future__ import annotations 

11 

12import inspect 

13import warnings 

14 

15import gdsfactory as gf 

16from gdsfactory.component import Component 

17 

18 

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. 

25 

26 Instantiates and arranges all available cells efficiently. Cells that 

27 fail to instantiate are skipped with a warning message. 

28 

29 Args: 

30 spacing: Spacing between cells in micrometers (default: 200.0). 

31 **kwargs: Additional arguments passed to gf.pack. 

32 

33 Returns: 

34 Component containing all successfully instantiated cells. 

35 

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 

42 

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"]) 

45 

46 cells = [] 

47 

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 ] 

56 

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 

64 

65 try: 

66 cell = cell_func() 

67 if cell is None: 

68 continue 

69 

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 

74 

75 cells.append(cell) 

76 

77 except Exception as e: 

78 warnings.warn( 

79 f"Failed to instantiate cell '{name}': {e}", 

80 UserWarning, 

81 stacklevel=2, 

82 ) 

83 

84 if not cells: 

85 return Component("empty_all_cells") 

86 

87 kwargs.setdefault("max_size", (None, None)) 

88 bins = gf.pack(cells, spacing=spacing, **kwargs) 

89 

90 if not bins: 

91 return Component("empty_packed_all_cells") 

92 

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 ) 

99 

100 c = bins[0] 

101 c.name = "all_cells" 

102 return c 

103 

104 

105__all__ = ["all_cells"] 

106 

107if __name__ == "__main__": 

108 from qpdk import PDK 

109 

110 PDK.activate() 

111 c = all_cells() 

112 c.show()