gdsfactoryx 9.51.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. gdsfactory/__init__.py +192 -0
  2. gdsfactory/_cell.py +337 -0
  3. gdsfactory/_deprecation.py +13 -0
  4. gdsfactory/_dist_conflict.py +36 -0
  5. gdsfactory/_jax.py +344 -0
  6. gdsfactory/_kcl.py +47 -0
  7. gdsfactory/_ports.py +685 -0
  8. gdsfactory/add_padding.py +139 -0
  9. gdsfactory/add_pins.py +628 -0
  10. gdsfactory/add_ports.py +844 -0
  11. gdsfactory/boolean.py +89 -0
  12. gdsfactory/cli.py +191 -0
  13. gdsfactory/component.py +2754 -0
  14. gdsfactory/component_layout.py +181 -0
  15. gdsfactory/components/__init__.py +425 -0
  16. gdsfactory/components/_schematic.py +202 -0
  17. gdsfactory/components/analog/__init__.py +14 -0
  18. gdsfactory/components/analog/_geometry.py +156 -0
  19. gdsfactory/components/analog/inductors.py +681 -0
  20. gdsfactory/components/analog/interdigital_capacitor.py +127 -0
  21. gdsfactory/components/analog/interdigitated_electrodes.py +159 -0
  22. gdsfactory/components/analog/microstrip.py +213 -0
  23. gdsfactory/components/analog/transformers.py +1374 -0
  24. gdsfactory/components/bends/__init__.py +28 -0
  25. gdsfactory/components/bends/bend_circular.py +197 -0
  26. gdsfactory/components/bends/bend_circular_heater.py +68 -0
  27. gdsfactory/components/bends/bend_euler.py +302 -0
  28. gdsfactory/components/bends/bend_modified_hermite.py +391 -0
  29. gdsfactory/components/bends/bend_s.py +408 -0
  30. gdsfactory/components/bends/bend_topic.py +283 -0
  31. gdsfactory/components/containers/__init__.py +41 -0
  32. gdsfactory/components/containers/add_fiber_array_optical_south_electrical_north.py +137 -0
  33. gdsfactory/components/containers/add_termination.py +52 -0
  34. gdsfactory/components/containers/add_trenches.py +69 -0
  35. gdsfactory/components/containers/array_component.py +100 -0
  36. gdsfactory/components/containers/array_hexagonal.py +59 -0
  37. gdsfactory/components/containers/array_polar.py +86 -0
  38. gdsfactory/components/containers/component_sequence.py +207 -0
  39. gdsfactory/components/containers/copy_layers.py +37 -0
  40. gdsfactory/components/containers/extend_ports_list.py +46 -0
  41. gdsfactory/components/containers/extension.py +235 -0
  42. gdsfactory/components/containers/pack_doe.py +183 -0
  43. gdsfactory/components/containers/splitter_chain.py +58 -0
  44. gdsfactory/components/containers/splitter_tree.py +157 -0
  45. gdsfactory/components/couplers/__init__.py +28 -0
  46. gdsfactory/components/couplers/coupler.py +186 -0
  47. gdsfactory/components/couplers/coupler90.py +76 -0
  48. gdsfactory/components/couplers/coupler90bend.py +64 -0
  49. gdsfactory/components/couplers/coupler_adiabatic.py +127 -0
  50. gdsfactory/components/couplers/coupler_asymmetric.py +66 -0
  51. gdsfactory/components/couplers/coupler_bent.py +137 -0
  52. gdsfactory/components/couplers/coupler_broadband.py +144 -0
  53. gdsfactory/components/couplers/coupler_full.py +105 -0
  54. gdsfactory/components/couplers/coupler_pulley.py +152 -0
  55. gdsfactory/components/couplers/coupler_ring.py +108 -0
  56. gdsfactory/components/couplers/coupler_straight_asymmetric.py +44 -0
  57. gdsfactory/components/detectors/__init__.py +3 -0
  58. gdsfactory/components/detectors/detector_ge.py +83 -0
  59. gdsfactory/components/dies/__init__.py +22 -0
  60. gdsfactory/components/dies/align.py +112 -0
  61. gdsfactory/components/dies/die.py +105 -0
  62. gdsfactory/components/dies/die_frame_with_pads.py +688 -0
  63. gdsfactory/components/dies/die_with_pads.py +113 -0
  64. gdsfactory/components/dies/seal_ring.py +194 -0
  65. gdsfactory/components/dies/wafer.py +44 -0
  66. gdsfactory/components/edge_couplers/__init__.py +7 -0
  67. gdsfactory/components/edge_couplers/edge_coupler_array.py +181 -0
  68. gdsfactory/components/filters/__init__.py +25 -0
  69. gdsfactory/components/filters/awg.py +202 -0
  70. gdsfactory/components/filters/dbr.py +122 -0
  71. gdsfactory/components/filters/dbr_tapered.py +158 -0
  72. gdsfactory/components/filters/fiber.py +36 -0
  73. gdsfactory/components/filters/fiber_array.py +58 -0
  74. gdsfactory/components/filters/loop_mirror.py +39 -0
  75. gdsfactory/components/filters/mode_converter.py +102 -0
  76. gdsfactory/components/filters/polarization_splitter_rotator.py +111 -0
  77. gdsfactory/components/filters/terminator.py +53 -0
  78. gdsfactory/components/filters/terminator_spiral.py +58 -0
  79. gdsfactory/components/grating_couplers/__init__.py +29 -0
  80. gdsfactory/components/grating_couplers/csv_data/grating_coupler_1etch_h220_e70.csv +51 -0
  81. gdsfactory/components/grating_couplers/csv_data/grating_coupler_2etch_h220_e70_e220.csv +101 -0
  82. gdsfactory/components/grating_couplers/functions.py +160 -0
  83. gdsfactory/components/grating_couplers/grating_coupler_array.py +133 -0
  84. gdsfactory/components/grating_couplers/grating_coupler_dual_pol.py +148 -0
  85. gdsfactory/components/grating_couplers/grating_coupler_elliptical.py +196 -0
  86. gdsfactory/components/grating_couplers/grating_coupler_elliptical_arbitrary.py +235 -0
  87. gdsfactory/components/grating_couplers/grating_coupler_elliptical_lumerical.py +159 -0
  88. gdsfactory/components/grating_couplers/grating_coupler_elliptical_trenches.py +163 -0
  89. gdsfactory/components/grating_couplers/grating_coupler_loss.py +59 -0
  90. gdsfactory/components/grating_couplers/grating_coupler_rectangular.py +135 -0
  91. gdsfactory/components/grating_couplers/grating_coupler_rectangular_arbitrary.py +149 -0
  92. gdsfactory/components/grating_couplers/grating_coupler_tree.py +50 -0
  93. gdsfactory/components/mems/__init__.py +19 -0
  94. gdsfactory/components/mems/anchored_flexure.py +101 -0
  95. gdsfactory/components/mems/bent_beam.py +137 -0
  96. gdsfactory/components/mems/bolometer.py +194 -0
  97. gdsfactory/components/mems/cantilever.py +85 -0
  98. gdsfactory/components/mems/comb_drive.py +254 -0
  99. gdsfactory/components/mems/doubly_clamped_beam.py +101 -0
  100. gdsfactory/components/mems/folded_spring.py +163 -0
  101. gdsfactory/components/mems/gear.py +97 -0
  102. gdsfactory/components/microfluidics/__init__.py +11 -0
  103. gdsfactory/components/microfluidics/arrow_junction.py +136 -0
  104. gdsfactory/components/microfluidics/h_junction.py +132 -0
  105. gdsfactory/components/microfluidics/meander_channel.py +174 -0
  106. gdsfactory/components/microfluidics/t_junction.py +112 -0
  107. gdsfactory/components/mmis/__init__.py +18 -0
  108. gdsfactory/components/mmis/mmi.py +129 -0
  109. gdsfactory/components/mmis/mmi1x2.py +110 -0
  110. gdsfactory/components/mmis/mmi1x2_with_sbend.py +89 -0
  111. gdsfactory/components/mmis/mmi2x2.py +108 -0
  112. gdsfactory/components/mmis/mmi2x2_with_sbend.py +83 -0
  113. gdsfactory/components/mmis/mmi_90degree_hybrid.py +153 -0
  114. gdsfactory/components/mmis/mmi_tapered.py +189 -0
  115. gdsfactory/components/mzis/__init__.py +22 -0
  116. gdsfactory/components/mzis/mzi.py +339 -0
  117. gdsfactory/components/mzis/mzi_lattice.py +345 -0
  118. gdsfactory/components/mzis/mzi_pads_center.py +137 -0
  119. gdsfactory/components/mzis/mzit.py +300 -0
  120. gdsfactory/components/pads/__init__.py +24 -0
  121. gdsfactory/components/pads/bump_pad.py +173 -0
  122. gdsfactory/components/pads/pad.py +201 -0
  123. gdsfactory/components/pads/pad_gsg.py +108 -0
  124. gdsfactory/components/pads/pads_shorted.py +42 -0
  125. gdsfactory/components/pads/rectangle_with_slits.py +105 -0
  126. gdsfactory/components/pcms/__init__.py +64 -0
  127. gdsfactory/components/pcms/alignment_mark_cross.py +85 -0
  128. gdsfactory/components/pcms/cavity.py +56 -0
  129. gdsfactory/components/pcms/cdsem_all.py +101 -0
  130. gdsfactory/components/pcms/cdsem_bend180.py +74 -0
  131. gdsfactory/components/pcms/cdsem_coupler.py +58 -0
  132. gdsfactory/components/pcms/cdsem_straight.py +55 -0
  133. gdsfactory/components/pcms/cdsem_straight_density.py +51 -0
  134. gdsfactory/components/pcms/cutback_2x2.py +187 -0
  135. gdsfactory/components/pcms/cutback_bend.py +241 -0
  136. gdsfactory/components/pcms/cutback_component.py +114 -0
  137. gdsfactory/components/pcms/cutback_loss.py +173 -0
  138. gdsfactory/components/pcms/cutback_splitter.py +87 -0
  139. gdsfactory/components/pcms/greek_cross.py +165 -0
  140. gdsfactory/components/pcms/litho_calipers.py +61 -0
  141. gdsfactory/components/pcms/litho_ruler.py +39 -0
  142. gdsfactory/components/pcms/litho_steps.py +52 -0
  143. gdsfactory/components/pcms/resistance_meander.py +130 -0
  144. gdsfactory/components/pcms/resistance_sheet.py +73 -0
  145. gdsfactory/components/pcms/resolution_test_pattern.py +56 -0
  146. gdsfactory/components/pcms/ruler.py +86 -0
  147. gdsfactory/components/pcms/vernier_scale.py +74 -0
  148. gdsfactory/components/pcms/verniers.py +45 -0
  149. gdsfactory/components/pcms/version_stamp.py +111 -0
  150. gdsfactory/components/quantum/__init__.py +17 -0
  151. gdsfactory/components/quantum/coupler_capacitive.py +436 -0
  152. gdsfactory/components/quantum/flux_qubit.py +446 -0
  153. gdsfactory/components/quantum/resonator.py +415 -0
  154. gdsfactory/components/quantum/transmon.py +238 -0
  155. gdsfactory/components/rings/__init__.py +33 -0
  156. gdsfactory/components/rings/disk.py +240 -0
  157. gdsfactory/components/rings/ring.py +71 -0
  158. gdsfactory/components/rings/ring_crow.py +170 -0
  159. gdsfactory/components/rings/ring_crow_couplers.py +122 -0
  160. gdsfactory/components/rings/ring_double.py +117 -0
  161. gdsfactory/components/rings/ring_double_bend_coupler.py +76 -0
  162. gdsfactory/components/rings/ring_heater.py +209 -0
  163. gdsfactory/components/rings/ring_pn.py +347 -0
  164. gdsfactory/components/rings/ring_single.py +150 -0
  165. gdsfactory/components/rings/ring_single_array.py +59 -0
  166. gdsfactory/components/rings/ring_single_bend_coupler.py +228 -0
  167. gdsfactory/components/rings/ring_single_dut.py +93 -0
  168. gdsfactory/components/shapes/C.py +66 -0
  169. gdsfactory/components/shapes/L.py +51 -0
  170. gdsfactory/components/shapes/__init__.py +59 -0
  171. gdsfactory/components/shapes/bbox.py +79 -0
  172. gdsfactory/components/shapes/circle.py +31 -0
  173. gdsfactory/components/shapes/circle_wave.py +41 -0
  174. gdsfactory/components/shapes/compass.py +99 -0
  175. gdsfactory/components/shapes/cross.py +73 -0
  176. gdsfactory/components/shapes/dash.py +108 -0
  177. gdsfactory/components/shapes/ellipse.py +38 -0
  178. gdsfactory/components/shapes/fiducial_squares.py +33 -0
  179. gdsfactory/components/shapes/fractal.py +135 -0
  180. gdsfactory/components/shapes/nxn.py +145 -0
  181. gdsfactory/components/shapes/pie_arc.py +51 -0
  182. gdsfactory/components/shapes/rect_su_shape.py +113 -0
  183. gdsfactory/components/shapes/rect_taper.py +75 -0
  184. gdsfactory/components/shapes/rectangle.py +107 -0
  185. gdsfactory/components/shapes/regular_polygon.py +72 -0
  186. gdsfactory/components/shapes/rounded_rectangle.py +107 -0
  187. gdsfactory/components/shapes/star.py +44 -0
  188. gdsfactory/components/shapes/torus.py +87 -0
  189. gdsfactory/components/shapes/torus_wave.py +62 -0
  190. gdsfactory/components/shapes/triangles.py +139 -0
  191. gdsfactory/components/spirals/__init__.py +28 -0
  192. gdsfactory/components/spirals/delay_snake.py +96 -0
  193. gdsfactory/components/spirals/delay_snake2.py +100 -0
  194. gdsfactory/components/spirals/delay_snake_sbend.py +164 -0
  195. gdsfactory/components/spirals/spiral.py +149 -0
  196. gdsfactory/components/spirals/spiral_archimedes.py +85 -0
  197. gdsfactory/components/spirals/spiral_double.py +62 -0
  198. gdsfactory/components/spirals/spiral_fermat.py +67 -0
  199. gdsfactory/components/spirals/spiral_heater.py +578 -0
  200. gdsfactory/components/spirals/spiral_inductor.py +81 -0
  201. gdsfactory/components/spirals/spiral_logarithmic.py +68 -0
  202. gdsfactory/components/spirals/spiral_rectangular.py +87 -0
  203. gdsfactory/components/superconductors/__init__.py +15 -0
  204. gdsfactory/components/superconductors/hline.py +72 -0
  205. gdsfactory/components/superconductors/optimal_90deg.py +90 -0
  206. gdsfactory/components/superconductors/optimal_hairpin.py +123 -0
  207. gdsfactory/components/superconductors/optimal_step.py +211 -0
  208. gdsfactory/components/superconductors/snspd.py +107 -0
  209. gdsfactory/components/superconductors/ytron.py +128 -0
  210. gdsfactory/components/tapers/__init__.py +34 -0
  211. gdsfactory/components/tapers/csv_data/taper_strip_0p5_10_100.csv +501 -0
  212. gdsfactory/components/tapers/csv_data/taper_strip_0p5_10_150.csv +501 -0
  213. gdsfactory/components/tapers/csv_data/taper_strip_0p5_10_200.csv +501 -0
  214. gdsfactory/components/tapers/csv_data/taper_strip_0p5_11_200.csv +501 -0
  215. gdsfactory/components/tapers/csv_data/taper_strip_0p5_12_200.csv +501 -0
  216. gdsfactory/components/tapers/csv_data/taper_strip_0p5_3_36.csv +101 -0
  217. gdsfactory/components/tapers/ramp.py +45 -0
  218. gdsfactory/components/tapers/taper.py +358 -0
  219. gdsfactory/components/tapers/taper_adiabatic.py +136 -0
  220. gdsfactory/components/tapers/taper_cross_section.py +100 -0
  221. gdsfactory/components/tapers/taper_from_csv.py +92 -0
  222. gdsfactory/components/tapers/taper_hecken.py +147 -0
  223. gdsfactory/components/tapers/taper_meander.py +186 -0
  224. gdsfactory/components/tapers/taper_parabolic.py +44 -0
  225. gdsfactory/components/texts/__init__.py +16 -0
  226. gdsfactory/components/texts/fonts/OCR-A.ttf +0 -0
  227. gdsfactory/components/texts/text.py +121 -0
  228. gdsfactory/components/texts/text_freetype.py +125 -0
  229. gdsfactory/components/texts/text_rectangular.py +116 -0
  230. gdsfactory/components/texts/text_rectangular_font.py +325 -0
  231. gdsfactory/components/vias/__init__.py +34 -0
  232. gdsfactory/components/vias/via.py +129 -0
  233. gdsfactory/components/vias/via_chain.py +164 -0
  234. gdsfactory/components/vias/via_corner.py +117 -0
  235. gdsfactory/components/vias/via_stack.py +485 -0
  236. gdsfactory/components/vias/via_stack_with_offset.py +229 -0
  237. gdsfactory/components/waveguides/__init__.py +39 -0
  238. gdsfactory/components/waveguides/crossing_waveguide.py +308 -0
  239. gdsfactory/components/waveguides/straight.py +142 -0
  240. gdsfactory/components/waveguides/straight_heater_doped.py +280 -0
  241. gdsfactory/components/waveguides/straight_heater_meander.py +268 -0
  242. gdsfactory/components/waveguides/straight_heater_meander_doped.py +255 -0
  243. gdsfactory/components/waveguides/straight_heater_metal.py +293 -0
  244. gdsfactory/components/waveguides/straight_piecewise.py +64 -0
  245. gdsfactory/components/waveguides/straight_pin.py +98 -0
  246. gdsfactory/components/waveguides/straight_pin_slot.py +131 -0
  247. gdsfactory/components/waveguides/wire.py +266 -0
  248. gdsfactory/config.py +204 -0
  249. gdsfactory/constants.py +2032 -0
  250. gdsfactory/containers.py +89 -0
  251. gdsfactory/cross_section/__init__.py +159 -0
  252. gdsfactory/cross_section/base.py +518 -0
  253. gdsfactory/cross_section/heater.py +439 -0
  254. gdsfactory/cross_section/pn_junction.py +1121 -0
  255. gdsfactory/cross_section/presets.py +658 -0
  256. gdsfactory/cross_section/utils.py +373 -0
  257. gdsfactory/difftest.py +643 -0
  258. gdsfactory/difftest_git.py +26 -0
  259. gdsfactory/export/__init__.py +21 -0
  260. gdsfactory/export/to_3d.py +133 -0
  261. gdsfactory/export/to_gerber.py +325 -0
  262. gdsfactory/export/to_np.py +59 -0
  263. gdsfactory/export/to_stl.py +103 -0
  264. gdsfactory/export/to_svg.py +153 -0
  265. gdsfactory/font.py +213 -0
  266. gdsfactory/functions.py +557 -0
  267. gdsfactory/generic_tech/__init__.py +57 -0
  268. gdsfactory/generic_tech/generic_tech.sh +4 -0
  269. gdsfactory/generic_tech/klayout/README.md +7 -0
  270. gdsfactory/generic_tech/klayout/d25/generic_tech.lyd25 +65 -0
  271. gdsfactory/generic_tech/klayout/drc/Makefile +5 -0
  272. gdsfactory/generic_tech/klayout/drc/errors.py +92 -0
  273. gdsfactory/generic_tech/klayout/grain.xml +30 -0
  274. gdsfactory/generic_tech/klayout/layers.lyp +1482 -0
  275. gdsfactory/generic_tech/klayout/lvs/.gitignore +1 -0
  276. gdsfactory/generic_tech/klayout/lvs/Makefile +8 -0
  277. gdsfactory/generic_tech/klayout/lvs/README.md +98 -0
  278. gdsfactory/generic_tech/klayout/lvs/drc_malformed/README.md +70 -0
  279. gdsfactory/generic_tech/klayout/lvs/drc_malformed/generic_tech_malformed.drc +369 -0
  280. gdsfactory/generic_tech/klayout/lvs/drc_malformed/run_drc.py +330 -0
  281. gdsfactory/generic_tech/klayout/lvs/generic_tech.lvs +258 -0
  282. gdsfactory/generic_tech/klayout/lvs/rule_decks/custom_classes.lvs +122 -0
  283. gdsfactory/generic_tech/klayout/lvs/rule_decks/devices_connections.lvs +17 -0
  284. gdsfactory/generic_tech/klayout/lvs/rule_decks/general_connections.lvs +26 -0
  285. gdsfactory/generic_tech/klayout/lvs/rule_decks/general_derivations.lvs +3 -0
  286. gdsfactory/generic_tech/klayout/lvs/rule_decks/heater_connections.lvs +7 -0
  287. gdsfactory/generic_tech/klayout/lvs/rule_decks/heater_derivations.lvs +13 -0
  288. gdsfactory/generic_tech/klayout/lvs/rule_decks/heater_extraction.lvs +15 -0
  289. gdsfactory/generic_tech/klayout/lvs/rule_decks/layers_definitions.lvs +253 -0
  290. gdsfactory/generic_tech/klayout/lvs/run_lvs.py +285 -0
  291. gdsfactory/generic_tech/klayout/pymacros/set_menus.lym +33 -0
  292. gdsfactory/generic_tech/klayout/pymacros/set_shortcuts.lym +23 -0
  293. gdsfactory/generic_tech/klayout/python/__init__.py +0 -0
  294. gdsfactory/generic_tech/klayout/python/kgdsfactory/__init__.py +5 -0
  295. gdsfactory/generic_tech/klayout/python/kgdsfactory/shortcuts.py +100 -0
  296. gdsfactory/generic_tech/klayout/tech/Makefile +12 -0
  297. gdsfactory/generic_tech/klayout/tech/d25/generic_tech.lyd25 +65 -0
  298. gdsfactory/generic_tech/klayout/tech/generic.layerstack +56 -0
  299. gdsfactory/generic_tech/klayout/tech/xsection_generic.pyxs +149 -0
  300. gdsfactory/generic_tech/klayout/tech/xsection_generic.xs +139 -0
  301. gdsfactory/generic_tech/klayout/tech/xsection_planarized.pyxs +175 -0
  302. gdsfactory/generic_tech/klayout/tech/xsection_planarized.xs +169 -0
  303. gdsfactory/generic_tech/klayout/tech.lyt +169 -0
  304. gdsfactory/generic_tech/klayout/xsection/xsection_generic.pyxs +149 -0
  305. gdsfactory/generic_tech/klayout/xsection/xsection_generic.xs +139 -0
  306. gdsfactory/generic_tech/klayout/xsection/xsection_planarized.pyxs +175 -0
  307. gdsfactory/generic_tech/klayout/xsection/xsection_planarized.xs +169 -0
  308. gdsfactory/generic_tech/layer_map.py +1 -0
  309. gdsfactory/generic_tech/layer_stack.py +1 -0
  310. gdsfactory/generic_tech/simulation_settings.py +1 -0
  311. gdsfactory/get_factories.py +160 -0
  312. gdsfactory/get_netlist.py +934 -0
  313. gdsfactory/gpdk/__init__.py +111 -0
  314. gdsfactory/gpdk/get_klayout_pyxs.py +301 -0
  315. gdsfactory/gpdk/layer_map.py +70 -0
  316. gdsfactory/gpdk/layer_stack.py +419 -0
  317. gdsfactory/gpdk/layer_views.yaml +503 -0
  318. gdsfactory/gpdk/simulation_settings.py +163 -0
  319. gdsfactory/grid.py +381 -0
  320. gdsfactory/install.py +267 -0
  321. gdsfactory/klayout_bridge.py +606 -0
  322. gdsfactory/labels/__init__.py +17 -0
  323. gdsfactory/labels/add_label_yaml.py +85 -0
  324. gdsfactory/labels/add_labels.py +29 -0
  325. gdsfactory/labels/ehva.py +92 -0
  326. gdsfactory/labels/write_labels.py +93 -0
  327. gdsfactory/labels/write_test_manifest.py +89 -0
  328. gdsfactory/name.py +229 -0
  329. gdsfactory/pack.py +299 -0
  330. gdsfactory/path.py +1946 -0
  331. gdsfactory/pdk.py +995 -0
  332. gdsfactory/plot.py +110 -0
  333. gdsfactory/port.py +851 -0
  334. gdsfactory/py.typed +0 -0
  335. gdsfactory/rasterize.py +166 -0
  336. gdsfactory/read/__init__.py +18 -0
  337. gdsfactory/read/from_gdspaths.py +39 -0
  338. gdsfactory/read/from_np.py +117 -0
  339. gdsfactory/read/from_updk.py +288 -0
  340. gdsfactory/read/from_yaml.py +2165 -0
  341. gdsfactory/read/from_yaml_gen.py +582 -0
  342. gdsfactory/read/from_yaml_template.py +209 -0
  343. gdsfactory/read/import_gds.py +198 -0
  344. gdsfactory/routing/__init__.py +63 -0
  345. gdsfactory/routing/_dual.py +788 -0
  346. gdsfactory/routing/_kf_router.py +1104 -0
  347. gdsfactory/routing/_traced_manhattan.py +2838 -0
  348. gdsfactory/routing/_traced_router.py +279 -0
  349. gdsfactory/routing/add_electrical_pads_shortest.py +88 -0
  350. gdsfactory/routing/add_electrical_pads_top.py +92 -0
  351. gdsfactory/routing/add_electrical_pads_top_dc.py +89 -0
  352. gdsfactory/routing/add_fiber_array.py +129 -0
  353. gdsfactory/routing/add_fiber_single.py +196 -0
  354. gdsfactory/routing/add_pads.py +258 -0
  355. gdsfactory/routing/auto_taper.py +213 -0
  356. gdsfactory/routing/factories.py +48 -0
  357. gdsfactory/routing/fanout2x2.py +95 -0
  358. gdsfactory/routing/resolve_pins.py +94 -0
  359. gdsfactory/routing/route_astar.py +641 -0
  360. gdsfactory/routing/route_bundle.py +673 -0
  361. gdsfactory/routing/route_bundle_all_angle.py +542 -0
  362. gdsfactory/routing/route_bundle_sbend.py +166 -0
  363. gdsfactory/routing/route_dubins.py +317 -0
  364. gdsfactory/routing/route_fiber_array.py +435 -0
  365. gdsfactory/routing/route_ports_to_side.py +537 -0
  366. gdsfactory/routing/route_quad.py +97 -0
  367. gdsfactory/routing/route_sharp.py +393 -0
  368. gdsfactory/routing/route_single.py +413 -0
  369. gdsfactory/routing/route_single_sbend.py +109 -0
  370. gdsfactory/routing/route_south.py +279 -0
  371. gdsfactory/routing/sort_ports.py +86 -0
  372. gdsfactory/routing/utils.py +68 -0
  373. gdsfactory/routing/validation.py +114 -0
  374. gdsfactory/samples/00_hello_world.py +15 -0
  375. gdsfactory/samples/01_component_pcell.py +73 -0
  376. gdsfactory/samples/01_component_pcell_with_parameters.py +20 -0
  377. gdsfactory/samples/01_component_pcell_with_ports.py +35 -0
  378. gdsfactory/samples/02_component_autoname.py +17 -0
  379. gdsfactory/samples/03_move.py +27 -0
  380. gdsfactory/samples/04_connect.py +33 -0
  381. gdsfactory/samples/05_remove_layers.py +30 -0
  382. gdsfactory/samples/05_remove_layers_overlapping.py +30 -0
  383. gdsfactory/samples/06_remapping_layers.py +34 -0
  384. gdsfactory/samples/07_flattening_device.py +34 -0
  385. gdsfactory/samples/08_delete_cell.py +21 -0
  386. gdsfactory/samples/08_grid.py +16 -0
  387. gdsfactory/samples/09_pack.py +16 -0
  388. gdsfactory/samples/11_component_layout.py +67 -0
  389. gdsfactory/samples/11_component_layout_bend_s_offset.py +20 -0
  390. gdsfactory/samples/12_component_instance_arrays.py +16 -0
  391. gdsfactory/samples/12_component_refs.py +97 -0
  392. gdsfactory/samples/13_component_netlist.py +64 -0
  393. gdsfactory/samples/14_component_connectivity.py +92 -0
  394. gdsfactory/samples/15_component_sequence1.py +57 -0
  395. gdsfactory/samples/16_component_sequence2.py +58 -0
  396. gdsfactory/samples/17_port_register_cross_section.py +61 -0
  397. gdsfactory/samples/17_ports.py +46 -0
  398. gdsfactory/samples/18_port_pins.py +11 -0
  399. gdsfactory/samples/19_references.py +31 -0
  400. gdsfactory/samples/20_components.py +23 -0
  401. gdsfactory/samples/21_add_fiber_array.py +26 -0
  402. gdsfactory/samples/22_add_pads.py +15 -0
  403. gdsfactory/samples/24_doe.py +15 -0
  404. gdsfactory/samples/24_doe_3.py +20 -0
  405. gdsfactory/samples/25_slot_cross_section.py +10 -0
  406. gdsfactory/samples/26_cross_section_copy.py +12 -0
  407. gdsfactory/samples/30_lidar.py +62 -0
  408. gdsfactory/samples/30_lidar_pcell.py +78 -0
  409. gdsfactory/samples/30_lidar_with_pads.py +89 -0
  410. gdsfactory/samples/30_route_bundle_lidar.py +54 -0
  411. gdsfactory/samples/33_route_bundle_basic.py +51 -0
  412. gdsfactory/samples/33_route_bundle_collision_enlarged.py +36 -0
  413. gdsfactory/samples/33_route_bundle_collision_no_intersect.py +36 -0
  414. gdsfactory/samples/33_route_bundle_collision_none.py +48 -0
  415. gdsfactory/samples/33_route_bundle_corner.py +206 -0
  416. gdsfactory/samples/33_route_bundle_electrical.py +45 -0
  417. gdsfactory/samples/33_route_bundle_mmi2x2.py +23 -0
  418. gdsfactory/samples/33_route_bundle_north_south.py +52 -0
  419. gdsfactory/samples/33_route_bundle_nxn.py +27 -0
  420. gdsfactory/samples/33_route_bundle_sbend.py +21 -0
  421. gdsfactory/samples/33_route_bundle_sbend_route_bundle.py +24 -0
  422. gdsfactory/samples/33_route_bundle_top_bottom.py +48 -0
  423. gdsfactory/samples/33_route_bundle_u_indirect.py +81 -0
  424. gdsfactory/samples/33_route_bundle_udirect.py +73 -0
  425. gdsfactory/samples/34_route_edge_coupler.py +79 -0
  426. gdsfactory/samples/34_route_edge_coupler_bend_s.py +101 -0
  427. gdsfactory/samples/35_route_auto_taper.py +22 -0
  428. gdsfactory/samples/35_route_auto_taper_nitride.py +27 -0
  429. gdsfactory/samples/35_route_bundle_auto_taper.py +22 -0
  430. gdsfactory/samples/35_route_bundle_custom_taper.py +23 -0
  431. gdsfactory/samples/35_route_bundle_low_loss_taper.py +23 -0
  432. gdsfactory/samples/35_route_bundle_non_manhattan_steps.py +32 -0
  433. gdsfactory/samples/35_route_bundle_non_manhattan_waypoints.py +33 -0
  434. gdsfactory/samples/35_route_bundle_steps.py +26 -0
  435. gdsfactory/samples/35_route_bundle_steps2.py +26 -0
  436. gdsfactory/samples/35_route_bundle_steps3.py +34 -0
  437. gdsfactory/samples/35_route_gs.py +38 -0
  438. gdsfactory/samples/35_route_gs_optical.py +39 -0
  439. gdsfactory/samples/35_route_single_steps.py +28 -0
  440. gdsfactory/samples/36_route_gsg.py +44 -0
  441. gdsfactory/samples/36_route_single.py +22 -0
  442. gdsfactory/samples/37_path_length_matching_center.py +67 -0
  443. gdsfactory/samples/37_path_length_matching_end.py +54 -0
  444. gdsfactory/samples/37_path_length_matching_start.py +64 -0
  445. gdsfactory/samples/39_route_bundle_all_angle.py +29 -0
  446. gdsfactory/samples/39_route_bundle_all_angle_rotated.py +25 -0
  447. gdsfactory/samples/39_route_dubins.py +25 -0
  448. gdsfactory/samples/39_route_dubins_multi.py +28 -0
  449. gdsfactory/samples/40_verification.py +27 -0
  450. gdsfactory/samples/41_verification_routing.py +20 -0
  451. gdsfactory/samples/__init__.py +0 -0
  452. gdsfactory/samples/all_angle_routing/aar_basic_01.pic.yml +29 -0
  453. gdsfactory/samples/all_angle_routing/aar_bundles.pic.yml +252 -0
  454. gdsfactory/samples/all_angle_routing/aar_error_intermediate_180.pic.yml +26 -0
  455. gdsfactory/samples/all_angle_routing/aar_error_overconstrained.pic.yml +27 -0
  456. gdsfactory/samples/all_angle_routing/aar_gone_wrong.pic.yml +95 -0
  457. gdsfactory/samples/all_angle_routing/aar_implicit_final_angle.pic.yml +71 -0
  458. gdsfactory/samples/all_angle_routing/aar_slalom.pic.yml +35 -0
  459. gdsfactory/samples/all_angle_routing/aar_start_end_customizations.pic.yml +178 -0
  460. gdsfactory/samples/all_angle_routing/aar_step_definitions.pic.yml +90 -0
  461. gdsfactory/samples/all_angle_routing/aar_tricky_connections.pic.yml +179 -0
  462. gdsfactory/samples/all_angle_routing/all_angle_routes.pic.yml +209 -0
  463. gdsfactory/samples/big_device.py +105 -0
  464. gdsfactory/samples/big_device_electrical.py +94 -0
  465. gdsfactory/samples/coh_rx_single_pol.py +198 -0
  466. gdsfactory/samples/coh_tx_dual_pol.py +141 -0
  467. gdsfactory/samples/coh_tx_single_pol.py +167 -0
  468. gdsfactory/samples/demo/Makefile +2 -0
  469. gdsfactory/samples/demo/__init__.py +0 -0
  470. gdsfactory/samples/demo/circuits/mask.pic.yml +31 -0
  471. gdsfactory/samples/demo/circuits/mzi_lattice_filter.pic.yml +51 -0
  472. gdsfactory/samples/demo/circuits/mzi_ubcpdk.pic.yml +35 -0
  473. gdsfactory/samples/demo/circuits/pads.pic.yml +29 -0
  474. gdsfactory/samples/demo/circuits/rectangles.pic.yml +17 -0
  475. gdsfactory/samples/demo/drc_errors.py +96 -0
  476. gdsfactory/samples/demo/layers_sky130.py +7 -0
  477. gdsfactory/samples/demo/layers_xsection.py +17 -0
  478. gdsfactory/samples/demo/lvs.py +95 -0
  479. gdsfactory/samples/demo/pcell.py +25 -0
  480. gdsfactory/samples/differentiable_optimization.py +56 -0
  481. gdsfactory/samples/fixme/route_bundle_bbox.py +30 -0
  482. gdsfactory/samples/images/logo.png +0 -0
  483. gdsfactory/samples/netlists/bend_mirror.yml +69 -0
  484. gdsfactory/samples/netlists/bend_rotated.yml +38 -0
  485. gdsfactory/samples/netlists/bend_translated_rotated.yml +65 -0
  486. gdsfactory/samples/netlists/mzi.yml +373 -0
  487. gdsfactory/samples/netlists/straight_with_bend.yml +52 -0
  488. gdsfactory/samples/pdk/__init__.py +0 -0
  489. gdsfactory/samples/pdk/fab_c.py +256 -0
  490. gdsfactory/samples/pdk/fab_d/__init__.py +27 -0
  491. gdsfactory/samples/pdk/fab_d/phase_shifters.py +77 -0
  492. gdsfactory/samples/pdk/test_fab_c/test_settings_bend_euler_nc_.yml +16 -0
  493. gdsfactory/samples/pdk/test_fab_c/test_settings_bend_euler_no_.yml +16 -0
  494. gdsfactory/samples/pdk/test_fab_c/test_settings_bend_euler_sc_.yml +16 -0
  495. gdsfactory/samples/pdk/test_fab_c/test_settings_bend_euler_so_.yml +16 -0
  496. gdsfactory/samples/pdk/test_fab_c/test_settings_gc_sc_.yml +6 -0
  497. gdsfactory/samples/pdk/test_fab_c/test_settings_mmi1x2_nc_.yml +6 -0
  498. gdsfactory/samples/pdk/test_fab_c/test_settings_mmi1x2_no_.yml +6 -0
  499. gdsfactory/samples/pdk/test_fab_c/test_settings_mmi1x2_sc_.yml +6 -0
  500. gdsfactory/samples/pdk/test_fab_c/test_settings_mmi1x2_so_.yml +6 -0
  501. gdsfactory/samples/pdk/test_fab_c/test_settings_mzi_nc_.yml +22 -0
  502. gdsfactory/samples/pdk/test_fab_c/test_settings_mzi_no_.yml +22 -0
  503. gdsfactory/samples/pdk/test_fab_c/test_settings_straight_nc_.yml +11 -0
  504. gdsfactory/samples/pdk/test_fab_c/test_settings_straight_no_.yml +11 -0
  505. gdsfactory/samples/pdk/test_fab_c/test_settings_straight_sc_.yml +11 -0
  506. gdsfactory/samples/pdk/test_fab_c/test_settings_straight_so_.yml +11 -0
  507. gdsfactory/samples/route_astar.py +50 -0
  508. gdsfactory/samples/route_astar2.py +51 -0
  509. gdsfactory/samples/route_bundle_bbox2.py +33 -0
  510. gdsfactory/samples/route_bundle_yaml.py +39 -0
  511. gdsfactory/samples/sample_array_ports.py +17 -0
  512. gdsfactory/samples/sample_bend_angular_resolution.py +30 -0
  513. gdsfactory/samples/sample_bend_point_resolution.py +28 -0
  514. gdsfactory/samples/sample_bend_points.py +35 -0
  515. gdsfactory/samples/sample_bend_points_distance.py +32 -0
  516. gdsfactory/samples/sample_bend_s_offset.py +23 -0
  517. gdsfactory/samples/sample_extend_ports.py +30 -0
  518. gdsfactory/samples/sample_extend_ports_xs.py +49 -0
  519. gdsfactory/samples/sample_justify.py +14 -0
  520. gdsfactory/samples/sample_mzis.py +17 -0
  521. gdsfactory/samples/sample_reticle.py +115 -0
  522. gdsfactory/samples/sample_reticle_electrical_with_labels.py +118 -0
  523. gdsfactory/samples/sample_reticle_with_labels.py +159 -0
  524. gdsfactory/samples/sample_route_astar.py +45 -0
  525. gdsfactory/samples/sample_route_bundle.py +45 -0
  526. gdsfactory/samples/sample_route_error.py +79 -0
  527. gdsfactory/samples/sample_routing_auto_taper.py +48 -0
  528. gdsfactory/samples/sample_routing_challenge.py +32 -0
  529. gdsfactory/samples/sample_routing_sbend.py +20 -0
  530. gdsfactory/samples/sample_sbend.py +17 -0
  531. gdsfactory/samples/sample_taper_offsets.py +52 -0
  532. gdsfactory/samples/sample_to_3d.py +19 -0
  533. gdsfactory/samples/sample_to_3d_electrical.py +17 -0
  534. gdsfactory/samples/small_bends.py +67 -0
  535. gdsfactory/samples/snap_bends.py +19 -0
  536. gdsfactory/samples/snap_bends_fixed.py +25 -0
  537. gdsfactory/samples/snap_issue.py +16 -0
  538. gdsfactory/schematic.py +490 -0
  539. gdsfactory/serialization.py +252 -0
  540. gdsfactory/snap.py +135 -0
  541. gdsfactory/symbols.py +115 -0
  542. gdsfactory/technology/__init__.py +31 -0
  543. gdsfactory/technology/color_utils.py +10 -0
  544. gdsfactory/technology/klayout_tech.py +189 -0
  545. gdsfactory/technology/layer_map.py +57 -0
  546. gdsfactory/technology/layer_stack.py +740 -0
  547. gdsfactory/technology/layer_views.py +1298 -0
  548. gdsfactory/technology/processes.py +289 -0
  549. gdsfactory/technology/variation.py +50 -0
  550. gdsfactory/technology/xml_utils.py +27 -0
  551. gdsfactory/technology/yaml_utils.py +55 -0
  552. gdsfactory/transform.py +185 -0
  553. gdsfactory/typings.py +322 -0
  554. gdsfactory/utils.py +29 -0
  555. gdsfactory/watch.py +363 -0
  556. gdsfactory/write_cells.py +156 -0
  557. gdsfactoryx-9.51.0.dist-info/METADATA +360 -0
  558. gdsfactoryx-9.51.0.dist-info/RECORD +561 -0
  559. gdsfactoryx-9.51.0.dist-info/WHEEL +4 -0
  560. gdsfactoryx-9.51.0.dist-info/entry_points.txt +3 -0
  561. gdsfactoryx-9.51.0.dist-info/licenses/LICENSE +21 -0
gdsfactory/__init__.py ADDED
@@ -0,0 +1,192 @@
1
+ """Main module for gdsfactory."""
2
+
3
+ # NOTE: import order matters. Only change the order if you know what you are doing
4
+ # isort: skip_file
5
+
6
+ from __future__ import annotations
7
+ from gdsfactory import _dist_conflict # noqa: F401 (must run first: errors if upstream gdsfactory is also installed)
8
+ import sys
9
+ import warnings
10
+ from functools import partial
11
+ from toolz import compose
12
+ from aenum import constant
13
+
14
+ import kfactory as kf
15
+ from kfactory.layout import Constants
16
+ from kfactory import LayerEnum
17
+ from kfactory.layout import kcl
18
+ from kfactory import logger
19
+ import klayout.db as kdb
20
+ from kfactory import DSchematic as Schematic
21
+
22
+ from gdsfactory import _jax # enables float64 and provides tracer helpers
23
+ from gdsfactory._ports import Pin as DPin
24
+ from gdsfactory._ports import Pin as ProtoPin
25
+ from gdsfactory.transform import Transform
26
+
27
+ from gdsfactory._cell import cell, vcell, cell_with_module_name, schematic_cell
28
+ from gdsfactory._kcl import clear_cache
29
+ from gdsfactory.path import Path
30
+ from gdsfactory.component import (
31
+ Component,
32
+ ComponentBase,
33
+ ComponentAllAngle,
34
+ ComponentReference,
35
+ ComponentReference as Instance,
36
+ container,
37
+ )
38
+ from gdsfactory.config import CONF, PATH, __version__
39
+ from gdsfactory.port import Port
40
+ from gdsfactory.typings import Pin
41
+ from gdsfactory.read.import_gds import import_gds
42
+ from gdsfactory.cross_section import (
43
+ ComponentAlongPath,
44
+ CrossSection,
45
+ Section,
46
+ xsection,
47
+ get_cross_sections,
48
+ )
49
+ from gdsfactory.difftest import DiffResult, LayerDiff, difftest, diff
50
+ from gdsfactory.boolean import boolean
51
+
52
+ from gdsfactory import config
53
+ from gdsfactory import cross_section
54
+ from gdsfactory import port
55
+ from gdsfactory import components
56
+ from gdsfactory import containers
57
+ from gdsfactory import labels
58
+ from gdsfactory import typings
59
+ from gdsfactory import path
60
+ from gdsfactory import snap
61
+ from gdsfactory import read
62
+ from gdsfactory import add_ports
63
+ from gdsfactory import write_cells
64
+ from gdsfactory import add_pins
65
+ from gdsfactory import technology
66
+ from gdsfactory import routing
67
+ from gdsfactory import export
68
+ from gdsfactory import functions
69
+ from gdsfactory import gpdk
70
+
71
+ from gdsfactory.add_padding import (
72
+ add_padding,
73
+ add_padding_container,
74
+ get_padding_points,
75
+ add_padding_to_size,
76
+ )
77
+ from gdsfactory.pack import pack
78
+ from gdsfactory.pdk import (
79
+ Pdk,
80
+ get_component,
81
+ get_cross_section,
82
+ get_layer,
83
+ get_layer_tuple,
84
+ get_layer_name,
85
+ get_layer_info,
86
+ get_active_pdk,
87
+ get_cell,
88
+ get_constant,
89
+ )
90
+ from gdsfactory.get_factories import get_cells
91
+ from gdsfactory.grid import grid, grid_with_text
92
+
93
+ from gdsfactory import rasterize
94
+ from gdsfactory.klayout_bridge import show
95
+
96
+ c = components
97
+ Region = kdb.Region
98
+
99
+ # Check Python version and issue a warning if using Python 3.10
100
+ if sys.version_info[:2] == (3, 10):
101
+ warnings.warn(
102
+ "Support for Python 3.10 has been dropped. Please upgrade to Python 3.11 or later "
103
+ "to continue using the latest features and improvements. "
104
+ "To get the latest gdsfactory, upgrading your Python version is required.",
105
+ DeprecationWarning,
106
+ stacklevel=3,
107
+ )
108
+
109
+
110
+ __all__ = (
111
+ "CONF",
112
+ "PATH",
113
+ "Component",
114
+ "ComponentAllAngle",
115
+ "ComponentAlongPath",
116
+ "ComponentBase",
117
+ "ComponentReference",
118
+ "Constants",
119
+ "CrossSection",
120
+ "DPin",
121
+ "DiffResult",
122
+ "Instance",
123
+ "LayerDiff",
124
+ "LayerEnum",
125
+ "Path",
126
+ "Pdk",
127
+ "Pin",
128
+ "Port",
129
+ "ProtoPin",
130
+ "Region",
131
+ "Schematic",
132
+ "Section",
133
+ "Transform",
134
+ "__version__",
135
+ "add_padding",
136
+ "add_padding_container",
137
+ "add_padding_to_size",
138
+ "add_pins",
139
+ "add_ports",
140
+ "boolean",
141
+ "c",
142
+ "cell",
143
+ "cell_with_module_name",
144
+ "clear_cache",
145
+ "components",
146
+ "compose",
147
+ "config",
148
+ "constant",
149
+ "container",
150
+ "containers",
151
+ "cross_section",
152
+ "diff",
153
+ "difftest",
154
+ "export",
155
+ "functions",
156
+ "get_active_pdk",
157
+ "get_cell",
158
+ "get_cells",
159
+ "get_component",
160
+ "get_constant",
161
+ "get_cross_section",
162
+ "get_cross_sections",
163
+ "get_layer",
164
+ "get_layer_info",
165
+ "get_layer_name",
166
+ "get_layer_tuple",
167
+ "get_padding_points",
168
+ "gpdk",
169
+ "grid",
170
+ "grid_with_text",
171
+ "import_gds",
172
+ "kcl",
173
+ "kdb",
174
+ "kf",
175
+ "labels",
176
+ "logger",
177
+ "pack",
178
+ "partial",
179
+ "path",
180
+ "port",
181
+ "read",
182
+ "routing",
183
+ "schematic_cell",
184
+ "rasterize",
185
+ "show",
186
+ "snap",
187
+ "technology",
188
+ "typings",
189
+ "vcell",
190
+ "write_cells",
191
+ "xsection",
192
+ )
gdsfactory/_cell.py ADDED
@@ -0,0 +1,337 @@
1
+ """Cell decorator for the differentiable backend.
2
+
3
+ ``@gf.cell`` turns a function returning a Component into a cached factory:
4
+
5
+ - the bound arguments are stored in ``component.settings``
6
+ - the component gets a deterministic name from function name + parameters
7
+ - calls with identical (concrete) arguments return the same locked Component
8
+
9
+ When any argument carries a JAX tracer (e.g. inside ``jax.grad``), the cache is
10
+ bypassed so derivative information flows through the geometry.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import functools
16
+ import inspect
17
+ from collections.abc import Callable, Iterable
18
+ from typing import TYPE_CHECKING, Any, ParamSpec, Protocol, cast
19
+
20
+ from gdsfactory._jax import has_tracers
21
+
22
+ if TYPE_CHECKING:
23
+ from gdsfactory.component import Component
24
+
25
+ ComponentParams = ParamSpec("ComponentParams")
26
+
27
+ MAX_NAME_LENGTH = 99
28
+ _CACHES: list[dict[Any, Any]] = []
29
+ _BY_NAME: dict[str, Any] = {}
30
+ factories: dict[str, Callable[..., Any]] = {}
31
+ """Registry of cell functions (name -> decorated function)."""
32
+
33
+
34
+ class ComponentFunc(Protocol[ComponentParams]):
35
+ __name__: str
36
+
37
+ def __call__(
38
+ self, *args: ComponentParams.args, **kwargs: ComponentParams.kwargs
39
+ ) -> Component: ...
40
+
41
+
42
+ def clean_name(name: str) -> str:
43
+ """Ensures that gds cells are composed of [a-zA-Z0-9_\\-]."""
44
+ from kfactory.serialization import clean_name as _kf_clean_name
45
+
46
+ return _kf_clean_name(name)
47
+
48
+
49
+ def _module_basename(func: Callable[..., Any]) -> str:
50
+ name, module = func.__name__, func.__module__
51
+ return clean_name(name if module == "__main__" else f"{name}_{module}")
52
+
53
+
54
+ def _concrete(value: Any) -> Any:
55
+ """Replaces tracers / jax arrays by concrete python values (for naming)."""
56
+ import numpy as np
57
+
58
+ from gdsfactory._jax import is_tracer, primal
59
+
60
+ if is_tracer(value):
61
+ value = primal(value)
62
+ if type(value).__module__.startswith("jax"):
63
+ arr = np.asarray(value)
64
+ return arr.item() if arr.ndim == 0 else arr.tolist()
65
+ if isinstance(value, dict):
66
+ # kfactory sorts nested dict keys when naming
67
+ return {k: _concrete(value[k]) for k in sorted(value)}
68
+ if isinstance(value, list):
69
+ return [_concrete(v) for v in value]
70
+ if isinstance(value, tuple):
71
+ return tuple(_concrete(v) for v in value)
72
+ return value
73
+
74
+
75
+ def get_cell_name(cell_type: str, max_cellname_length: int | None = None, **kwargs: Any) -> str:
76
+ """Returns a cell name from the function name and its parameters.
77
+
78
+ Same algorithm as kfactory (so names match upstream gdsfactory).
79
+ """
80
+ from kfactory.serialization import get_cell_name as _kf_get_cell_name
81
+
82
+ params = {k: _concrete(v) for k, v in kwargs.items()}
83
+ return _kf_get_cell_name(cell_type, max_cellname_length=max_cellname_length, **params)
84
+
85
+
86
+ def _layout_cache_enabled() -> bool:
87
+ from gdsfactory.config import CONF
88
+
89
+ return bool(getattr(CONF, "cell_layout_cache", False))
90
+
91
+
92
+ def _metadata(value: Any) -> Any:
93
+ """Settings value as kfactory stores it (functions -> names); keeps jax values."""
94
+ from kfactory.serialization import convert_metadata_type
95
+
96
+ if has_tracers(value) or type(value).__module__.startswith("jax"):
97
+ return value
98
+ if isinstance(value, dict):
99
+ return {k: _metadata(v) for k, v in value.items()}
100
+ if isinstance(value, list):
101
+ return [_metadata(v) for v in value]
102
+ if isinstance(value, tuple):
103
+ return tuple(_metadata(v) for v in value)
104
+ try:
105
+ return convert_metadata_type(value)
106
+ except Exception:
107
+ return value
108
+
109
+
110
+ def _freeze(value: Any) -> Any:
111
+ """Hashable key for caching (only called without tracers)."""
112
+ import pydantic
113
+
114
+ from gdsfactory.serialization import clean_value_json
115
+
116
+ if isinstance(value, pydantic.BaseModel):
117
+ # exact field values (clean_value_json rounds floats)
118
+ try:
119
+ return ("__model__", type(value).__name__, _freeze(dict(value)))
120
+ except Exception:
121
+ return ("__id__", id(value))
122
+
123
+ try:
124
+ hash(value)
125
+ if not isinstance(value, float | int | str | bool | type(None) | tuple | frozenset):
126
+ # functions / partials / components: hash by identity or serialization
127
+ if callable(value) or hasattr(value, "name"):
128
+ try:
129
+ return ("__json__", repr(clean_value_json(value)))
130
+ except Exception:
131
+ return ("__id__", id(value))
132
+ if isinstance(value, tuple):
133
+ return tuple(_freeze(v) for v in value)
134
+ return value
135
+ except TypeError:
136
+ pass
137
+ if isinstance(value, dict):
138
+ return tuple(sorted((k, _freeze(v)) for k, v in value.items()))
139
+ if isinstance(value, list | tuple):
140
+ return tuple(_freeze(v) for v in value)
141
+ if isinstance(value, set):
142
+ return frozenset(_freeze(v) for v in value)
143
+ try:
144
+ return ("__json__", repr(clean_value_json(value)))
145
+ except Exception:
146
+ return ("__id__", id(value))
147
+
148
+
149
+ def clear_cache() -> None:
150
+ for c in _CACHES:
151
+ c.clear()
152
+ _BY_NAME.clear()
153
+
154
+
155
+ def cached_cells() -> list[Any]:
156
+ """Components currently stored in the cell caches."""
157
+ return [c for cache in _CACHES for c in cache.values()]
158
+
159
+
160
+ def cell(
161
+ _func: Callable[..., Any] | None = None,
162
+ /,
163
+ *,
164
+ set_settings: bool = True,
165
+ set_name: bool = True,
166
+ check_ports: bool = True,
167
+ check_instances: Any = None,
168
+ snap_ports: bool = True,
169
+ add_port_layers: bool = True,
170
+ cache: dict[Any, Any] | None = None,
171
+ basename: str | None = None,
172
+ drop_params: list[str] | None = None,
173
+ register_factory: bool = True,
174
+ overwrite_existing: bool | None = None,
175
+ layout_cache: bool | None = None,
176
+ info: dict[str, Any] | None = None,
177
+ post_process: Iterable[Callable[[Component], None]] | None = None,
178
+ debug_names: bool | None = None,
179
+ tags: list[str] | None = None,
180
+ with_module_name: bool = False,
181
+ lvs_equivalent_ports: list[list[str]] | None = None,
182
+ ports: Any = None,
183
+ schematic_function: Callable[..., Any] | None = None,
184
+ output_type: Any = None,
185
+ ) -> Any:
186
+ """Decorator to convert a function into a (cached, differentiable) Component factory."""
187
+ drop = set(drop_params if drop_params is not None else ["self", "cls"])
188
+ post = list(post_process or [])
189
+
190
+ def decorator(func: Callable[..., Any]) -> Callable[..., Any]:
191
+ sig = inspect.signature(func)
192
+ _cache: dict[Any, Any] = cache if cache is not None else {}
193
+ _CACHES.append(_cache)
194
+ _basename = basename or (_module_basename(func) if with_module_name else None)
195
+
196
+ @functools.wraps(func)
197
+ def wrapper(*args: Any, **kwargs: Any) -> Component:
198
+ from gdsfactory.component import Component
199
+
200
+ bound = sig.bind(*args, **kwargs)
201
+ bound.apply_defaults()
202
+ params = {k: v for k, v in bound.arguments.items() if k not in drop}
203
+ # flatten **kwargs parameters
204
+ for name, p in sig.parameters.items():
205
+ if p.kind is inspect.Parameter.VAR_KEYWORD and name in params:
206
+ params.update(params.pop(name))
207
+ # unsnapped cells (gf.snap.SNAP_ENABLED = False) never enter the cache
208
+ from gdsfactory import snap as _snap
209
+
210
+ traced = has_tracers(params) or not _snap.SNAP_ENABLED
211
+ key = None
212
+ if not traced:
213
+ try:
214
+ key = _freeze(params)
215
+ hash(key)
216
+ except Exception:
217
+ key = None
218
+ if key is not None and key in _cache:
219
+ return cast("Component", _cache[key])
220
+ if set_name and _layout_cache_enabled():
221
+ # like upstream (CONF.cell_layout_cache): reuse an existing cell
222
+ # with the same name (e.g. a function passed by its name)
223
+ name = get_cell_name(_basename or func.__name__, **params)
224
+ existing = _BY_NAME.get(name)
225
+ if existing is not None:
226
+ if key is not None:
227
+ _cache[key] = existing
228
+ return cast("Component", existing)
229
+
230
+ c = func(*bound.args, **bound.kwargs)
231
+ if not isinstance(c, Component):
232
+ raise TypeError(
233
+ f"{func.__name__} must return a Component, got {type(c)}"
234
+ )
235
+ if c.locked:
236
+ # returned a cached cell from another factory: wrap a copy
237
+ c = c.copy()
238
+
239
+ function_name = func.__name__
240
+ if set_name:
241
+ c._name = get_cell_name(_basename or function_name, **params)
242
+ if set_settings:
243
+ c.settings = type(c.settings)(
244
+ {k: _metadata(v) for k, v in params.items()}
245
+ )
246
+ c.function_name = function_name
247
+ c.basename = _basename
248
+ c.module = func.__module__
249
+ if info:
250
+ c.info.update(info)
251
+ if lvs_equivalent_ports:
252
+ c.lvs_equivalent_ports = lvs_equivalent_ports
253
+ for pp in post:
254
+ pp(c)
255
+ if schematic_function is not None:
256
+ c._schematic_function = schematic_function # type: ignore[attr-defined]
257
+ c.locked = True
258
+ if key is not None:
259
+ _cache[key] = c
260
+ if set_name:
261
+ _BY_NAME.setdefault(c.name, c)
262
+ return c
263
+
264
+ wrapper.is_gf_cell = True # type: ignore[attr-defined]
265
+ wrapper.cache = _cache # type: ignore[attr-defined]
266
+ wrapper.tags = tags or [] # type: ignore[attr-defined]
267
+ if schematic_function is not None:
268
+ wrapper.schematic_function = schematic_function # type: ignore[attr-defined]
269
+
270
+ def get_schematic(*args: Any, **kwargs: Any) -> Any:
271
+ if schematic_function is None:
272
+ raise ValueError(f"{func.__name__} has no schematic_function")
273
+ return schematic_function(*args, **kwargs)
274
+
275
+ wrapper.get_schematic = get_schematic # type: ignore[attr-defined]
276
+ if register_factory:
277
+ factories[_basename or func.__name__] = wrapper
278
+ return wrapper
279
+
280
+ if _func is not None:
281
+ return decorator(_func)
282
+ return decorator
283
+
284
+
285
+ def vcell(_func: Callable[..., Any] | None = None, /, **kwargs: Any) -> Any:
286
+ """Like ``cell`` (all components support any angle in gdsfactoryx)."""
287
+ kwargs = {k: v for k, v in kwargs.items() if k in _CELL_KWARGS_EARLY}
288
+
289
+ def mark(f: Callable[..., Any]) -> Callable[..., Any]:
290
+ f.is_gf_vcell = True # type: ignore[attr-defined]
291
+ return f
292
+
293
+ if _func is not None:
294
+ return mark(cell(_func, **kwargs))
295
+ return lambda f: mark(cell(**kwargs)(f))
296
+
297
+
298
+ _CELL_KWARGS_EARLY = set(inspect.signature(cell).parameters) - {"_func"}
299
+
300
+
301
+ def cell_with_module_name(_func: Callable[..., Any] | None = None, /, **kwargs: Any) -> Any:
302
+ """Decorator like ``cell`` but with ``with_module_name=True`` by default."""
303
+ return cell(_func, with_module_name=True, **kwargs)
304
+
305
+
306
+ def schematic_cell(_func: Callable[..., Any] | None = None, /, **kwargs: Any) -> Any:
307
+ """Builds a Component from a function returning a schematic/netlist dict."""
308
+
309
+ def decorator(func: Callable[..., Any]) -> Callable[..., Any]:
310
+ @functools.wraps(func)
311
+ def build(*args: Any, **kw: Any) -> Component:
312
+ from gdsfactory.read.from_yaml import from_yaml
313
+
314
+ schematic = func(*args, **kw)
315
+ netlist = schematic.model_dump() if hasattr(schematic, "model_dump") else schematic
316
+ return from_yaml(netlist)
317
+
318
+ return cell(build, **{k: v for k, v in kwargs.items() if k in _CELL_KWARGS})
319
+
320
+ if _func is not None:
321
+ return decorator(_func)
322
+ return decorator
323
+
324
+
325
+ _CELL_KWARGS = set(inspect.signature(cell).parameters) - {"_func"}
326
+
327
+ __all__ = [
328
+ "cell",
329
+ "cell_with_module_name",
330
+ "clean_name",
331
+ "cached_cells",
332
+ "factories",
333
+ "clear_cache",
334
+ "get_cell_name",
335
+ "schematic_cell",
336
+ "vcell",
337
+ ]
@@ -0,0 +1,13 @@
1
+ import warnings
2
+
3
+ from gdsfactory.config import __next_major_version__
4
+
5
+
6
+ def deprecate(old_name: str, new_name: str | None = None, stacklevel: int = 3) -> None:
7
+ warnings.warn(
8
+ f"{old_name} is deprecated."
9
+ + (f" Use {new_name} instead." if new_name else "")
10
+ + f" It will be removed in {__next_major_version__}.",
11
+ DeprecationWarning,
12
+ stacklevel=stacklevel,
13
+ )
@@ -0,0 +1,36 @@
1
+ """Fail fast when upstream ``gdsfactory`` and ``gdsfactoryx`` are installed together.
2
+
3
+ Both distributions ship the same top-level ``gdsfactory`` package, and pip does not
4
+ stop one from overwriting the other's files. An environment with both installed
5
+ holds an unpredictable mix of the two, so importing it raises instead of
6
+ misbehaving later.
7
+
8
+ The check only fires when *both* distributions are installed. Running gdsfactoryx
9
+ from a source checkout (``PYTHONPATH``) is unaffected, because the ``gdsfactoryx``
10
+ distribution is then not installed.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ from importlib.metadata import PackageNotFoundError, distribution
16
+
17
+
18
+ def _is_installed(name: str) -> bool:
19
+ try:
20
+ distribution(name)
21
+ except PackageNotFoundError:
22
+ return False
23
+ return True
24
+
25
+
26
+ def check_no_conflicting_distribution() -> None:
27
+ """Raise ``ImportError`` if upstream gdsfactory is installed next to gdsfactoryx."""
28
+ if _is_installed("gdsfactory") and _is_installed("gdsfactoryx"):
29
+ raise ImportError(
30
+ "Both the upstream 'gdsfactory' distribution and 'gdsfactoryx' are installed. "
31
+ "They provide the same 'gdsfactory' package and overwrite each other's files. "
32
+ "Fix: pip uninstall -y gdsfactory gdsfactoryx && pip install gdsfactoryx"
33
+ )
34
+
35
+
36
+ check_no_conflicting_distribution()