Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gdsfactory8 #413

Merged
merged 38 commits into from
Jun 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
4ddb072
fix notebooks
joamatab May 30, 2024
91c66ca
refactor logger
joamatab Jun 1, 2024
a1d09da
towards gdsfactory8
joamatab Jun 1, 2024
14abc4d
refactor
joamatab Jun 3, 2024
f1a18d4
port to gdsfactory8
joamatab Jun 3, 2024
7614eba
create a new component for mesh
joamatab Jun 4, 2024
f11ba95
add ipywidgets
joamatab Jun 8, 2024
7172347
bring schematic_editor files
joamatab Jun 8, 2024
457f3f4
fix klayout tests
joamatab Jun 8, 2024
17593f4
install gdsfactory from main
joamatab Jun 8, 2024
cac4b49
install latest gdsfactory
joamatab Jun 8, 2024
c2e607e
fix more klayout tests
joamatab Jun 8, 2024
c33cb4c
fix some sax tests
joamatab Jun 8, 2024
4716db3
updating elements
joamatab Jun 9, 2024
c018ae6
pin version of klayout
joamatab Jun 9, 2024
d7a9b50
Merge branch 'main' into gdsfactory8
simbilod Jun 9, 2024
347683e
convert KLayout region to shapely MultiPolygon
simbilod Jun 9, 2024
c925720
disactivate component with net layers
simbilod Jun 9, 2024
340efd5
use logicallayer
simbilod Jun 9, 2024
6c4d478
go from klayout units to microns
simbilod Jun 9, 2024
4854feb
last fixes
simbilod Jun 9, 2024
41f6574
fixing meep plugin paths
joamatab Jun 10, 2024
9b6c19c
fix sax tests
joamatab Jun 10, 2024
7e74a19
fixing meow
joamatab Jun 10, 2024
aa440f0
fixing tidy3d plugin
joamatab Jun 11, 2024
38d4d03
Merge branch 'main' into gdsfactory8
joamatab Jun 11, 2024
18b5844
fix test_global_density
joamatab Jun 11, 2024
0254c25
Merge branch 'gdsfactory8' of github.com:gdsfactory/gplugins into gds…
joamatab Jun 11, 2024
4bcb85a
fixing meow
joamatab Jun 11, 2024
5feefe3
Fixes for tidy3d plugin. ComponentModeler setup looks correct now, po…
yaugenst Jun 11, 2024
097819a
Merge pull request #421 from gdsfactory/tidy3d_fixes
joamatab Jun 11, 2024
0a86477
fix more tests
joamatab Jun 11, 2024
587859a
Merge branch 'gdsfactory8' of github.com:gdsfactory/gplugins into gds…
joamatab Jun 11, 2024
bae8c37
fix mode_solver femwell
joamatab Jun 11, 2024
7f6e813
fix test grating coupler
joamatab Jun 13, 2024
c044dd6
fix some errors from dbu
joamatab Jun 13, 2024
608e49f
update sax
joamatab Jun 18, 2024
864812d
Merge branch 'main' into gdsfactory8
joamatab Jun 19, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .github/workflows/test_code.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ jobs:
- name: Install dependencies
run: |
pip install -e .[${{ matrix.plugin }},dev]
pip install git+https://github.com/gdsfactory/gdsfactory --force-reinstall
- name: Test with pytest
env:
SIMCLOUD_APIKEY: ${{ secrets.SIMCLOUD_APIKEY }}
Expand All @@ -53,7 +54,7 @@ jobs:
- uses: actions/checkout@v4
- uses: mamba-org/setup-micromamba@v1
with:
micromamba-version: '1.3.1-0'
micromamba-version: "1.3.1-0"
init-shell: bash
- name: Install dependencies
run: |
Expand Down Expand Up @@ -97,7 +98,7 @@ jobs:
- uses: actions/checkout@v4
- uses: mamba-org/setup-micromamba@v1
with:
micromamba-version: '1.3.1-0'
micromamba-version: "1.3.1-0"
init-shell: bash
- name: Install dependencies
env:
Expand Down Expand Up @@ -127,7 +128,7 @@ jobs:
restore-keys: 0.0.1
- uses: mamba-org/setup-micromamba@v1
with:
micromamba-version: '1.3.1-0'
micromamba-version: "1.3.1-0"
init-shell: bash
- name: Install dependencies and build docs
env:
Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,13 @@ docs/notebooks/temporary
docs/notebooks/batch-*
.virtual_documents/
notebooks/rib_strip_pathlengths/

gplugins/klayout/d25/
gplugins/klayout/layers.lyp
gplugins/klayout/tech.lyt

# C extensions
*.so
*.stl
*.fsp
*.hdf5
*.msh
Expand Down
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
install:
pip install -e .[dev,docs,devsim,femwell,gmsh,klayout,meow,meshwell,ray,sax,schematic,tidy3d,vlsir]
pip install git+https://github.com/gdsfactory/gdsfactory --force-reinstall
pre-commit install

dev: test-data gmsh elmer install
Expand Down
57 changes: 33 additions & 24 deletions gplugins/common/base_models/component.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,18 +54,19 @@ def pad_z(self) -> float:

@cached_property
def gds_component(self) -> GFComponent:
c = Component(name=f"sim_component_{self.component.name}")
c = Component()
c << gf.components.extend_ports(
self.component, length=self.extend_ports + self.pad_xy
)
c << gf.components.bbox(
self._gds_bbox,
layer=self.wafer_layer,
top=self.pad_xy_outer,
bottom=self.pad_xy_outer,
left=self.pad_xy_outer,
right=self.pad_xy_outer,
)
(xmin, ymin), (xmax, ymax) = self._gds_bbox
delta = self.pad_xy_outer
points = [
[xmin - delta, ymin - delta],
[xmax + delta, ymin - delta],
[xmax + delta, ymax + delta],
[xmin - delta, ymax + delta],
]
c.add_polygon(points, layer=self.wafer_layer)
c.add_ports(self.ports)
c.copy_child_info(self.component)
return c
Expand All @@ -74,19 +75,27 @@ def gds_component(self) -> GFComponent:
def _gds_bbox(self) -> tuple[tuple[float, float], tuple[float, float]]:
c = gf.components.extend_ports(
self.component, length=self.extend_ports + self.pad_xy_inner
).ref()
unchanged = np.isclose(np.abs(np.round(c.bbox - self.component.bbox, 3)), 0)
bbox = c.bbox + unchanged * np.array([[-1, -1], [1, 1]]) * self.pad_xy_inner
)
unchanged = np.isclose(
np.abs(np.round(c.bbox_np() - self.component.bbox_np(), 3)), 0
)
bbox = (
c.bbox_np() + unchanged * np.array([[-1, -1], [1, 1]]) * self.pad_xy_inner
)
return tuple(map(tuple, bbox))

@cached_property
def ports(self) -> tuple[gf.Port, ...]:
return tuple(
p.move_polar_copy(
self.extend_ports + self.pad_xy_inner - self.port_offset, p.orientation
p = tuple(
p.copy_polar(
p.kcl.to_dbu(self.extend_ports + self.pad_xy_inner - self.port_offset),
angle=p.angle,
)
for p in self.component.ports.values()
for p in self.component.ports
)
for pi, po in zip(self.component.ports, p):
po.angle = pi.angle
return p

@computed_field
@cached_property
Expand Down Expand Up @@ -187,19 +196,19 @@ def port_centers(self) -> tuple[tuple[float, float, float], ...]:
return tuple(self.get_port_center(p) for p in self.ports)

def get_port_center(self, port: gf.Port) -> tuple[float, float, float]:
layers = self.get_layer_names_from_index(port.layer)
layers = self.get_port_layers(port)
return (
*port.center,
*port.dcenter,
np.mean([self.get_layer_center(layer)[2] for layer in layers]),
)

def get_layer_names_from_index(
self, layer_index: tuple[int, int]
) -> tuple[str, ...]:
def get_port_layers(self, port: gf.Port) -> tuple[str, ...]:
# FIXME: extract actual layer
# this needs to be a list of all layers and derived layers that are
# associated with the port layer enum
return ("core",)
return tuple(
k
for k, v in self.layer_stack.layers.items()
if tuple(v.layer) == layer_index
k for k, v in self.layer_stack.layers.items() if port.layer in v.layer
)

def get_layer_bbox(
Expand Down
6 changes: 3 additions & 3 deletions gplugins/common/utils/add_simulation_markers.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,13 @@ def add_simulation_markers(
component = gf.get_component(component)

ref = c << component
port_names = list(ref.ports.keys())
port_names = [port.name for port in ref.ports]

layer_stack = get_layer_stack()

if port_source_name not in port_names:
warnings.warn(f"port_source_name={port_source_name!r} not in {port_names}")
port_source = ref.get_ports_list()[0]
port_source = ref.ports[0]
port_source_name = port_source.name
warnings.warn(f"Selecting port_source_name={port_source_name!r} instead.")

Expand All @@ -98,7 +98,7 @@ def add_simulation_markers(
), f"component needs to be a gf.Component, got Type {type(component)}"

# Add port monitors
for port_name in ref.ports.keys():
for port_name in port_names:
port = ref.ports[port_name]
add_pin_rectangle(c, port=port, port_margin=port_margin, layer=layer_monitor)
layer_stack.layers["monitor"] = LayerLevel(
Expand Down
4 changes: 2 additions & 2 deletions gplugins/common/utils/get_component_with_local_layers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import gdsfactory as gf
import gdstk
from gdsfactory.component_layout import _parse_layer
from gdsfactory.pdk import get_layer
from gdsfactory.typings import Component, Layer, List
from gdstk import Polygon

Expand Down Expand Up @@ -56,7 +56,7 @@ def get_component_with_local_layers(
old_layer_number
]
local_component.remove_layers([old_layer_number])
gds_layer, gds_datatype = _parse_layer(old_layer_number)
gds_layer, gds_datatype = tuple(get_layer(old_layer_number))
for layer_polygon in layer_polygons:
# Polygons inside the domain
p_inside = gdstk.boolean(
Expand Down
5 changes: 5 additions & 0 deletions gplugins/common/utils/get_component_with_net_layers.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ def get_component_with_net_layers(
new_layers_init: initial layer number for the temporary new layers.
add_to_layerstack: True by default, but can be set to False to disable parsing of the layerstack.
"""

return NotImplementedError(
"Meshing component with net layers not implemented in gdsfactory8 yet."
)

# Initialize returned component
net_component = component.copy()

Expand Down
2 changes: 1 addition & 1 deletion gplugins/devsim/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from __future__ import annotations

import devsim as tcad
from gdsfactory.config import logger
from gdsfactory import logger

from gplugins.devsim.get_simulation_xsection import (
PINWaveguide,
Expand Down
2 changes: 1 addition & 1 deletion gplugins/elmer/tests/test_elmer.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def get_reasonable_mesh_parameters(c: Component):
return dict(
background_tag="vacuum",
background_padding=(0,) * 5 + (700,),
port_names=list(c.ports.keys()),
port_names=[port.name for port in c.ports],
default_characteristic_length=200,
resolutions={
"bw": {
Expand Down
2 changes: 1 addition & 1 deletion gplugins/fdtdz/get_epsilon_fdtdz.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ def add_plot_labels(arg0, arg1, arg2, arg3):
padding = c << gf.components.bbox(
waveguide.bbox, top=2, bottom=2, layer=LAYER.WAFER
)
c.add_ports(gf.components.straight(length=length).get_ports_list())
c.add_ports(gf.components.straight(length=length).ports)

filtered_layer_stack = LayerStack(
layers={k: LAYER_STACK.layers[k] for k in ["clad", "box", "core"]}
Expand Down
6 changes: 3 additions & 3 deletions gplugins/fdtdz/get_ports_fdtdz.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ def plot_mode(
padding = c << gf.components.bbox(
waveguide.bbox, top=2, bottom=2, layer=LAYER.WAFER
)
c.add_ports(gf.components.straight(length=length).get_ports_list())
c.add_ports(gf.components.straight(length=length).ports)

filtered_layer_stack = LayerStack(
layers={k: LAYER_STACK.layers[k] for k in ["clad", "box", "core"]}
Expand All @@ -227,7 +227,7 @@ def plot_mode(
omega=omega,
port=c.ports["o1"],
epsilon=epsilon,
xmin=c.xmin,
xmin=c.dxmin,
ymin=c.ymin,
nm_per_pixel=nm_per_pixel,
port_extent_xy=1,
Expand All @@ -237,7 +237,7 @@ def plot_mode(
port=c.ports["o1"],
epsilon_port=epsilon_port,
excitation=excitation,
xmin=c.xmin,
xmin=c.dxmin,
ymin=c.ymin,
zmin=zmin,
nm_per_pixel=1000,
Expand Down
8 changes: 4 additions & 4 deletions gplugins/fdtdz/get_sparameters_fdtdz.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,8 @@ def get_sparameters_fdtdz(

# Checks from gmeep
component_ref = component.ref()
component_ref.x = 0
component_ref.y = 0
component_ref.dx = 0
component_ref.dy = 0

optical_port_names = list(component_ref.get_ports_dict(port_type="optical").keys())

Expand Down Expand Up @@ -130,7 +130,7 @@ def get_sparameters_fdtdz(
omega=omega,
port=component.ports[portname],
epsilon=epsilon,
xmin=component_extended.xmin,
xmin=component_extended.dxmin,
ymin=component_extended.ymin,
nm_per_pixel=nm_per_pixel,
port_extent_xy=port_margin,
Expand Down Expand Up @@ -159,7 +159,7 @@ def get_sparameters_fdtdz(
padding = c << gf.components.bbox(
waveguide.bbox, top=2, bottom=2, layer=LAYER.WAFER
)
c.add_ports(gf.components.straight(length=length).get_ports_list())
c.add_ports(gf.components.straight(length=length).ports)

filtered_layer_stack = LayerStack(
layers={k: LAYER_STACK.layers[k] for k in ["clad", "box", "core"]}
Expand Down
26 changes: 18 additions & 8 deletions gplugins/femwell/mode_solver.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import gdsfactory as gf
import numpy as np
from femwell.maxwell.waveguide import Modes, compute_modes
from gdsfactory.pdk import get_layer_stack, get_material_index
from gdsfactory.pdk import get_layer_stack
from gdsfactory.technology import LayerStack
from gdsfactory.typings import ComponentSpec, CrossSectionSpec, PathType
from skfem import (
Expand Down Expand Up @@ -66,12 +66,12 @@ def compute_cross_section_modes(
"""
# Get meshable component from cross-section
c = gf.components.straight(length=10, cross_section=cross_section)
bounds = c.bbox
dx = np.diff(bounds[:, 0])[0]
dx = c.dxsize
dy = c.dysize

xsection_bounds = [
[dx / 2, bounds[0, 1] - wafer_padding],
[dx / 2, bounds[1, 1] + wafer_padding],
[dx / 2, dy - wafer_padding],
[dx / 2, dy + wafer_padding],
]

# Mesh as component
Expand All @@ -88,6 +88,13 @@ def compute_cross_section_modes(
)


_material_name_to_index = {
"si": 3.48,
"sio2": 1.44,
"sin": 2.0,
}


def compute_component_slice_modes(
component: ComponentSpec,
xsection_bounds: tuple[tuple[float, float], tuple[float, float]],
Expand All @@ -100,6 +107,7 @@ def compute_component_slice_modes(
metallic_boundaries: bool = False,
n_guess: float | None = None,
solver: str = "scipy",
material_name_to_index: dict[str, float] | None = None,
**kwargs,
) -> Modes:
"""Calculate effective index of component slice.
Expand Down Expand Up @@ -130,8 +138,10 @@ def compute_component_slice_modes(
merge_by_material: boolean, if True will merge polygons from layers with the same layer.material. Physical keys will be material in this case.
wafer_layer: layer to use for WAFER padding.
"""
material_name_to_index = material_name_to_index or _material_name_to_index

# Mesh

mesh = get_mesh(
component=component,
type="uz",
Expand All @@ -148,11 +158,11 @@ def compute_component_slice_modes(
for layername, layer in layer_stack.layers.items():
if layername in mesh.subdomains.keys():
epsilon[basis0.get_dofs(elements=layername)] = (
get_material_index(layer.material, wavelength) ** 2
material_name_to_index[layer.material] ** 2
)
if "background_tag" in kwargs:
epsilon[basis0.get_dofs(elements=kwargs["background_tag"])] = (
get_material_index(kwargs["background_tag"], wavelength) ** 2
material_name_to_index[kwargs["background_tag"]] ** 2
)

return compute_modes(
Expand Down Expand Up @@ -199,7 +209,7 @@ def compute_component_slice_modes(

if cross_section:
modes = compute_cross_section_modes(
cross_section="xs_rc",
cross_section="rib",
layer_stack=filtered_layer_stack,
wavelength=1.55,
num_modes=4,
Expand Down
2 changes: 1 addition & 1 deletion gplugins/femwell/test_mode_solver.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def compute_modes(
"slab90": {"resolution": 0.05, "distance": 1},
}
return compute_cross_section_modes(
cross_section="xs_rc",
cross_section="rib",
layer_stack=filtered_layer_stack,
wavelength=1.55,
num_modes=num_modes,
Expand Down
Loading
Loading