gplugins 2.0.0__tar.gz → 2.0.1__tar.gz
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.
- {gplugins-2.0.0 → gplugins-2.0.1}/PKG-INFO +4 -4
- {gplugins-2.0.0 → gplugins-2.0.1}/README.md +1 -1
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/__init__.py +1 -1
- gplugins-2.0.1/gplugins/common/utils/geometry.py +31 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/elmer/get_capacitance.py +1 -4
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/meow/meow_eme.py +4 -3
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/meshwell/get_meshwell_3D.py +20 -46
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/meshwell/get_meshwell_cross_section.py +1 -119
- gplugins-2.0.1/gplugins/meshwell/tests/test_meshwell.py +69 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/palace/get_capacitance.py +13 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/palace/tests/test_palace.py +46 -17
- {gplugins-2.0.0 → gplugins-2.0.1}/pyproject.toml +4 -4
- {gplugins-2.0.0 → gplugins-2.0.1}/LICENSE +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/base_models/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/base_models/component.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/base_models/simulation.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/config.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/types.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/add_simulation_markers.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/async_helpers.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/cache.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/convert_sparameters.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/disable_print.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/get_capacitance.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/get_component_with_net_layers.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/get_effective_indices.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/get_scattering.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/get_sparameters_path.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/optical_constants.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/parse_layer_stack.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/plot.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/plot_csv.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/port_symmetries.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/common/utils/tests/test_get_component_with_new_port_layers.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/devsim/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/devsim/doping.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/devsim/get_simulation.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/devsim/get_simulation_xsection.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/devsim/get_solver.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/devsim/test_devsim.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/elmer/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/elmer/electrostatic.sif.j2 +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/elmer/tests/test_elmer.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/fdtdz/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/fdtdz/get_epsilon_fdtdz.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/fdtdz/get_ports_fdtdz.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/fdtdz/get_sparameters_fdtdz.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/femwell/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/femwell/mode_solver.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/femwell/solve_thermal.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/femwell/test_mode_solver.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gfviz/Makefile +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gfviz/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gfviz/b64.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gfviz/gfviz.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gfviz/netlist.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gfviz/serve.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gfviz/static/b64.js +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gfviz/static/schemedit.js +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gfviz/static/schemedit.wasm +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gfviz/templates/example.json +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gfviz/templates/index.html +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/get_material.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/get_meep_geometry.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/get_port_eigenmode.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/get_simulation.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/get_simulation_grating_farfield.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/get_simulation_grating_fiber.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/meep_adjoint_optimization.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_eigenmode.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_materials.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_sparameterNxN/test_sparameterNxN_crossing.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_sparameterNxN/test_sparameterNxN_straight.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_write_sparameters_meep/test_sparameterNxN_crossing.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_write_sparameters_meep/test_sparameterNxN_straight.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_write_sparameters_meep/test_sparameterNxN_symmetries_straight.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_write_sparameters_meep/test_sparameter_straight_mpi.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_write_sparameters_meep/test_sparameter_straight_mpi_pool.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_write_sparameters_meep/test_sparameters_crossing_symmetric.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_write_sparameters_meep/test_sparameters_straight.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_write_sparameters_meep/test_sparameters_straight_batch.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_write_sparameters_meep/test_sparameters_straight_mpi.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_write_sparameters_meep/test_sparameters_straight_mpi_pool.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_write_sparameters_meep/test_sparameters_straight_symmetric.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/test_write_sparameters_meep.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/write_sparameters_grating.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/write_sparameters_meep.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/write_sparameters_meep_batch.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/gmeep/write_sparameters_meep_mpi.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/dataprep/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/dataprep/regions.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/drc/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/drc/check_duplicated_cells.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/drc/check_exclusion.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/drc/check_inclusion.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/drc/check_space.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/drc/check_width.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/drc/count_drc.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/drc/samples/drc_errors.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/drc/write_drc.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/get_density.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/get_netlist.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/netlist_graph.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/netlist_spice_reader.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/plot_nets.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/tests/test_dataprep_regions.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/tests/test_density.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/tests/test_drc_exclusion.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/tests/test_drc_inclusion.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/tests/test_drc_space.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/tests/test_drc_width.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/tests/test_global_density.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/tests/test_netlist_spice_reader.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/klayout/tests/test_plot_nets.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/lumerical/README.md +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/lumerical/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/lumerical/interconnect.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/lumerical/mapping_ubcpdk.yml +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/lumerical/read.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/lumerical/settings.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/lumerical/tests/test_lumerical_read_sparameters.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/lumerical/tests/test_netlist.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/lumerical/tests/test_netlist_get_routes.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/lumerical/write_sparameters_lumerical.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/lumerical/write_sparameters_lumerical_components.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/materials/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/materials/inorganic.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/materials/optical/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/materials/optical/optical_mat.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/materials/optical/refractive_index_info.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/materials/semiconductor/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/materials/semiconductor/semiconductor_mat.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/meow/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/meow/test_meow_simulation.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/meshwell/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/coupler.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/find_coupling_vs_gap.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/find_mode_dispersion.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/find_modes.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/find_modes_cross_section.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/find_neff_ng_dw_dh.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/find_neff_vs_width.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/get_mode_solver_coupler.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/get_mode_solver_cross_section.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/get_mode_solver_rib.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/modes/neff_vs_width_nitride.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/modes/neff_vs_width_rib.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/modes/neff_vs_width_strip.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/neff_convergence_test.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/neff_vs_width.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/overlap.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/tests/test_dw_dh/test_dw_dh.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/tests/test_dw_dh/test_dw_dh.obtained.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/tests/test_dw_dh/test_dw_dh_dispersion.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/tests/test_dw_dh.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/tests/test_find_modes.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/tests/test_find_modes_dispersion.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/tests/test_neff_vs_width/test_neff_vs_width.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/tests/test_neff_vs_width/test_neff_vs_width.obtained.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/tests/test_neff_vs_width.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/types.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/modes/waveguide.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/palace/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/palace/driven.json +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/palace/electrostatic.json +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/palace/get_scattering.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/path_length_analysis/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/path_length_analysis/path_length_analysis.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/path_length_analysis/path_length_analysis_from_gds.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/path_length_analysis/test_pathlength_extraction.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/path_length_analysis/test_pathlength_extraction_from_gds.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/path_length_analysis/test_pathlength_extraction_utils.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/path_length_analysis/utils.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/photonic_circuit_models/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/photonic_circuit_models/coupler.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/photonic_circuit_models/fsr.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/photonic_circuit_models/heater.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/photonic_circuit_models/mzi.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/photonic_circuit_models/ring.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/process/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/process/diffusion.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/process/implant_tables.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/process/pysrim.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/process/silicon.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/process/skew/antimony_si_skew.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/process/skew/arsenic_si_skew.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/process/skew/boron_si_skew.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/process/skew/phosphorus_si_skew.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/interpolators.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/mlp.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/models.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/parameter.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/plot_model.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/read.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/strategy.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/tests/test_mzi.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/tests/test_mzi_lattice/test_mzi_lattice.obtained.yml +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/tests/test_mzi_lattice/test_mzi_lattice.yml +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/tests/test_mzi_lattice.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sax/tests/test_parameters.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sentaurus/mask_sde.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sentaurus/mask_sprocess.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sentaurus/sde.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sentaurus/sdevice.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sentaurus/sprocess.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/sentaurus/svisual.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/spice/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/spice/spice_to_yaml.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/spice/tests/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/spice/tests/test_interconnect.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/component.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/get_results.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/get_simulation_grating_coupler.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/materials.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/modes.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/tests/test_component_modeler.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/tests/test_materials.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/tests/test_modes/test_sweep_width.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/tests/test_modes/test_sweep_width.obtained.csv +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/tests/test_modes_coupler.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/tests/test_modes_waveguide.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/tests/test_plot_simulation_grating_coupler.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/tests/test_write_sparameters.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/tests/tests_sparameters/sim_ref.yaml +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/tests/tests_sparameters/test_write_sparameters.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/tests/tests_sparameters/test_write_sparameters_grating_coupler.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/types.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/util.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/tidy3d/write_sparameters_grating_coupler.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/typings.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/vlsir/__init__.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/vlsir/export_netlist.py +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/vlsir/tests/resources/pads_correct.cir +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/vlsir/tests/resources/pads_correct.scs +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/vlsir/tests/resources/pads_correct.sp +0 -0
- {gplugins-2.0.0 → gplugins-2.0.1}/gplugins/vlsir/tests/test_vlsir.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gplugins
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.1
|
|
4
4
|
Summary: gdsfactory plugins
|
|
5
5
|
Keywords: python
|
|
6
6
|
Author-email: gdsfactory <contact@gdsfactory.com>
|
|
@@ -49,14 +49,14 @@ Requires-Dist: mypy ; extra == "maintainer"
|
|
|
49
49
|
Requires-Dist: tbump ; extra == "maintainer"
|
|
50
50
|
Requires-Dist: towncrier ; extra == "maintainer"
|
|
51
51
|
Requires-Dist: meow-sim>=0.14.1,<0.15 ; extra == "meow"
|
|
52
|
-
Requires-Dist: sax
|
|
52
|
+
Requires-Dist: sax~=0.16.3 ; extra == "meow"
|
|
53
53
|
Requires-Dist: tidy3d>=2.8.2,<2.9 ; extra == "meow"
|
|
54
54
|
Requires-Dist: shapely ; extra == "meshwell"
|
|
55
55
|
Requires-Dist: meshwell~=2.1.1 ; extra == "meshwell"
|
|
56
56
|
Requires-Dist: bokeh ; extra == "path-length-analysis"
|
|
57
57
|
Requires-Dist: numba ; extra == "path-length-analysis"
|
|
58
58
|
Requires-Dist: shapely ; extra == "path-length-analysis"
|
|
59
|
-
Requires-Dist: sax~=0.
|
|
59
|
+
Requires-Dist: sax~=0.16.3 ; extra == "sax"
|
|
60
60
|
Requires-Dist: bokeh ; extra == "schematic"
|
|
61
61
|
Requires-Dist: ipywidgets ; extra == "schematic"
|
|
62
62
|
Requires-Dist: natsort ; extra == "schematic"
|
|
@@ -80,7 +80,7 @@ Provides-Extra: schematic
|
|
|
80
80
|
Provides-Extra: tidy3d
|
|
81
81
|
Provides-Extra: vlsir
|
|
82
82
|
|
|
83
|
-
# gplugins 2.0.
|
|
83
|
+
# gplugins 2.0.1
|
|
84
84
|
|
|
85
85
|
[](https://gdsfactory.github.io/gplugins/)
|
|
86
86
|
[](https://pypi.org/project/gplugins/)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
import gdsfactory as gf
|
|
3
|
+
import kfactory as kf
|
|
4
|
+
from shapely.geometry import Polygon, MultiPolygon
|
|
5
|
+
|
|
6
|
+
def region_to_shapely_polygons(region: kf.kdb.Region) -> MultiPolygon:
|
|
7
|
+
"""Convert a kfactory Region to a list of Shapely polygons."""
|
|
8
|
+
polygons = []
|
|
9
|
+
for polygon_kdb in region.each():
|
|
10
|
+
exterior_coords = [
|
|
11
|
+
(gf.kcl.to_um(point.x), gf.kcl.to_um(point.y))
|
|
12
|
+
for point in polygon_kdb.each_point_hull()
|
|
13
|
+
]
|
|
14
|
+
# Extract hole coordinates
|
|
15
|
+
holes = []
|
|
16
|
+
num_holes = polygon_kdb.holes()
|
|
17
|
+
for hole_idx in range(num_holes):
|
|
18
|
+
hole_coords = []
|
|
19
|
+
for point in polygon_kdb.each_point_hole(hole_idx):
|
|
20
|
+
hole_coords.append((gf.kcl.to_um(point.x), gf.kcl.to_um(point.y)))
|
|
21
|
+
holes.append(hole_coords)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# Create Shapely polygon
|
|
25
|
+
if holes:
|
|
26
|
+
polygon = Polygon(exterior_coords, holes)
|
|
27
|
+
else:
|
|
28
|
+
polygon = Polygon(exterior_coords)
|
|
29
|
+
polygons.append(polygon)
|
|
30
|
+
|
|
31
|
+
return MultiPolygon(polygons)
|
|
@@ -224,10 +224,7 @@ def run_capacitive_simulation_elmer(
|
|
|
224
224
|
else:
|
|
225
225
|
prisms = get_meshwell_prisms(
|
|
226
226
|
component=component,
|
|
227
|
-
type="3D",
|
|
228
|
-
filename=simulation_folder / filename,
|
|
229
227
|
layer_stack=layer_stack,
|
|
230
|
-
n_threads=n_processes,
|
|
231
228
|
)
|
|
232
229
|
cad(
|
|
233
230
|
entities_list=prisms,
|
|
@@ -263,7 +260,7 @@ def run_capacitive_simulation_elmer(
|
|
|
263
260
|
# Signals are converted to Elmer Boundary Conditions
|
|
264
261
|
ground_layers = {
|
|
265
262
|
next(k for k, v in layer_stack.layers.items() if v.layer == port.layer)
|
|
266
|
-
for port in component.
|
|
263
|
+
for port in component.ports
|
|
267
264
|
} # ports allowed only on metal
|
|
268
265
|
metal_surfaces = [
|
|
269
266
|
e for e in mesh_surface_entities if any(ground in e for ground in ground_layers)
|
|
@@ -286,9 +286,10 @@ class MEOW:
|
|
|
286
286
|
"""Convert LayerStack to meow extrusions."""
|
|
287
287
|
extrusions = {}
|
|
288
288
|
for layer in self.layer_stack.layers.values():
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
289
|
+
layer_tuple = gf.get_layer_tuple((layer.derived_layer or layer.layer).layer)
|
|
290
|
+
if layer_tuple not in extrusions.keys():
|
|
291
|
+
extrusions[layer_tuple] = []
|
|
292
|
+
extrusions[layer_tuple].append(
|
|
292
293
|
mw.GdsExtrusionRule(
|
|
293
294
|
material=self.gf_material_to_meow_material(
|
|
294
295
|
layer.material,
|
|
@@ -1,41 +1,13 @@
|
|
|
1
1
|
import gdsfactory as gf
|
|
2
2
|
from meshwell.polyprism import PolyPrism
|
|
3
|
-
from typing import List, Dict
|
|
3
|
+
from typing import List, Dict, Literal
|
|
4
4
|
from shapely.geometry import Polygon, MultiPolygon
|
|
5
5
|
import math
|
|
6
6
|
import kfactory as kf
|
|
7
7
|
from gdsfactory.add_padding import add_padding_container, add_padding
|
|
8
8
|
from functools import partial
|
|
9
9
|
from gdsfactory.generic_tech.layer_map import LAYER
|
|
10
|
-
from
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def region_to_shapely_polygons(region: kf.kdb.Region) -> List[Polygon]:
|
|
14
|
-
"""Convert a kfactory Region to a list of Shapely polygons."""
|
|
15
|
-
polygons = []
|
|
16
|
-
for polygon_kdb in region.each():
|
|
17
|
-
# Extract exterior coordinates
|
|
18
|
-
exterior_coords = []
|
|
19
|
-
for point in polygon_kdb.each_point_hull():
|
|
20
|
-
exterior_coords.append((gf.kcl.to_um(point.x), gf.kcl.to_um(point.y)))
|
|
21
|
-
|
|
22
|
-
# Extract hole coordinates
|
|
23
|
-
holes = []
|
|
24
|
-
for hole_idx in range(polygon_kdb.holes()):
|
|
25
|
-
hole_coords = []
|
|
26
|
-
hole = polygon_kdb.hole(hole_idx)
|
|
27
|
-
for point in hole.each_point():
|
|
28
|
-
hole_coords.append((gf.kcl.to_um(point.x), gf.kcl.to_um(point.y)))
|
|
29
|
-
holes.append(hole_coords)
|
|
30
|
-
|
|
31
|
-
# Create Shapely polygon
|
|
32
|
-
if holes:
|
|
33
|
-
polygon = Polygon(exterior_coords, holes)
|
|
34
|
-
else:
|
|
35
|
-
polygon = Polygon(exterior_coords)
|
|
36
|
-
polygons.append(polygon)
|
|
37
|
-
|
|
38
|
-
return MultiPolygon(polygons)
|
|
10
|
+
from gplugins.common.utils.geometry import region_to_shapely_polygons
|
|
39
11
|
|
|
40
12
|
|
|
41
13
|
def build_buffer_dict_from_layer_level(
|
|
@@ -132,25 +104,27 @@ def get_meshwell_prisms(
|
|
|
132
104
|
|
|
133
105
|
return prisms
|
|
134
106
|
|
|
135
|
-
|
|
136
107
|
if __name__ == "__main__":
|
|
137
|
-
from gdsfactory.components import ge_detector_straight_si_contacts
|
|
108
|
+
from gdsfactory.components import ge_detector_straight_si_contacts, add_frame
|
|
138
109
|
from gdsfactory.generic_tech.layer_stack import get_layer_stack
|
|
139
110
|
from gdsfactory.generic_tech.layer_map import LAYER
|
|
140
111
|
from meshwell.cad import cad
|
|
141
112
|
from meshwell.mesh import mesh
|
|
142
113
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
output_file="
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
114
|
+
|
|
115
|
+
for component in [ge_detector_straight_si_contacts, add_frame]:
|
|
116
|
+
c = component()
|
|
117
|
+
prisms = get_meshwell_prisms(
|
|
118
|
+
component=c,
|
|
119
|
+
layer_stack=get_layer_stack(sidewall_angle_wg=0),
|
|
120
|
+
name_by="layer",
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
cad(entities_list=prisms, output_file=f"meshwell_prisms_3D_{c.name}.xao")
|
|
124
|
+
mesh(
|
|
125
|
+
input_file=f"meshwell_prisms_3D_{c.name}.xao",
|
|
126
|
+
output_file=f"meshwell_prisms_3D_{c.name}.msh",
|
|
127
|
+
default_characteristic_length=1000,
|
|
128
|
+
dim=3,
|
|
129
|
+
verbosity=10,
|
|
130
|
+
)
|
|
@@ -11,125 +11,7 @@ from functools import partial
|
|
|
11
11
|
from gdsfactory.generic_tech.layer_map import LAYER
|
|
12
12
|
from typing import Literal
|
|
13
13
|
import numpy as np
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def region_to_shapely_polygons(region: kf.kdb.Region) -> List[Polygon]:
|
|
17
|
-
"""Convert a kfactory Region to a list of Shapely polygons."""
|
|
18
|
-
polygons = []
|
|
19
|
-
for polygon_kdb in region.each():
|
|
20
|
-
# Extract exterior coordinates
|
|
21
|
-
exterior_coords = []
|
|
22
|
-
for point in polygon_kdb.each_point_hull():
|
|
23
|
-
exterior_coords.append((gf.kcl.to_um(point.x), gf.kcl.to_um(point.y)))
|
|
24
|
-
|
|
25
|
-
# Extract hole coordinates
|
|
26
|
-
holes = []
|
|
27
|
-
for hole_idx in range(polygon_kdb.holes()):
|
|
28
|
-
hole_coords = []
|
|
29
|
-
hole = polygon_kdb.hole(hole_idx)
|
|
30
|
-
for point in hole.each_point():
|
|
31
|
-
hole_coords.append((gf.kcl.to_um(point.x), gf.kcl.to_um(point.y)))
|
|
32
|
-
holes.append(hole_coords)
|
|
33
|
-
|
|
34
|
-
# Create Shapely polygon
|
|
35
|
-
if holes:
|
|
36
|
-
polygon = Polygon(exterior_coords, holes)
|
|
37
|
-
else:
|
|
38
|
-
polygon = Polygon(exterior_coords)
|
|
39
|
-
polygons.append(polygon)
|
|
40
|
-
|
|
41
|
-
return MultiPolygon(polygons)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def build_buffer_dict_from_layer_level(layer_level: gf.technology.LayerLevel) -> Dict[float, float]:
|
|
45
|
-
"""Build buffer dictionary from LayerLevel properties."""
|
|
46
|
-
zmin = layer_level.zmin
|
|
47
|
-
zmax = zmin + layer_level.thickness
|
|
48
|
-
|
|
49
|
-
# Priority 1: z_to_bias if available
|
|
50
|
-
if layer_level.z_to_bias is not None:
|
|
51
|
-
z_values, bias_values = layer_level.z_to_bias
|
|
52
|
-
return dict(zip(z_values, bias_values))
|
|
53
|
-
|
|
54
|
-
# Priority 2: Handle sidewall angle
|
|
55
|
-
if layer_level.sidewall_angle != 0.0:
|
|
56
|
-
angle_rad = math.radians(layer_level.sidewall_angle)
|
|
57
|
-
height = layer_level.thickness
|
|
58
|
-
width_to_z = layer_level.width_to_z
|
|
59
|
-
|
|
60
|
-
# Calculate buffer change due to sidewall angle
|
|
61
|
-
# Positive angle means outward sloping, negative means inward
|
|
62
|
-
buffer_change = height * math.tan(angle_rad)
|
|
63
|
-
|
|
64
|
-
if width_to_z == 0.0: # Reference at bottom
|
|
65
|
-
bottom_buffer = 0.0
|
|
66
|
-
top_buffer = buffer_change
|
|
67
|
-
elif width_to_z == 1.0: # Reference at top
|
|
68
|
-
bottom_buffer = -buffer_change
|
|
69
|
-
top_buffer = 0.0
|
|
70
|
-
else: # Reference somewhere in middle
|
|
71
|
-
ref_height = height * width_to_z
|
|
72
|
-
bottom_buffer = -ref_height * math.tan(angle_rad)
|
|
73
|
-
top_buffer = (height - ref_height) * math.tan(angle_rad)
|
|
74
|
-
|
|
75
|
-
return {zmin: bottom_buffer, zmax: top_buffer}
|
|
76
|
-
|
|
77
|
-
# Default: Simple extrusion
|
|
78
|
-
return {zmin: 0.0, zmax: 0.0}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
def get_meshwell_prisms(
|
|
82
|
-
component: gf.Component,
|
|
83
|
-
layer_stack: gf.technology.LayerStack,
|
|
84
|
-
wafer_layer: gf.typings.Layer | None = LAYER.WAFER,
|
|
85
|
-
wafer_padding: float | None = 0.0,
|
|
86
|
-
name_by: Literal["layer", "material"] = "layer"
|
|
87
|
-
) -> List[PolyPrism]:
|
|
88
|
-
"""Convert LayerStack + Component to meshwell PolyPrism objects."""
|
|
89
|
-
prisms = []
|
|
90
|
-
|
|
91
|
-
if wafer_padding is not None and wafer_layer is not None:
|
|
92
|
-
component = add_padding_container(component=component, function=partial(add_padding, layers=(wafer_layer,), default=wafer_padding))
|
|
93
|
-
|
|
94
|
-
# Iterate through each layer in the stack
|
|
95
|
-
for layer_name, layer_level in layer_stack.layers.items():
|
|
96
|
-
|
|
97
|
-
# Get shapes for this layer from the component
|
|
98
|
-
region = layer_level.layer.get_shapes(component)
|
|
99
|
-
|
|
100
|
-
# Skip if no shapes found
|
|
101
|
-
if region.is_empty():
|
|
102
|
-
continue
|
|
103
|
-
|
|
104
|
-
# Convert kfactory Region to Shapely polygons
|
|
105
|
-
shapely_polygons = region_to_shapely_polygons(region)
|
|
106
|
-
|
|
107
|
-
# Skip if no valid polygons
|
|
108
|
-
if not shapely_polygons:
|
|
109
|
-
continue
|
|
110
|
-
|
|
111
|
-
# Build buffer dictionary from layer level properties
|
|
112
|
-
buffers = build_buffer_dict_from_layer_level(layer_level)
|
|
113
|
-
|
|
114
|
-
# Create PolyPrism object
|
|
115
|
-
if name_by == "layer":
|
|
116
|
-
physical_name = layer_name
|
|
117
|
-
elif name_by == "material":
|
|
118
|
-
physical_name = layer_level.material
|
|
119
|
-
else:
|
|
120
|
-
raise ValueError("name_by must be 'layer' or 'material'")
|
|
121
|
-
prism = PolyPrism(
|
|
122
|
-
polygons=shapely_polygons,
|
|
123
|
-
buffers=buffers,
|
|
124
|
-
physical_name=physical_name,
|
|
125
|
-
mesh_order=layer_level.mesh_order,
|
|
126
|
-
mesh_bool=True,
|
|
127
|
-
additive=False
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
prisms.append(prism)
|
|
131
|
-
|
|
132
|
-
return prisms
|
|
14
|
+
from gplugins.common.utils.geometry import region_to_shapely_polygons
|
|
133
15
|
|
|
134
16
|
|
|
135
17
|
def get_u_bounds_polygons(
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
import gdsfactory as gf
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
from gdsfactory.components import bend_circular, add_frame
|
|
6
|
+
from gdsfactory.generic_tech.layer_stack import get_layer_stack
|
|
7
|
+
from meshwell.cad import cad
|
|
8
|
+
from meshwell.mesh import mesh
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from tempfile import TemporaryDirectory
|
|
11
|
+
from gplugins.meshwell import (
|
|
12
|
+
get_meshwell_prisms, get_meshwell_cross_section
|
|
13
|
+
)
|
|
14
|
+
from shapely.geometry import LineString
|
|
15
|
+
|
|
16
|
+
@pytest.mark.parametrize("component", [(bend_circular), (add_frame)])
|
|
17
|
+
def test_prisms(component) -> None:
|
|
18
|
+
prisms = get_meshwell_prisms(
|
|
19
|
+
component=component(),
|
|
20
|
+
layer_stack=get_layer_stack(sidewall_angle_wg=0),
|
|
21
|
+
name_by="layer",
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
with TemporaryDirectory() as tmp_dir:
|
|
25
|
+
xao_file = Path(tmp_dir) / "meshwell_prisms_3D.xao"
|
|
26
|
+
msh_file = Path(tmp_dir) / "meshwell_prisms_3D.msh"
|
|
27
|
+
cad(entities_list=prisms, output_file=xao_file)
|
|
28
|
+
mesh(
|
|
29
|
+
input_file=xao_file,
|
|
30
|
+
output_file=msh_file,
|
|
31
|
+
default_characteristic_length=1000,
|
|
32
|
+
dim=3,
|
|
33
|
+
verbosity=10,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_prisms_empty_component() -> None:
|
|
38
|
+
"""Test that get_meshwell_prisms handles empty components gracefully."""
|
|
39
|
+
c = gf.Component()
|
|
40
|
+
prisms = get_meshwell_prisms(
|
|
41
|
+
component=c,
|
|
42
|
+
layer_stack=get_layer_stack(sidewall_angle_wg=0),
|
|
43
|
+
name_by="layer",
|
|
44
|
+
wafer_padding=None,
|
|
45
|
+
)
|
|
46
|
+
assert len(prisms) == 0
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@pytest.mark.parametrize("component", [(bend_circular), (add_frame)])
|
|
50
|
+
def test_cross_section(component) -> None:
|
|
51
|
+
cross_section_line = LineString([(4, -15), (4, 15)])
|
|
52
|
+
surfaces = get_meshwell_cross_section(
|
|
53
|
+
component=component(),
|
|
54
|
+
line=cross_section_line,
|
|
55
|
+
layer_stack=get_layer_stack(sidewall_angle_wg=0),
|
|
56
|
+
name_by="layer",
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
with TemporaryDirectory() as tmp_dir:
|
|
60
|
+
xao_file = Path(tmp_dir) / "meshwell_prisms_3D.xao"
|
|
61
|
+
msh_file = Path(tmp_dir) / "meshwell_prisms_3D.msh"
|
|
62
|
+
cad(entities_list=surfaces, output_file=xao_file)
|
|
63
|
+
mesh(
|
|
64
|
+
input_file=xao_file,
|
|
65
|
+
output_file=msh_file,
|
|
66
|
+
default_characteristic_length=1000,
|
|
67
|
+
dim=2,
|
|
68
|
+
verbosity=10,
|
|
69
|
+
)
|
|
@@ -246,6 +246,19 @@ def run_capacitive_simulation_palace(
|
|
|
246
246
|
|
|
247
247
|
.. _Palace: https://github.com/awslabs/palace
|
|
248
248
|
"""
|
|
249
|
+
if not isinstance(n_processes, int):
|
|
250
|
+
raise TypeError(f"n_processes must be an integer, got {type(n_processes)}")
|
|
251
|
+
if n_processes < 1:
|
|
252
|
+
raise ValueError(f"n_processes must be >= 1, got {n_processes}")
|
|
253
|
+
|
|
254
|
+
if solver_config:
|
|
255
|
+
order = solver_config.get("Order")
|
|
256
|
+
if order is not None:
|
|
257
|
+
if not isinstance(order, int):
|
|
258
|
+
raise TypeError(f"Solver Order must be an integer, got {type(order)}")
|
|
259
|
+
if order < 1:
|
|
260
|
+
raise ValueError(f"Solver Order must be >= 1, got {order}")
|
|
261
|
+
|
|
249
262
|
if layer_stack is None:
|
|
250
263
|
layer_stack = LayerStack(
|
|
251
264
|
layers={
|
|
@@ -63,17 +63,17 @@ def get_reasonable_mesh_parameters_capacitance(c: Component):
|
|
|
63
63
|
# port_names=[port.name for port in c.ports],
|
|
64
64
|
default_characteristic_length=50,
|
|
65
65
|
resolution_specs={
|
|
66
|
-
"bw": [ConstantInField(resolution=
|
|
66
|
+
"bw": [ConstantInField(resolution=100, apply_to="surfaces")],
|
|
67
67
|
"substrate": [
|
|
68
|
-
ConstantInField(resolution=
|
|
69
|
-
ConstantInField(resolution=
|
|
70
|
-
ConstantInField(resolution=
|
|
68
|
+
ConstantInField(resolution=200, apply_to="curves"),
|
|
69
|
+
ConstantInField(resolution=150, apply_to="surfaces"),
|
|
70
|
+
ConstantInField(resolution=300, apply_to="volumes"),
|
|
71
71
|
],
|
|
72
|
-
"vacuum": [ConstantInField(resolution=
|
|
72
|
+
"vacuum": [ConstantInField(resolution=200, apply_to="surfaces")],
|
|
73
73
|
**{
|
|
74
74
|
f"bw@{port.name}___substrate": [
|
|
75
75
|
ThresholdField(
|
|
76
|
-
sizemin=
|
|
76
|
+
sizemin=20, distmin=4, distmax=30, sizemax=100, apply_to="curves"
|
|
77
77
|
)
|
|
78
78
|
]
|
|
79
79
|
# Older style:
|
|
@@ -90,40 +90,69 @@ def get_reasonable_mesh_parameters_capacitance(c: Component):
|
|
|
90
90
|
)
|
|
91
91
|
|
|
92
92
|
|
|
93
|
-
def test_palace_capacitance_simulation_runs(geometry) -> None:
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
c,
|
|
93
|
+
def test_palace_capacitance_simulation_runs(geometry, tmp_path) -> None:
|
|
94
|
+
results = run_capacitive_simulation_palace(
|
|
95
|
+
geometry,
|
|
97
96
|
layer_stack=layer_stack,
|
|
98
97
|
material_spec=material_spec,
|
|
99
|
-
mesh_parameters=get_reasonable_mesh_parameters_capacitance(
|
|
98
|
+
mesh_parameters=get_reasonable_mesh_parameters_capacitance(geometry),
|
|
99
|
+
simulation_folder=tmp_path,
|
|
100
100
|
)
|
|
101
|
+
assert results.capacitance_matrix
|
|
102
|
+
assert results.mesh_location
|
|
103
|
+
assert results.field_file_location
|
|
101
104
|
|
|
102
105
|
|
|
103
106
|
@pytest.mark.parametrize("n_processes", [(1), (2), (4)])
|
|
104
107
|
def test_palace_capacitance_simulation_n_processes(geometry, n_processes) -> None:
|
|
105
|
-
c = geometry
|
|
106
108
|
run_capacitive_simulation_palace(
|
|
107
|
-
|
|
109
|
+
geometry,
|
|
108
110
|
layer_stack=layer_stack,
|
|
109
111
|
material_spec=material_spec,
|
|
110
112
|
n_processes=n_processes,
|
|
111
|
-
mesh_parameters=get_reasonable_mesh_parameters_capacitance(
|
|
113
|
+
mesh_parameters=get_reasonable_mesh_parameters_capacitance(geometry),
|
|
112
114
|
)
|
|
113
115
|
|
|
114
116
|
|
|
117
|
+
@pytest.mark.parametrize("invalid_n_processes", [0, -1, -5, 1.5, "two", None])
|
|
118
|
+
def test_palace_capacitance_simulation_invalid_n_processes(
|
|
119
|
+
geometry, invalid_n_processes
|
|
120
|
+
) -> None:
|
|
121
|
+
with pytest.raises((ValueError, TypeError)):
|
|
122
|
+
run_capacitive_simulation_palace(
|
|
123
|
+
geometry,
|
|
124
|
+
layer_stack=layer_stack,
|
|
125
|
+
material_spec=material_spec,
|
|
126
|
+
mesh_parameters=get_reasonable_mesh_parameters_capacitance(geometry),
|
|
127
|
+
n_processes=invalid_n_processes,
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
|
|
115
131
|
@pytest.mark.parametrize("element_order", [(1), (2), (3)])
|
|
116
132
|
def test_palace_capacitance_simulation_element_order(geometry, element_order) -> None:
|
|
117
|
-
c = geometry
|
|
118
133
|
run_capacitive_simulation_palace(
|
|
119
|
-
|
|
134
|
+
geometry,
|
|
120
135
|
layer_stack=layer_stack,
|
|
121
136
|
material_spec=material_spec,
|
|
122
137
|
solver_config={"Order": element_order},
|
|
123
|
-
mesh_parameters=get_reasonable_mesh_parameters_capacitance(
|
|
138
|
+
mesh_parameters=get_reasonable_mesh_parameters_capacitance(geometry),
|
|
124
139
|
)
|
|
125
140
|
|
|
126
141
|
|
|
142
|
+
@pytest.mark.parametrize("invalid_element_order", [0, -1, 1.5, "two"])
|
|
143
|
+
def test_palace_capacitance_simulation_invalid_element_order(
|
|
144
|
+
geometry, invalid_element_order
|
|
145
|
+
) -> None:
|
|
146
|
+
with pytest.raises((ValueError, TypeError)):
|
|
147
|
+
run_capacitive_simulation_palace(
|
|
148
|
+
geometry,
|
|
149
|
+
layer_stack=layer_stack,
|
|
150
|
+
material_spec=material_spec,
|
|
151
|
+
solver_config={"Order": invalid_element_order},
|
|
152
|
+
mesh_parameters=get_reasonable_mesh_parameters_capacitance(geometry),
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
|
|
127
156
|
@pytest.mark.skip(reason="TODO")
|
|
128
157
|
def test_palace_capacitance_simulation_mesh_size_field(geometry) -> None:
|
|
129
158
|
pass
|
|
@@ -25,7 +25,7 @@ license = {file = "LICENSE"}
|
|
|
25
25
|
name = "gplugins"
|
|
26
26
|
readme = "README.md"
|
|
27
27
|
requires-python = ">=3.11"
|
|
28
|
-
version = "2.0.
|
|
28
|
+
version = "2.0.1"
|
|
29
29
|
|
|
30
30
|
[project.optional-dependencies]
|
|
31
31
|
dev = [
|
|
@@ -51,10 +51,10 @@ gfviz = ["jinja2", "fastapi", "shapely", "natsort"]
|
|
|
51
51
|
klayout = ["klayout", "pyvis<=0.3.1", "vlsir", "vlsirtools", "gitpython"]
|
|
52
52
|
luminescent = ["luminescent>=0.2.12,<0.4.0", "sortedcontainers"]
|
|
53
53
|
maintainer = ["mypy", "tbump", "towncrier"]
|
|
54
|
-
meow = ["meow-sim>=0.14.1,<0.15", "sax
|
|
54
|
+
meow = ["meow-sim>=0.14.1,<0.15", "sax~=0.16.3", "tidy3d>=2.8.2,<2.9"]
|
|
55
55
|
meshwell = ["shapely", "meshwell~=2.1.1"]
|
|
56
56
|
path_length_analysis = ["bokeh", "numba", "shapely"]
|
|
57
|
-
sax = ["sax~=0.
|
|
57
|
+
sax = ["sax~=0.16.3"]
|
|
58
58
|
schematic = ["bokeh", "ipywidgets", "natsort"]
|
|
59
59
|
tidy3d = ["tidy3d>=2.8.2,<2.9", "gdstk"]
|
|
60
60
|
vlsir = ["vlsir", "vlsirtools"]
|
|
@@ -178,7 +178,7 @@ message_template = "Bump to {new_version}"
|
|
|
178
178
|
tag_template = "v{new_version}"
|
|
179
179
|
|
|
180
180
|
[tool.tbump.version]
|
|
181
|
-
current = "2.0.
|
|
181
|
+
current = "2.0.1"
|
|
182
182
|
regex = '''
|
|
183
183
|
(?P<major>\d+)
|
|
184
184
|
\.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|