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.
- gdsfactory/__init__.py +192 -0
- gdsfactory/_cell.py +337 -0
- gdsfactory/_deprecation.py +13 -0
- gdsfactory/_dist_conflict.py +36 -0
- gdsfactory/_jax.py +344 -0
- gdsfactory/_kcl.py +47 -0
- gdsfactory/_ports.py +685 -0
- gdsfactory/add_padding.py +139 -0
- gdsfactory/add_pins.py +628 -0
- gdsfactory/add_ports.py +844 -0
- gdsfactory/boolean.py +89 -0
- gdsfactory/cli.py +191 -0
- gdsfactory/component.py +2754 -0
- gdsfactory/component_layout.py +181 -0
- gdsfactory/components/__init__.py +425 -0
- gdsfactory/components/_schematic.py +202 -0
- gdsfactory/components/analog/__init__.py +14 -0
- gdsfactory/components/analog/_geometry.py +156 -0
- gdsfactory/components/analog/inductors.py +681 -0
- gdsfactory/components/analog/interdigital_capacitor.py +127 -0
- gdsfactory/components/analog/interdigitated_electrodes.py +159 -0
- gdsfactory/components/analog/microstrip.py +213 -0
- gdsfactory/components/analog/transformers.py +1374 -0
- gdsfactory/components/bends/__init__.py +28 -0
- gdsfactory/components/bends/bend_circular.py +197 -0
- gdsfactory/components/bends/bend_circular_heater.py +68 -0
- gdsfactory/components/bends/bend_euler.py +302 -0
- gdsfactory/components/bends/bend_modified_hermite.py +391 -0
- gdsfactory/components/bends/bend_s.py +408 -0
- gdsfactory/components/bends/bend_topic.py +283 -0
- gdsfactory/components/containers/__init__.py +41 -0
- gdsfactory/components/containers/add_fiber_array_optical_south_electrical_north.py +137 -0
- gdsfactory/components/containers/add_termination.py +52 -0
- gdsfactory/components/containers/add_trenches.py +69 -0
- gdsfactory/components/containers/array_component.py +100 -0
- gdsfactory/components/containers/array_hexagonal.py +59 -0
- gdsfactory/components/containers/array_polar.py +86 -0
- gdsfactory/components/containers/component_sequence.py +207 -0
- gdsfactory/components/containers/copy_layers.py +37 -0
- gdsfactory/components/containers/extend_ports_list.py +46 -0
- gdsfactory/components/containers/extension.py +235 -0
- gdsfactory/components/containers/pack_doe.py +183 -0
- gdsfactory/components/containers/splitter_chain.py +58 -0
- gdsfactory/components/containers/splitter_tree.py +157 -0
- gdsfactory/components/couplers/__init__.py +28 -0
- gdsfactory/components/couplers/coupler.py +186 -0
- gdsfactory/components/couplers/coupler90.py +76 -0
- gdsfactory/components/couplers/coupler90bend.py +64 -0
- gdsfactory/components/couplers/coupler_adiabatic.py +127 -0
- gdsfactory/components/couplers/coupler_asymmetric.py +66 -0
- gdsfactory/components/couplers/coupler_bent.py +137 -0
- gdsfactory/components/couplers/coupler_broadband.py +144 -0
- gdsfactory/components/couplers/coupler_full.py +105 -0
- gdsfactory/components/couplers/coupler_pulley.py +152 -0
- gdsfactory/components/couplers/coupler_ring.py +108 -0
- gdsfactory/components/couplers/coupler_straight_asymmetric.py +44 -0
- gdsfactory/components/detectors/__init__.py +3 -0
- gdsfactory/components/detectors/detector_ge.py +83 -0
- gdsfactory/components/dies/__init__.py +22 -0
- gdsfactory/components/dies/align.py +112 -0
- gdsfactory/components/dies/die.py +105 -0
- gdsfactory/components/dies/die_frame_with_pads.py +688 -0
- gdsfactory/components/dies/die_with_pads.py +113 -0
- gdsfactory/components/dies/seal_ring.py +194 -0
- gdsfactory/components/dies/wafer.py +44 -0
- gdsfactory/components/edge_couplers/__init__.py +7 -0
- gdsfactory/components/edge_couplers/edge_coupler_array.py +181 -0
- gdsfactory/components/filters/__init__.py +25 -0
- gdsfactory/components/filters/awg.py +202 -0
- gdsfactory/components/filters/dbr.py +122 -0
- gdsfactory/components/filters/dbr_tapered.py +158 -0
- gdsfactory/components/filters/fiber.py +36 -0
- gdsfactory/components/filters/fiber_array.py +58 -0
- gdsfactory/components/filters/loop_mirror.py +39 -0
- gdsfactory/components/filters/mode_converter.py +102 -0
- gdsfactory/components/filters/polarization_splitter_rotator.py +111 -0
- gdsfactory/components/filters/terminator.py +53 -0
- gdsfactory/components/filters/terminator_spiral.py +58 -0
- gdsfactory/components/grating_couplers/__init__.py +29 -0
- gdsfactory/components/grating_couplers/csv_data/grating_coupler_1etch_h220_e70.csv +51 -0
- gdsfactory/components/grating_couplers/csv_data/grating_coupler_2etch_h220_e70_e220.csv +101 -0
- gdsfactory/components/grating_couplers/functions.py +160 -0
- gdsfactory/components/grating_couplers/grating_coupler_array.py +133 -0
- gdsfactory/components/grating_couplers/grating_coupler_dual_pol.py +148 -0
- gdsfactory/components/grating_couplers/grating_coupler_elliptical.py +196 -0
- gdsfactory/components/grating_couplers/grating_coupler_elliptical_arbitrary.py +235 -0
- gdsfactory/components/grating_couplers/grating_coupler_elliptical_lumerical.py +159 -0
- gdsfactory/components/grating_couplers/grating_coupler_elliptical_trenches.py +163 -0
- gdsfactory/components/grating_couplers/grating_coupler_loss.py +59 -0
- gdsfactory/components/grating_couplers/grating_coupler_rectangular.py +135 -0
- gdsfactory/components/grating_couplers/grating_coupler_rectangular_arbitrary.py +149 -0
- gdsfactory/components/grating_couplers/grating_coupler_tree.py +50 -0
- gdsfactory/components/mems/__init__.py +19 -0
- gdsfactory/components/mems/anchored_flexure.py +101 -0
- gdsfactory/components/mems/bent_beam.py +137 -0
- gdsfactory/components/mems/bolometer.py +194 -0
- gdsfactory/components/mems/cantilever.py +85 -0
- gdsfactory/components/mems/comb_drive.py +254 -0
- gdsfactory/components/mems/doubly_clamped_beam.py +101 -0
- gdsfactory/components/mems/folded_spring.py +163 -0
- gdsfactory/components/mems/gear.py +97 -0
- gdsfactory/components/microfluidics/__init__.py +11 -0
- gdsfactory/components/microfluidics/arrow_junction.py +136 -0
- gdsfactory/components/microfluidics/h_junction.py +132 -0
- gdsfactory/components/microfluidics/meander_channel.py +174 -0
- gdsfactory/components/microfluidics/t_junction.py +112 -0
- gdsfactory/components/mmis/__init__.py +18 -0
- gdsfactory/components/mmis/mmi.py +129 -0
- gdsfactory/components/mmis/mmi1x2.py +110 -0
- gdsfactory/components/mmis/mmi1x2_with_sbend.py +89 -0
- gdsfactory/components/mmis/mmi2x2.py +108 -0
- gdsfactory/components/mmis/mmi2x2_with_sbend.py +83 -0
- gdsfactory/components/mmis/mmi_90degree_hybrid.py +153 -0
- gdsfactory/components/mmis/mmi_tapered.py +189 -0
- gdsfactory/components/mzis/__init__.py +22 -0
- gdsfactory/components/mzis/mzi.py +339 -0
- gdsfactory/components/mzis/mzi_lattice.py +345 -0
- gdsfactory/components/mzis/mzi_pads_center.py +137 -0
- gdsfactory/components/mzis/mzit.py +300 -0
- gdsfactory/components/pads/__init__.py +24 -0
- gdsfactory/components/pads/bump_pad.py +173 -0
- gdsfactory/components/pads/pad.py +201 -0
- gdsfactory/components/pads/pad_gsg.py +108 -0
- gdsfactory/components/pads/pads_shorted.py +42 -0
- gdsfactory/components/pads/rectangle_with_slits.py +105 -0
- gdsfactory/components/pcms/__init__.py +64 -0
- gdsfactory/components/pcms/alignment_mark_cross.py +85 -0
- gdsfactory/components/pcms/cavity.py +56 -0
- gdsfactory/components/pcms/cdsem_all.py +101 -0
- gdsfactory/components/pcms/cdsem_bend180.py +74 -0
- gdsfactory/components/pcms/cdsem_coupler.py +58 -0
- gdsfactory/components/pcms/cdsem_straight.py +55 -0
- gdsfactory/components/pcms/cdsem_straight_density.py +51 -0
- gdsfactory/components/pcms/cutback_2x2.py +187 -0
- gdsfactory/components/pcms/cutback_bend.py +241 -0
- gdsfactory/components/pcms/cutback_component.py +114 -0
- gdsfactory/components/pcms/cutback_loss.py +173 -0
- gdsfactory/components/pcms/cutback_splitter.py +87 -0
- gdsfactory/components/pcms/greek_cross.py +165 -0
- gdsfactory/components/pcms/litho_calipers.py +61 -0
- gdsfactory/components/pcms/litho_ruler.py +39 -0
- gdsfactory/components/pcms/litho_steps.py +52 -0
- gdsfactory/components/pcms/resistance_meander.py +130 -0
- gdsfactory/components/pcms/resistance_sheet.py +73 -0
- gdsfactory/components/pcms/resolution_test_pattern.py +56 -0
- gdsfactory/components/pcms/ruler.py +86 -0
- gdsfactory/components/pcms/vernier_scale.py +74 -0
- gdsfactory/components/pcms/verniers.py +45 -0
- gdsfactory/components/pcms/version_stamp.py +111 -0
- gdsfactory/components/quantum/__init__.py +17 -0
- gdsfactory/components/quantum/coupler_capacitive.py +436 -0
- gdsfactory/components/quantum/flux_qubit.py +446 -0
- gdsfactory/components/quantum/resonator.py +415 -0
- gdsfactory/components/quantum/transmon.py +238 -0
- gdsfactory/components/rings/__init__.py +33 -0
- gdsfactory/components/rings/disk.py +240 -0
- gdsfactory/components/rings/ring.py +71 -0
- gdsfactory/components/rings/ring_crow.py +170 -0
- gdsfactory/components/rings/ring_crow_couplers.py +122 -0
- gdsfactory/components/rings/ring_double.py +117 -0
- gdsfactory/components/rings/ring_double_bend_coupler.py +76 -0
- gdsfactory/components/rings/ring_heater.py +209 -0
- gdsfactory/components/rings/ring_pn.py +347 -0
- gdsfactory/components/rings/ring_single.py +150 -0
- gdsfactory/components/rings/ring_single_array.py +59 -0
- gdsfactory/components/rings/ring_single_bend_coupler.py +228 -0
- gdsfactory/components/rings/ring_single_dut.py +93 -0
- gdsfactory/components/shapes/C.py +66 -0
- gdsfactory/components/shapes/L.py +51 -0
- gdsfactory/components/shapes/__init__.py +59 -0
- gdsfactory/components/shapes/bbox.py +79 -0
- gdsfactory/components/shapes/circle.py +31 -0
- gdsfactory/components/shapes/circle_wave.py +41 -0
- gdsfactory/components/shapes/compass.py +99 -0
- gdsfactory/components/shapes/cross.py +73 -0
- gdsfactory/components/shapes/dash.py +108 -0
- gdsfactory/components/shapes/ellipse.py +38 -0
- gdsfactory/components/shapes/fiducial_squares.py +33 -0
- gdsfactory/components/shapes/fractal.py +135 -0
- gdsfactory/components/shapes/nxn.py +145 -0
- gdsfactory/components/shapes/pie_arc.py +51 -0
- gdsfactory/components/shapes/rect_su_shape.py +113 -0
- gdsfactory/components/shapes/rect_taper.py +75 -0
- gdsfactory/components/shapes/rectangle.py +107 -0
- gdsfactory/components/shapes/regular_polygon.py +72 -0
- gdsfactory/components/shapes/rounded_rectangle.py +107 -0
- gdsfactory/components/shapes/star.py +44 -0
- gdsfactory/components/shapes/torus.py +87 -0
- gdsfactory/components/shapes/torus_wave.py +62 -0
- gdsfactory/components/shapes/triangles.py +139 -0
- gdsfactory/components/spirals/__init__.py +28 -0
- gdsfactory/components/spirals/delay_snake.py +96 -0
- gdsfactory/components/spirals/delay_snake2.py +100 -0
- gdsfactory/components/spirals/delay_snake_sbend.py +164 -0
- gdsfactory/components/spirals/spiral.py +149 -0
- gdsfactory/components/spirals/spiral_archimedes.py +85 -0
- gdsfactory/components/spirals/spiral_double.py +62 -0
- gdsfactory/components/spirals/spiral_fermat.py +67 -0
- gdsfactory/components/spirals/spiral_heater.py +578 -0
- gdsfactory/components/spirals/spiral_inductor.py +81 -0
- gdsfactory/components/spirals/spiral_logarithmic.py +68 -0
- gdsfactory/components/spirals/spiral_rectangular.py +87 -0
- gdsfactory/components/superconductors/__init__.py +15 -0
- gdsfactory/components/superconductors/hline.py +72 -0
- gdsfactory/components/superconductors/optimal_90deg.py +90 -0
- gdsfactory/components/superconductors/optimal_hairpin.py +123 -0
- gdsfactory/components/superconductors/optimal_step.py +211 -0
- gdsfactory/components/superconductors/snspd.py +107 -0
- gdsfactory/components/superconductors/ytron.py +128 -0
- gdsfactory/components/tapers/__init__.py +34 -0
- gdsfactory/components/tapers/csv_data/taper_strip_0p5_10_100.csv +501 -0
- gdsfactory/components/tapers/csv_data/taper_strip_0p5_10_150.csv +501 -0
- gdsfactory/components/tapers/csv_data/taper_strip_0p5_10_200.csv +501 -0
- gdsfactory/components/tapers/csv_data/taper_strip_0p5_11_200.csv +501 -0
- gdsfactory/components/tapers/csv_data/taper_strip_0p5_12_200.csv +501 -0
- gdsfactory/components/tapers/csv_data/taper_strip_0p5_3_36.csv +101 -0
- gdsfactory/components/tapers/ramp.py +45 -0
- gdsfactory/components/tapers/taper.py +358 -0
- gdsfactory/components/tapers/taper_adiabatic.py +136 -0
- gdsfactory/components/tapers/taper_cross_section.py +100 -0
- gdsfactory/components/tapers/taper_from_csv.py +92 -0
- gdsfactory/components/tapers/taper_hecken.py +147 -0
- gdsfactory/components/tapers/taper_meander.py +186 -0
- gdsfactory/components/tapers/taper_parabolic.py +44 -0
- gdsfactory/components/texts/__init__.py +16 -0
- gdsfactory/components/texts/fonts/OCR-A.ttf +0 -0
- gdsfactory/components/texts/text.py +121 -0
- gdsfactory/components/texts/text_freetype.py +125 -0
- gdsfactory/components/texts/text_rectangular.py +116 -0
- gdsfactory/components/texts/text_rectangular_font.py +325 -0
- gdsfactory/components/vias/__init__.py +34 -0
- gdsfactory/components/vias/via.py +129 -0
- gdsfactory/components/vias/via_chain.py +164 -0
- gdsfactory/components/vias/via_corner.py +117 -0
- gdsfactory/components/vias/via_stack.py +485 -0
- gdsfactory/components/vias/via_stack_with_offset.py +229 -0
- gdsfactory/components/waveguides/__init__.py +39 -0
- gdsfactory/components/waveguides/crossing_waveguide.py +308 -0
- gdsfactory/components/waveguides/straight.py +142 -0
- gdsfactory/components/waveguides/straight_heater_doped.py +280 -0
- gdsfactory/components/waveguides/straight_heater_meander.py +268 -0
- gdsfactory/components/waveguides/straight_heater_meander_doped.py +255 -0
- gdsfactory/components/waveguides/straight_heater_metal.py +293 -0
- gdsfactory/components/waveguides/straight_piecewise.py +64 -0
- gdsfactory/components/waveguides/straight_pin.py +98 -0
- gdsfactory/components/waveguides/straight_pin_slot.py +131 -0
- gdsfactory/components/waveguides/wire.py +266 -0
- gdsfactory/config.py +204 -0
- gdsfactory/constants.py +2032 -0
- gdsfactory/containers.py +89 -0
- gdsfactory/cross_section/__init__.py +159 -0
- gdsfactory/cross_section/base.py +518 -0
- gdsfactory/cross_section/heater.py +439 -0
- gdsfactory/cross_section/pn_junction.py +1121 -0
- gdsfactory/cross_section/presets.py +658 -0
- gdsfactory/cross_section/utils.py +373 -0
- gdsfactory/difftest.py +643 -0
- gdsfactory/difftest_git.py +26 -0
- gdsfactory/export/__init__.py +21 -0
- gdsfactory/export/to_3d.py +133 -0
- gdsfactory/export/to_gerber.py +325 -0
- gdsfactory/export/to_np.py +59 -0
- gdsfactory/export/to_stl.py +103 -0
- gdsfactory/export/to_svg.py +153 -0
- gdsfactory/font.py +213 -0
- gdsfactory/functions.py +557 -0
- gdsfactory/generic_tech/__init__.py +57 -0
- gdsfactory/generic_tech/generic_tech.sh +4 -0
- gdsfactory/generic_tech/klayout/README.md +7 -0
- gdsfactory/generic_tech/klayout/d25/generic_tech.lyd25 +65 -0
- gdsfactory/generic_tech/klayout/drc/Makefile +5 -0
- gdsfactory/generic_tech/klayout/drc/errors.py +92 -0
- gdsfactory/generic_tech/klayout/grain.xml +30 -0
- gdsfactory/generic_tech/klayout/layers.lyp +1482 -0
- gdsfactory/generic_tech/klayout/lvs/.gitignore +1 -0
- gdsfactory/generic_tech/klayout/lvs/Makefile +8 -0
- gdsfactory/generic_tech/klayout/lvs/README.md +98 -0
- gdsfactory/generic_tech/klayout/lvs/drc_malformed/README.md +70 -0
- gdsfactory/generic_tech/klayout/lvs/drc_malformed/generic_tech_malformed.drc +369 -0
- gdsfactory/generic_tech/klayout/lvs/drc_malformed/run_drc.py +330 -0
- gdsfactory/generic_tech/klayout/lvs/generic_tech.lvs +258 -0
- gdsfactory/generic_tech/klayout/lvs/rule_decks/custom_classes.lvs +122 -0
- gdsfactory/generic_tech/klayout/lvs/rule_decks/devices_connections.lvs +17 -0
- gdsfactory/generic_tech/klayout/lvs/rule_decks/general_connections.lvs +26 -0
- gdsfactory/generic_tech/klayout/lvs/rule_decks/general_derivations.lvs +3 -0
- gdsfactory/generic_tech/klayout/lvs/rule_decks/heater_connections.lvs +7 -0
- gdsfactory/generic_tech/klayout/lvs/rule_decks/heater_derivations.lvs +13 -0
- gdsfactory/generic_tech/klayout/lvs/rule_decks/heater_extraction.lvs +15 -0
- gdsfactory/generic_tech/klayout/lvs/rule_decks/layers_definitions.lvs +253 -0
- gdsfactory/generic_tech/klayout/lvs/run_lvs.py +285 -0
- gdsfactory/generic_tech/klayout/pymacros/set_menus.lym +33 -0
- gdsfactory/generic_tech/klayout/pymacros/set_shortcuts.lym +23 -0
- gdsfactory/generic_tech/klayout/python/__init__.py +0 -0
- gdsfactory/generic_tech/klayout/python/kgdsfactory/__init__.py +5 -0
- gdsfactory/generic_tech/klayout/python/kgdsfactory/shortcuts.py +100 -0
- gdsfactory/generic_tech/klayout/tech/Makefile +12 -0
- gdsfactory/generic_tech/klayout/tech/d25/generic_tech.lyd25 +65 -0
- gdsfactory/generic_tech/klayout/tech/generic.layerstack +56 -0
- gdsfactory/generic_tech/klayout/tech/xsection_generic.pyxs +149 -0
- gdsfactory/generic_tech/klayout/tech/xsection_generic.xs +139 -0
- gdsfactory/generic_tech/klayout/tech/xsection_planarized.pyxs +175 -0
- gdsfactory/generic_tech/klayout/tech/xsection_planarized.xs +169 -0
- gdsfactory/generic_tech/klayout/tech.lyt +169 -0
- gdsfactory/generic_tech/klayout/xsection/xsection_generic.pyxs +149 -0
- gdsfactory/generic_tech/klayout/xsection/xsection_generic.xs +139 -0
- gdsfactory/generic_tech/klayout/xsection/xsection_planarized.pyxs +175 -0
- gdsfactory/generic_tech/klayout/xsection/xsection_planarized.xs +169 -0
- gdsfactory/generic_tech/layer_map.py +1 -0
- gdsfactory/generic_tech/layer_stack.py +1 -0
- gdsfactory/generic_tech/simulation_settings.py +1 -0
- gdsfactory/get_factories.py +160 -0
- gdsfactory/get_netlist.py +934 -0
- gdsfactory/gpdk/__init__.py +111 -0
- gdsfactory/gpdk/get_klayout_pyxs.py +301 -0
- gdsfactory/gpdk/layer_map.py +70 -0
- gdsfactory/gpdk/layer_stack.py +419 -0
- gdsfactory/gpdk/layer_views.yaml +503 -0
- gdsfactory/gpdk/simulation_settings.py +163 -0
- gdsfactory/grid.py +381 -0
- gdsfactory/install.py +267 -0
- gdsfactory/klayout_bridge.py +606 -0
- gdsfactory/labels/__init__.py +17 -0
- gdsfactory/labels/add_label_yaml.py +85 -0
- gdsfactory/labels/add_labels.py +29 -0
- gdsfactory/labels/ehva.py +92 -0
- gdsfactory/labels/write_labels.py +93 -0
- gdsfactory/labels/write_test_manifest.py +89 -0
- gdsfactory/name.py +229 -0
- gdsfactory/pack.py +299 -0
- gdsfactory/path.py +1946 -0
- gdsfactory/pdk.py +995 -0
- gdsfactory/plot.py +110 -0
- gdsfactory/port.py +851 -0
- gdsfactory/py.typed +0 -0
- gdsfactory/rasterize.py +166 -0
- gdsfactory/read/__init__.py +18 -0
- gdsfactory/read/from_gdspaths.py +39 -0
- gdsfactory/read/from_np.py +117 -0
- gdsfactory/read/from_updk.py +288 -0
- gdsfactory/read/from_yaml.py +2165 -0
- gdsfactory/read/from_yaml_gen.py +582 -0
- gdsfactory/read/from_yaml_template.py +209 -0
- gdsfactory/read/import_gds.py +198 -0
- gdsfactory/routing/__init__.py +63 -0
- gdsfactory/routing/_dual.py +788 -0
- gdsfactory/routing/_kf_router.py +1104 -0
- gdsfactory/routing/_traced_manhattan.py +2838 -0
- gdsfactory/routing/_traced_router.py +279 -0
- gdsfactory/routing/add_electrical_pads_shortest.py +88 -0
- gdsfactory/routing/add_electrical_pads_top.py +92 -0
- gdsfactory/routing/add_electrical_pads_top_dc.py +89 -0
- gdsfactory/routing/add_fiber_array.py +129 -0
- gdsfactory/routing/add_fiber_single.py +196 -0
- gdsfactory/routing/add_pads.py +258 -0
- gdsfactory/routing/auto_taper.py +213 -0
- gdsfactory/routing/factories.py +48 -0
- gdsfactory/routing/fanout2x2.py +95 -0
- gdsfactory/routing/resolve_pins.py +94 -0
- gdsfactory/routing/route_astar.py +641 -0
- gdsfactory/routing/route_bundle.py +673 -0
- gdsfactory/routing/route_bundle_all_angle.py +542 -0
- gdsfactory/routing/route_bundle_sbend.py +166 -0
- gdsfactory/routing/route_dubins.py +317 -0
- gdsfactory/routing/route_fiber_array.py +435 -0
- gdsfactory/routing/route_ports_to_side.py +537 -0
- gdsfactory/routing/route_quad.py +97 -0
- gdsfactory/routing/route_sharp.py +393 -0
- gdsfactory/routing/route_single.py +413 -0
- gdsfactory/routing/route_single_sbend.py +109 -0
- gdsfactory/routing/route_south.py +279 -0
- gdsfactory/routing/sort_ports.py +86 -0
- gdsfactory/routing/utils.py +68 -0
- gdsfactory/routing/validation.py +114 -0
- gdsfactory/samples/00_hello_world.py +15 -0
- gdsfactory/samples/01_component_pcell.py +73 -0
- gdsfactory/samples/01_component_pcell_with_parameters.py +20 -0
- gdsfactory/samples/01_component_pcell_with_ports.py +35 -0
- gdsfactory/samples/02_component_autoname.py +17 -0
- gdsfactory/samples/03_move.py +27 -0
- gdsfactory/samples/04_connect.py +33 -0
- gdsfactory/samples/05_remove_layers.py +30 -0
- gdsfactory/samples/05_remove_layers_overlapping.py +30 -0
- gdsfactory/samples/06_remapping_layers.py +34 -0
- gdsfactory/samples/07_flattening_device.py +34 -0
- gdsfactory/samples/08_delete_cell.py +21 -0
- gdsfactory/samples/08_grid.py +16 -0
- gdsfactory/samples/09_pack.py +16 -0
- gdsfactory/samples/11_component_layout.py +67 -0
- gdsfactory/samples/11_component_layout_bend_s_offset.py +20 -0
- gdsfactory/samples/12_component_instance_arrays.py +16 -0
- gdsfactory/samples/12_component_refs.py +97 -0
- gdsfactory/samples/13_component_netlist.py +64 -0
- gdsfactory/samples/14_component_connectivity.py +92 -0
- gdsfactory/samples/15_component_sequence1.py +57 -0
- gdsfactory/samples/16_component_sequence2.py +58 -0
- gdsfactory/samples/17_port_register_cross_section.py +61 -0
- gdsfactory/samples/17_ports.py +46 -0
- gdsfactory/samples/18_port_pins.py +11 -0
- gdsfactory/samples/19_references.py +31 -0
- gdsfactory/samples/20_components.py +23 -0
- gdsfactory/samples/21_add_fiber_array.py +26 -0
- gdsfactory/samples/22_add_pads.py +15 -0
- gdsfactory/samples/24_doe.py +15 -0
- gdsfactory/samples/24_doe_3.py +20 -0
- gdsfactory/samples/25_slot_cross_section.py +10 -0
- gdsfactory/samples/26_cross_section_copy.py +12 -0
- gdsfactory/samples/30_lidar.py +62 -0
- gdsfactory/samples/30_lidar_pcell.py +78 -0
- gdsfactory/samples/30_lidar_with_pads.py +89 -0
- gdsfactory/samples/30_route_bundle_lidar.py +54 -0
- gdsfactory/samples/33_route_bundle_basic.py +51 -0
- gdsfactory/samples/33_route_bundle_collision_enlarged.py +36 -0
- gdsfactory/samples/33_route_bundle_collision_no_intersect.py +36 -0
- gdsfactory/samples/33_route_bundle_collision_none.py +48 -0
- gdsfactory/samples/33_route_bundle_corner.py +206 -0
- gdsfactory/samples/33_route_bundle_electrical.py +45 -0
- gdsfactory/samples/33_route_bundle_mmi2x2.py +23 -0
- gdsfactory/samples/33_route_bundle_north_south.py +52 -0
- gdsfactory/samples/33_route_bundle_nxn.py +27 -0
- gdsfactory/samples/33_route_bundle_sbend.py +21 -0
- gdsfactory/samples/33_route_bundle_sbend_route_bundle.py +24 -0
- gdsfactory/samples/33_route_bundle_top_bottom.py +48 -0
- gdsfactory/samples/33_route_bundle_u_indirect.py +81 -0
- gdsfactory/samples/33_route_bundle_udirect.py +73 -0
- gdsfactory/samples/34_route_edge_coupler.py +79 -0
- gdsfactory/samples/34_route_edge_coupler_bend_s.py +101 -0
- gdsfactory/samples/35_route_auto_taper.py +22 -0
- gdsfactory/samples/35_route_auto_taper_nitride.py +27 -0
- gdsfactory/samples/35_route_bundle_auto_taper.py +22 -0
- gdsfactory/samples/35_route_bundle_custom_taper.py +23 -0
- gdsfactory/samples/35_route_bundle_low_loss_taper.py +23 -0
- gdsfactory/samples/35_route_bundle_non_manhattan_steps.py +32 -0
- gdsfactory/samples/35_route_bundle_non_manhattan_waypoints.py +33 -0
- gdsfactory/samples/35_route_bundle_steps.py +26 -0
- gdsfactory/samples/35_route_bundle_steps2.py +26 -0
- gdsfactory/samples/35_route_bundle_steps3.py +34 -0
- gdsfactory/samples/35_route_gs.py +38 -0
- gdsfactory/samples/35_route_gs_optical.py +39 -0
- gdsfactory/samples/35_route_single_steps.py +28 -0
- gdsfactory/samples/36_route_gsg.py +44 -0
- gdsfactory/samples/36_route_single.py +22 -0
- gdsfactory/samples/37_path_length_matching_center.py +67 -0
- gdsfactory/samples/37_path_length_matching_end.py +54 -0
- gdsfactory/samples/37_path_length_matching_start.py +64 -0
- gdsfactory/samples/39_route_bundle_all_angle.py +29 -0
- gdsfactory/samples/39_route_bundle_all_angle_rotated.py +25 -0
- gdsfactory/samples/39_route_dubins.py +25 -0
- gdsfactory/samples/39_route_dubins_multi.py +28 -0
- gdsfactory/samples/40_verification.py +27 -0
- gdsfactory/samples/41_verification_routing.py +20 -0
- gdsfactory/samples/__init__.py +0 -0
- gdsfactory/samples/all_angle_routing/aar_basic_01.pic.yml +29 -0
- gdsfactory/samples/all_angle_routing/aar_bundles.pic.yml +252 -0
- gdsfactory/samples/all_angle_routing/aar_error_intermediate_180.pic.yml +26 -0
- gdsfactory/samples/all_angle_routing/aar_error_overconstrained.pic.yml +27 -0
- gdsfactory/samples/all_angle_routing/aar_gone_wrong.pic.yml +95 -0
- gdsfactory/samples/all_angle_routing/aar_implicit_final_angle.pic.yml +71 -0
- gdsfactory/samples/all_angle_routing/aar_slalom.pic.yml +35 -0
- gdsfactory/samples/all_angle_routing/aar_start_end_customizations.pic.yml +178 -0
- gdsfactory/samples/all_angle_routing/aar_step_definitions.pic.yml +90 -0
- gdsfactory/samples/all_angle_routing/aar_tricky_connections.pic.yml +179 -0
- gdsfactory/samples/all_angle_routing/all_angle_routes.pic.yml +209 -0
- gdsfactory/samples/big_device.py +105 -0
- gdsfactory/samples/big_device_electrical.py +94 -0
- gdsfactory/samples/coh_rx_single_pol.py +198 -0
- gdsfactory/samples/coh_tx_dual_pol.py +141 -0
- gdsfactory/samples/coh_tx_single_pol.py +167 -0
- gdsfactory/samples/demo/Makefile +2 -0
- gdsfactory/samples/demo/__init__.py +0 -0
- gdsfactory/samples/demo/circuits/mask.pic.yml +31 -0
- gdsfactory/samples/demo/circuits/mzi_lattice_filter.pic.yml +51 -0
- gdsfactory/samples/demo/circuits/mzi_ubcpdk.pic.yml +35 -0
- gdsfactory/samples/demo/circuits/pads.pic.yml +29 -0
- gdsfactory/samples/demo/circuits/rectangles.pic.yml +17 -0
- gdsfactory/samples/demo/drc_errors.py +96 -0
- gdsfactory/samples/demo/layers_sky130.py +7 -0
- gdsfactory/samples/demo/layers_xsection.py +17 -0
- gdsfactory/samples/demo/lvs.py +95 -0
- gdsfactory/samples/demo/pcell.py +25 -0
- gdsfactory/samples/differentiable_optimization.py +56 -0
- gdsfactory/samples/fixme/route_bundle_bbox.py +30 -0
- gdsfactory/samples/images/logo.png +0 -0
- gdsfactory/samples/netlists/bend_mirror.yml +69 -0
- gdsfactory/samples/netlists/bend_rotated.yml +38 -0
- gdsfactory/samples/netlists/bend_translated_rotated.yml +65 -0
- gdsfactory/samples/netlists/mzi.yml +373 -0
- gdsfactory/samples/netlists/straight_with_bend.yml +52 -0
- gdsfactory/samples/pdk/__init__.py +0 -0
- gdsfactory/samples/pdk/fab_c.py +256 -0
- gdsfactory/samples/pdk/fab_d/__init__.py +27 -0
- gdsfactory/samples/pdk/fab_d/phase_shifters.py +77 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_bend_euler_nc_.yml +16 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_bend_euler_no_.yml +16 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_bend_euler_sc_.yml +16 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_bend_euler_so_.yml +16 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_gc_sc_.yml +6 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_mmi1x2_nc_.yml +6 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_mmi1x2_no_.yml +6 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_mmi1x2_sc_.yml +6 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_mmi1x2_so_.yml +6 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_mzi_nc_.yml +22 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_mzi_no_.yml +22 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_straight_nc_.yml +11 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_straight_no_.yml +11 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_straight_sc_.yml +11 -0
- gdsfactory/samples/pdk/test_fab_c/test_settings_straight_so_.yml +11 -0
- gdsfactory/samples/route_astar.py +50 -0
- gdsfactory/samples/route_astar2.py +51 -0
- gdsfactory/samples/route_bundle_bbox2.py +33 -0
- gdsfactory/samples/route_bundle_yaml.py +39 -0
- gdsfactory/samples/sample_array_ports.py +17 -0
- gdsfactory/samples/sample_bend_angular_resolution.py +30 -0
- gdsfactory/samples/sample_bend_point_resolution.py +28 -0
- gdsfactory/samples/sample_bend_points.py +35 -0
- gdsfactory/samples/sample_bend_points_distance.py +32 -0
- gdsfactory/samples/sample_bend_s_offset.py +23 -0
- gdsfactory/samples/sample_extend_ports.py +30 -0
- gdsfactory/samples/sample_extend_ports_xs.py +49 -0
- gdsfactory/samples/sample_justify.py +14 -0
- gdsfactory/samples/sample_mzis.py +17 -0
- gdsfactory/samples/sample_reticle.py +115 -0
- gdsfactory/samples/sample_reticle_electrical_with_labels.py +118 -0
- gdsfactory/samples/sample_reticle_with_labels.py +159 -0
- gdsfactory/samples/sample_route_astar.py +45 -0
- gdsfactory/samples/sample_route_bundle.py +45 -0
- gdsfactory/samples/sample_route_error.py +79 -0
- gdsfactory/samples/sample_routing_auto_taper.py +48 -0
- gdsfactory/samples/sample_routing_challenge.py +32 -0
- gdsfactory/samples/sample_routing_sbend.py +20 -0
- gdsfactory/samples/sample_sbend.py +17 -0
- gdsfactory/samples/sample_taper_offsets.py +52 -0
- gdsfactory/samples/sample_to_3d.py +19 -0
- gdsfactory/samples/sample_to_3d_electrical.py +17 -0
- gdsfactory/samples/small_bends.py +67 -0
- gdsfactory/samples/snap_bends.py +19 -0
- gdsfactory/samples/snap_bends_fixed.py +25 -0
- gdsfactory/samples/snap_issue.py +16 -0
- gdsfactory/schematic.py +490 -0
- gdsfactory/serialization.py +252 -0
- gdsfactory/snap.py +135 -0
- gdsfactory/symbols.py +115 -0
- gdsfactory/technology/__init__.py +31 -0
- gdsfactory/technology/color_utils.py +10 -0
- gdsfactory/technology/klayout_tech.py +189 -0
- gdsfactory/technology/layer_map.py +57 -0
- gdsfactory/technology/layer_stack.py +740 -0
- gdsfactory/technology/layer_views.py +1298 -0
- gdsfactory/technology/processes.py +289 -0
- gdsfactory/technology/variation.py +50 -0
- gdsfactory/technology/xml_utils.py +27 -0
- gdsfactory/technology/yaml_utils.py +55 -0
- gdsfactory/transform.py +185 -0
- gdsfactory/typings.py +322 -0
- gdsfactory/utils.py +29 -0
- gdsfactory/watch.py +363 -0
- gdsfactory/write_cells.py +156 -0
- gdsfactoryx-9.51.0.dist-info/METADATA +360 -0
- gdsfactoryx-9.51.0.dist-info/RECORD +561 -0
- gdsfactoryx-9.51.0.dist-info/WHEEL +4 -0
- gdsfactoryx-9.51.0.dist-info/entry_points.txt +3 -0
- 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()
|