Skip to content

Commit

Permalink
Merge pull request #2200 from gdsfactory/allow_multilayer
Browse files Browse the repository at this point in the history
allow align to be multi-layer
  • Loading branch information
joamatab committed Oct 20, 2023
2 parents 07fbd3f + 425cb48 commit e2907c4
Show file tree
Hide file tree
Showing 31 changed files with 441 additions and 295 deletions.
109 changes: 77 additions & 32 deletions docs/components.rst
Expand Up @@ -521,6 +521,66 @@ cdsem_all



cdsem_bend180
----------------------------------------------------

.. autofunction:: gdsfactory.components.cdsem_bend180

.. plot::
:include-source:

import gdsfactory as gf

c = gf.components.cdsem_bend180(width=0.5, radius=10.0, wg_length=420.0, straight='straight', bend90='bend_circular', cross_section='xs_sc')
c.plot()



cdsem_coupler
----------------------------------------------------

.. autofunction:: gdsfactory.components.cdsem_coupler

.. plot::
:include-source:

import gdsfactory as gf

c = gf.components.cdsem_coupler(length=420.0, gaps=[0.15, 0.2, 0.25], cross_section='xs_sc', spacing=7.0)
c.plot()



cdsem_straight
----------------------------------------------------

.. autofunction:: gdsfactory.components.cdsem_straight

.. plot::
:include-source:

import gdsfactory as gf

c = gf.components.cdsem_straight(widths=[0.4, 0.45, 0.5, 0.6, 0.8, 1.0], length=420.0, cross_section='xs_sc', spacing=7.0)
c.plot()



cdsem_straight_density
----------------------------------------------------

.. autofunction:: gdsfactory.components.cdsem_straight_density

.. plot::
:include-source:

import gdsfactory as gf

c = gf.components.cdsem_straight_density(widths=[0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3], gaps=[0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3], length=420.0, label='', cross_section='xs_sc')
c.plot()



circle
----------------------------------------------------

Expand Down Expand Up @@ -1444,7 +1504,7 @@ fiducial_squares

import gdsfactory as gf

c = gf.components.fiducial_squares(layers=[[1, 0]], size=[5, 5], offset=0.14)
c = gf.components.fiducial_squares(layer='WG', size=[5.0, 5.0], offset=0.14)
c.plot()


Expand Down Expand Up @@ -1779,21 +1839,6 @@ greek_cross_with_pads



hexagon
----------------------------------------------------

.. autofunction:: gdsfactory.components.hexagon

.. plot::
:include-source:

import gdsfactory as gf

c = gf.components.hexagon(sides=6, side_length=10, layer='WG', port_type='placement')
c.plot()



hline
----------------------------------------------------

Expand Down Expand Up @@ -2334,21 +2379,6 @@ nxn



octagon
----------------------------------------------------

.. autofunction:: gdsfactory.components.octagon

.. plot::
:include-source:

import gdsfactory as gf

c = gf.components.octagon(sides=8, side_length=10, layer='WG', port_type='placement')
c.plot()



optimal_90deg
----------------------------------------------------

Expand Down Expand Up @@ -3739,7 +3769,7 @@ text_freetype

import gdsfactory as gf

c = gf.components.text_freetype(text='abcd', size=10, justify='left', layer='WG', font='DEPLOF')
c = gf.components.text_freetype(text='abcd', size=10, justify='left', layer='WG')
c.plot()


Expand Down Expand Up @@ -3939,6 +3969,21 @@ via_stack_from_rules



via_stack_heater_m2
----------------------------------------------------

.. autofunction:: gdsfactory.components.via_stack_heater_m2

.. plot::
:include-source:

import gdsfactory as gf

c = gf.components.via_stack_heater_m2(size=[11.0, 11.0], layers=['HEATER', 'M2'], correct_size=True)
c.plot()



via_stack_heater_m3
----------------------------------------------------

Expand Down
143 changes: 76 additions & 67 deletions gdsfactory/components/align.py
Expand Up @@ -4,7 +4,7 @@
from gdsfactory.cell import cell
from gdsfactory.component import Component
from gdsfactory.components.rectangle import rectangle
from gdsfactory.typings import ComponentSpec, LayerSpec
from gdsfactory.typings import ComponentSpec, LayerSpec, LayerSpecs


@cell
Expand All @@ -13,6 +13,7 @@ def align_wafer(
spacing: float = 10.0,
cross_length: float = 80.0,
layer: LayerSpec = "WG",
layers: LayerSpecs | None = None,
layer_cladding: tuple[int, int] | None = None,
square_corner: str = "bottom_left",
) -> Component:
Expand All @@ -23,49 +24,53 @@ def align_wafer(
spacing: in um.
cross_length: for the cross.
layer: for the cross.
layers: Optional. List of layers for cross.
layer_cladding: optional.
square_corner: bottom_left, bottom_right, top_right, top_left.
"""
layer = gf.get_layer(layer)
c = Component()
cross = gf.components.cross(length=cross_length, width=width, layer=layer)
c.add_ref(cross)

b = cross_length / 2 + spacing + width / 2
w = width

rh = rectangle(size=(2 * b + w, w), layer=layer, centered=True)
rtop = c.add_ref(rh)
rbot = c.add_ref(rh)
rtop.movey(+b)
rbot.movey(-b)

rv = rectangle(size=(w, 2 * b), layer=layer, centered=True)
rl = c.add_ref(rv)
rr = c.add_ref(rv)
rl.movex(-b)
rr.movex(+b)

wsq = (cross_length + 2 * spacing) / 4
square_mark = c << rectangle(size=(wsq, wsq), layer=layer, centered=True)
a = width / 2 + wsq / 2 + spacing

corner_to_position = {
"bottom_left": (-a, -a),
"bottom_right": (a, -a),
"top_right": (a, a),
"top_left": (-a, a),
}

square_mark.move(corner_to_position[square_corner])

if layer_cladding:
rc_tile_excl = rectangle(
size=(2 * (b + spacing), 2 * (b + spacing)),
layer=layer_cladding,
centered=True,
)
c.add_ref(rc_tile_excl)
layers = layers or [layer]

for layer in layers:
layer = gf.get_layer(layer)
cross = gf.components.cross(length=cross_length, width=width, layer=layer)
c.add_ref(cross)

b = cross_length / 2 + spacing + width / 2
w = width

rh = rectangle(size=(2 * b + w, w), layer=layer, centered=True)
rtop = c.add_ref(rh)
rbot = c.add_ref(rh)
rtop.movey(+b)
rbot.movey(-b)

rv = rectangle(size=(w, 2 * b), layer=layer, centered=True)
rl = c.add_ref(rv)
rr = c.add_ref(rv)
rl.movex(-b)
rr.movex(+b)

wsq = (cross_length + 2 * spacing) / 4
square_mark = c << rectangle(size=(wsq, wsq), layer=layer, centered=True)
a = width / 2 + wsq / 2 + spacing

corner_to_position = {
"bottom_left": (-a, -a),
"bottom_right": (a, -a),
"top_right": (a, a),
"top_left": (-a, a),
}

square_mark.move(corner_to_position[square_corner])

if layer_cladding:
rc_tile_excl = rectangle(
size=(2 * (b + spacing), 2 * (b + spacing)),
layer=layer_cladding,
centered=True,
)
c.add_ref(rc_tile_excl)

return c

Expand All @@ -76,6 +81,7 @@ def add_frame(
width: float = 10.0,
spacing: float = 10.0,
layer: LayerSpec = "WG",
layers: LayerSpecs | None = None,
) -> Component:
"""Returns component with a frame around it.
Expand All @@ -84,41 +90,44 @@ def add_frame(
width: of the frame.
spacing: of component to frame.
layer: frame layer.
layers: Optional. List of layers for geometry.
"""
c = Component()
layer = gf.get_layer(layer)
component = gf.get_component(component)
cref = c.add_ref(component)
cref.move(-c.size_info.center)
y = (
max([component.size_info.height, component.size_info.width]) / 2
+ spacing
+ width / 2
)
x = y
w = width

rh = rectangle(size=(2 * y + w, w), layer=layer, centered=True)
rtop = c.add_ref(rh)
rbot = c.add_ref(rh)
rtop.movey(+y)
rbot.movey(-y)

rv = rectangle(size=(w, 2 * y), layer=layer, centered=True)
rl = c.add_ref(rv)
rr = c.add_ref(rv)
rl.movex(-x)
rr.movex(+x)
c.absorb(cref)
layers = layers or [layer]

for layer in layers:
layer = gf.get_layer(layer)
cref = c.add_ref(component)
cref.move(-c.size_info.center)
y = (
max([component.size_info.height, component.size_info.width]) / 2
+ spacing
+ width / 2
)
x = y
w = width

rh = rectangle(size=(2 * y + w, w), layer=layer, centered=True)
rtop = c.add_ref(rh)
rbot = c.add_ref(rh)
rtop.movey(+y)
rbot.movey(-y)

rv = rectangle(size=(w, 2 * y), layer=layer, centered=True)
rl = c.add_ref(rv)
rr = c.add_ref(rv)
rl.movex(-x)
rr.movex(+x)
c.absorb(cref)
return c


if __name__ == "__main__":
from gdsfactory.generic_tech import get_generic_pdk
layers = {(1, 0), (2, 0)}

PDK = get_generic_pdk()
PDK.activate()
# c = gf.components.straight()
# c = add_frame(component=c)
c = align_wafer()
c = align_wafer(layers=layers)
c = add_frame(c, layers=layers)
c.show(show_ports=True)
2 changes: 1 addition & 1 deletion gdsfactory/components/cdsem_straight.py
Expand Up @@ -55,7 +55,7 @@ def cdsem_straight(
p = position or p
line.ymin = p
if text:
t = c << text(str(int(width * 1e3)))
t = c << text(text=str(int(width * 1e3)))
t.xmin = line.xmax + 5
t.y = p

Expand Down

0 comments on commit e2907c4

Please sign in to comment.