Shapes and generic cells#

gdsfactory provides some generic parametric cells in gf.components that you can customize for your application.

Basic shapes#

Rectangle#

To create a simple rectangle, there are two functions:

gf.components.rectangle() can create a basic rectangle:

import gdsfactory as gf



gf.gpdk.PDK.activate()
r1 = gf.components.rectangle(size=(4.5, 2), layer=(1, 0))
r1.plot()
../_images/122c4fc10f1d365d45dd0c9b9b16c9a82757083217f9e9d0b4636be10f315267.png

gf.components.bbox() can also create a rectangle based on a bounding box. This is useful if you want to create a rectangle which precisely surrounds a piece of existing geometry. For example, if we have an arc geometry and we want to define a box around it, we can use gf.components.bbox():

c = gf.Component()
arc = c << gf.components.bend_circular(radius=10, width=0.5, angle=90, layer=(1, 0))
arc.rotate(90)

# Draw a rectangle around the arc we created by using the arc's bounding box.
rect = c << gf.components.bbox(arc, layer=(2, 0))
c.plot()
../_images/f2c359668f91d4cc9f6b4b6292622480b59a52a40ea26f98db0bf917e269d122.png

Cross#

The gf.components.cross() function creates a cross structure:

c = gf.components.cross(length=10, width=0.5, layer=(1, 0))
c.plot()
../_images/f0df6121b78173b9187a6e687f4033892c32f6c6326a533c374e02688a908459.png

Ellipse#

The gf.components.ellipse() function creates an ellipse by defining the major and minor radii:

c = gf.components.ellipse(radii=(10, 5), angle_resolution=2.5, layer=(1, 0))
c.plot()
../_images/1a43558d5207d19a367dec151d977fb3a861f8de739968300557c281b52c1e39.png

Circle#

The gf.components.circle() function creates a circle:

c = gf.components.circle(radius=10, angle_resolution=2.5, layer=(1, 0))
c.plot()
../_images/01c02f586ea9aed7faa995cff5f0b622793ef481dfdf055edaefa3918bfa8521.png

Ring#

The gf.components.ring() function creates a ring. The radius refers to the center radius of the ring structure (halfway between the inner and outer radius).

c = gf.components.ring(radius=5, width=0.5, angle_resolution=2.5, layer=(1, 0))
c.plot()
../_images/6570603c340f50809c20573b3fc92dc063098fe26a225c37d66b672a4da645b0.png
c = gf.components.ring_single(gap=0.2, radius=10, length_x=4, length_y=2)
c.plot()
../_images/7488c5fed95e15dd699f201625ecfff8f33587564161d438ae2243d3ebf38ccb.png
import gdsfactory as gf

c = gf.components.ring_double(gap=0.2, radius=10, length_x=4, length_y=2)
c.plot()
../_images/198721aa9f93509ef727eafdd2fb3563e7c5b4aeab7ce29dc1eff8b91006c1ba.png
c = gf.components.ring_double(
    gap=0.2,
    radius=10,
    length_x=4,
    length_y=2,
    bend=gf.components.bend_circular,
)
c.plot()
../_images/6fddf9463b162659ed33053b8022e4f9bbd17756856515fab18b96f6b237f970.png

Bend circular#

The gf.components.bend_circular() function creates an arc. The radius refers to the center radius of the arc (halfway between the inner and outer radius).

c = gf.components.bend_circular(
    radius=5.0, width=0.5, angle=90, npoints=720, layer=(1, 0)
)
c.plot()
../_images/189da13970b362e975811d17ec0df1dd9c4647f016480a50ea66549696e857f7.png

You can control the point spacing of bends using angular_step (degrees between consecutive points) or npoints. For a target distance between points, calculate the angular step from the radius: angular_step = spacing / radius * (180 / pi). For example, 1 um spacing on a 5 um radius bend gives angular_step 11.5°.

import numpy as np

radius = 5.0
target_spacing_um = 1.0  # 1 um between points
angular_step = target_spacing_um / radius * (180 / np.pi)
print(f"angular_step = {angular_step:.2f} degrees for {target_spacing_um} um spacing")

c = gf.components.bend_circular(
    radius=radius, width=0.5, angle=90, angular_step=angular_step, layer=(1, 0)
)
first_layer = next(iter(c.get_polygons()))
print(f"Number of polygon points: {c.get_polygons()[first_layer][0].num_points()}")
c.plot()
angular_step = 11.46 degrees for 1.0 um spacing
Number of polygon points: 18
../_images/5683dcee21b4a76082b73bc989db76c61bc57116962a25fe699ba8a4b198675d.png

Bend euler#

The gf.components.bend_euler() function creates an adiabatic bend in which the bend radius changes gradually. Euler bends have lower loss than circular bends.

c = gf.components.bend_euler(radius=5.0, width=0.5, angle=90, npoints=720, layer=(1, 0))
c.plot()
../_images/825da977b4fa520601e79efea7825145b1b76c2ba48bdb6eb1140c6f2f9f4a26.png

Similarly, you can use angular_step with Euler bends. Note that angular_step and npoints are mutually exclusive.

radius = 5.0
target_spacing_um = 1.0
angular_step = target_spacing_um / radius * (180 / np.pi)

c = gf.components.bend_euler(
    radius=radius, width=0.5, angle=90, angular_step=angular_step, layer=(1, 0)
)
first_layer = next(iter(c.get_polygons()))
print(f"Number of polygon points: {c.get_polygons()[first_layer][0].num_points()}")
c.plot()
Number of polygon points: 14
../_images/1a52a49b16d39b9df9f3a870b1a48985d982a9a0c124ea8fad587da84d29ef58.png

You can also set the default point density globally via PDK.bend_points_distance (in um). Smaller values produce denser points. Set this before creating bends, as cell caching captures the value at creation time.

PDK = gf.get_active_pdk()
PDK.bend_points_distance = 0.1  # 100 nm spacing between points

c = gf.components.bend_euler(radius=5.0, width=0.5, angle=90, layer=(1, 0))
first_layer = next(iter(c.get_polygons()))
print(f"Number of polygon points: {c.get_polygons()[first_layer][0].num_points()}")
c.plot()
Number of polygon points: 18
../_images/b2ade25d05a16fd918d53d364ca89f914ca6883f1b949846f11b886fab9de199.png
PDK.bend_points_distance = 20e-3  # reset to default 20 nm

Tapers#

gf.components.taper()is defined by setting its length as well as its start and end length. It has two ports, 1 and 2, on either end, allowing you to easily connect it to other structures.

c = gf.components.taper(length=10, width1=6, width2=4, port=None, layer=(1, 0))
c.plot()
../_images/152b51c41e238b1c53d63c4136b4a566191b461e6e20c5db1c05e2c9e66be803.png

gf.components.ramp() is a structure is similar to taper() except it is asymmetric. It also has two ports, 1 and 2, on either end.

c = gf.components.ramp(length=10, width1=4, width2=8, layer=(1, 0))
c.plot()
../_images/91855a619e3dbcda5135a14366a8c381f1be5ca532457106dd7737092a0c018a.png

Common compound shapes#

The gf.components.L() function creates a “L” shape with ports on either end named 1 and 2.

c = gf.components.L(width=7, size=(10, 20), layer=(1, 0))
c.plot()
../_images/cc1d4ac8b9ea67f11f3b908d0fa1e15625232c931e0c28d4bf8542e5ae5dd70e.png

The gf.components.C() function creates a “C” shape with ports on either end named 1 and 2.

c = gf.components.C(width=7, size=(10, 20), layer=(1, 0))
c.plot()
../_images/b71bcd558bffea2402867dd32f0860d6f025f5eff4f826bd5d5469a886c35c93.png

Text#

Gdsfactory has an implementation of the DEPLOF font with the majority of english ASCII characters represented (thanks to PHIDL)

c = gf.components.text(
    text="Hello world!\nMultiline text\nLeft-justified",
    size=10,
    justify="left",
    layer=(1, 0),
)
c.plot()
# The justify parameter needs to be 'left', 'center', or 'right',
# because those are the standard text alignment options that determine how multiple lines of text are positioned relative to each other.
../_images/23b917b56d813199557678466a332ea22ce56bbac395252d9526e6e00376b388.png

Lithography Structures#

Step-resolution#

The gf.components.litho_steps() function creates a lithographic test structure that is useful for measuring the resolution of photoresist or electron-beam resists. It provides both positive-tone and negative-tone resolution tests.

c = gf.components.litho_steps(
    line_widths=(1, 2, 4, 8, 16), line_spacing=10, height=100, layer=(1, 0)
)
c.plot()
../_images/f9982bbbf66845ef6e1ef1c6764f4680e6aac9a07931baba3ca27d3dd8964d83.png

Calipers (inter-layer alignment)#

The gf.components.litho_calipers() function is used to detect offsets in multilayer fabrications. It creates a set of two notches on different layers. When a fabrication error/offset occurs, it is easy to detect the magnitude of the offset because both center-notches are no longer aligned.

D = gf.components.litho_calipers(
    notch_size=(1, 5),
    notch_spacing=2,
    num_notches=7,
    offset_per_notch=0.1,
    row_spacing=0,
    layer1=(1, 0),
    layer2=(2, 0),
)
D.plot()
../_images/0426797dfb6a7c619df6108c78b9c3636c800884e31a5c67963266ebdf121f10.png

Paths#

See Path tutorial for more details – this is just an enumeration of the available built-in Path functions

Circular arc#

P = gf.path.arc(radius=10, angle=135, npoints=720)
f = P.plot()
../_images/2fc69666a6d9e9843b309b93b79b3eb548c5bf65d273b6631910e53bd750b48f.png

You can use angular_step instead of npoints to define the angular resolution in degrees. To get 1 um spacing, calculate angular_step = spacing / radius * (180 / pi).

import numpy as np

radius = 10
angular_step = 1.0 / radius * (180 / np.pi)  # 1 um spacing
P = gf.path.arc(radius=radius, angle=135, angular_step=angular_step)
f = P.plot()
../_images/eb886d3664a1d53561cafd06d722d2234730921c041b69f2610e221a39524bb6.png

Straight#

import gdsfactory as gf

P = gf.path.straight(length=5, npoints=100)
f = P.plot()
../_images/25a36b7643f095667eaa0eae442596e127113d1f0a467c1b9a038e2592882567.png

Euler curve#

Also known as a straight-to-bend, clothoid, racetrack, or track transition, this path tapers adiabatically from straight to curved. Often used to minimize losses in photonic straights. If p < 1.0, it will create a “partial euler” curve as described in Vogelbacher et. al. https://dx.doi.org/10.1364/oe.27.031394.
If the use_eff argument is false, radius corresponds to minimum radius of curvature of the bend. If use_eff is true, radius corresponds to the “effective” radius of the bend– The curve will be scaled such that the endpoints match an arc with parameters radius and angle.

P = gf.path.euler(radius=3, angle=90, p=1.0, use_eff=False, npoints=720)
f = P.plot()
../_images/06a51f0ecaa43e7f9d2c0053efb56a0d6b186bf314187de82210c72d062321e3.png
radius = 3
angular_step = 1.0 / radius * (180 / np.pi)  # 1 um spacing
P = gf.path.euler(radius=radius, angle=90, p=1.0, use_eff=False, angular_step=angular_step)
f = P.plot()
../_images/d4f7ad3bd997d59d3efe16a563a775ce6a81d87f67c21b6a02cb074b5052cdc0.png

Smooth path from waypoints#

import numpy as np

import gdsfactory as gf

points = np.array([(20, 10), (40, 10), (20, 40), (50, 40), (50, 20), (70, 20)])

P = gf.path.smooth(
    points=points,
    radius=2,
    bend=gf.path.euler,
    use_eff=False,
)
f = P.plot()
../_images/24799fa744812afced7d9cf84f0e77c227f6013f38793a01c883e7be381d73be.png

Delay spiral#

A delay spiral is a long optical waveguide coiled into a spiral shape on a photonic integrated circuit. Its purpose is to create a significant time delay for an optical signal within a very compact area.

c = gf.components.spiral_double()
c.plot()
../_images/81ef62817beac69c234602e3f4763546080b9d802384b4a80047e6e90c34a25e.png
c = gf.components.spiral()
c.plot()
../_images/2ac104508c16efa59ba3baf1d95764fe118d1610df0a71ec1bb6e88a3dd07771.png
c = gf.components.spiral_racetrack_fixed_length()
c.plot()
2026-06-03 06:12:55.007 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.058 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_554 (cell_index=554) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
2026-06-03 06:12:55.077 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.126 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_560 (cell_index=560) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
2026-06-03 06:12:55.145 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.199 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_566 (cell_index=566) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
/home/runner/work/gdsfactory/gdsfactory/gdsfactory/components/spirals/spiral_heater.py:299: UserWarning: Routing failed: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
  routes = route_bundle(
2026-06-03 06:12:55.220 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.271 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_572 (cell_index=572) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
2026-06-03 06:12:55.291 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.343 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_578 (cell_index=578) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
2026-06-03 06:12:55.363 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.415 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_584 (cell_index=584) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
2026-06-03 06:12:55.435 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.485 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_590 (cell_index=590) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
2026-06-03 06:12:55.507 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.560 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_596 (cell_index=596) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
2026-06-03 06:12:55.580 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.634 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_602 (cell_index=602) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
2026-06-03 06:12:55.654 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.706 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_608 (cell_index=608) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
2026-06-03 06:12:55.726 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.776 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_614 (cell_index=614) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
2026-06-03 06:12:55.796 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.849 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_620 (cell_index=620) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=614), function_name=None, basename=None
2026-06-03 06:12:55.868 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.918 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_626 (cell_index=626) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=614), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=620), function_name=None, basename=None
2026-06-03 06:12:55.938 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:55.988 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_632 (cell_index=632) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=614), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=620), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=626), function_name=None, basename=None
2026-06-03 06:12:56.007 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:56.054 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_638 (cell_index=638) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=614), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=620), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=626), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=632), function_name=None, basename=None
2026-06-03 06:12:56.073 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:56.120 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_644 (cell_index=644) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=614), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=620), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=626), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=632), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=638), function_name=None, basename=None
2026-06-03 06:12:56.140 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:56.188 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_650 (cell_index=650) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=614), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=620), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=626), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=632), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=638), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=644), function_name=None, basename=None
2026-06-03 06:12:56.207 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:56.253 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_656 (cell_index=656) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=614), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=620), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=626), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=632), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=638), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=644), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=650), function_name=None, basename=None
2026-06-03 06:12:56.273 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:56.319 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_662 (cell_index=662) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=614), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=620), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=626), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=632), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=638), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=644), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=650), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=656), function_name=None, basename=None
2026-06-03 06:12:56.339 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:56.388 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_668 (cell_index=668) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=614), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=620), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=626), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=632), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=638), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=644), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=650), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=656), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=662), function_name=None, basename=None
2026-06-03 06:12:56.407 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:56.455 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_674 (cell_index=674) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=614), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=620), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=626), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=632), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=638), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=644), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=650), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=656), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=662), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=668), function_name=None, basename=None
2026-06-03 06:12:56.474 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:56.517 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_680 (cell_index=680) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=614), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=620), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=626), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=632), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=638), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=644), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=650), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=656), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=662), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=668), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=674), function_name=None, basename=None
2026-06-03 06:12:56.537 | ERROR    | gdsfactory.routing.route_bundle:route_bundle:578 - Error in route_bundle: Routing collision in spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad
2026-06-03 06:12:56.591 | ERROR    | kfactory.kcell:name:691 - Name conflict in kfactory.kcell::name at line 691
Renaming Unnamed_77 (cell_index=77) to spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad would cause it to be named the same as:
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=547), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=554), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=560), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=566), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=572), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=578), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=584), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=590), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=596), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=602), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=608), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=614), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=620), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=626), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=632), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=638), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=644), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=650), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=656), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=662), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=668), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=674), function_name=None, basename=None
 - spiral_racetrack_fixed_length_gdsfactorypcomponentspspi_bd9333ad (cell_index=680), function_name=None, basename=None
../_images/23764c34ed4aaa94412a9477b8f5b841743bd7f13544bcf97b43be614ec78b66.png

Useful contact pads / connectors#

These functions are common shapes with ports, often used to make contact pads.

c = gf.components.compass(size=(4, 2), layer=(1, 0))
c.plot()
../_images/30298e6530e1e799716362b934fe5f71b77e678ed6f0157649f54c1b6394a997.png
c = gf.components.nxn(north=3, south=4, east=0, west=0)
c.plot()
../_images/8ea491267b60e1c43041379c18ff4eb9e4d5d6693bed90dd210f43d535fc9a10.png
c = gf.components.pad()
c.plot()
../_images/22ae2b8fda80e68ef63a3c41781cb81d888da06c8183c549fff184e4d8bd3ef5.png
c = gf.components.pad_array90(columns=3)
c.plot()
../_images/91f773c07621da522e2bcb7587d02679495b5c926e319a19e8f8dac9cdd13356.png

Chip / die template#

import gdsfactory as gf

c = gf.components.die(
    size=(10000, 5000),  # Size of the die.
    street_width=100,  # Width of corner marks for die-sawing.
    street_length=1000,  # Length of corner marks for die-sawing.
    die_name="chip99",  # Label text.
    text_size=500,  # Label text size.
    text_location="SW",  # Label text compass location e.g. 'S', 'SE', 'SW'
    layer=(2, 0),
    bbox_layer=(3, 0),
)
c.plot()
../_images/85143fe9ca19407fc89d13520d14cc4cd6324c29191b7cce0cccfcba1aaae12c.png

Optimal superconducting curves#

The following structures are meant to reduce “current crowding” in superconducting thin-film structures (such as superconducting nanowires). They are the result of conformal mapping equations derived in Clem, J. & Berggren, K. “Geometry-dependent critical currents in superconducting nanocircuits.” Phys. Rev. B 84, 1–27 (2011).

import gdsfactory as gf

# This code creates a compact, U-shaped "hairpin" delay line with bends that are optimized for low loss.
c = gf.components.optimal_hairpin(
    width=0.2, pitch=0.6, length=10, turn_ratio=4, num_pts=50, layer=(2, 0)
)
c.plot()
../_images/72c113708613414907659a72987dab8a59258e0115558965e06cacf0f93f5684.png
# This code creates a taper, which is a waveguide section that smoothly transitions between two different widths.
# The optimal_step component is special because its shape is mathematically optimized to be adiabatic, minimizing light loss and back-reflections.
c = gf.components.optimal_step(
    start_width=10, # Defines the initial width of the taper.
    end_width=22, # Defines the final width of the taper.

    # num_pts=50: This sets the number of points used to define the optimized S-curve. A higher number results in a smoother, more finely detailed curve.
    num_pts=50,

    # This is the width tolerance. It defines how close the optimization algorithm must get to the target end_width.
    # A smaller value results in a more precise, but potentially longer, taper.
    width_tol=1e-3,

    # This factor adjusts the "aggressiveness" of the S-curve.
    # A larger value creates a more gradual, less crowded transition at the start and end of the taper.
    anticrowding_factor=1.2,

    # This parameter creates a one-sided taper. One edge of the taper will be a straight line, while the other will have the optimized S-curve.
    # If True, both sides would curve symmetrically.
    symmetric=False,
    layer=(2, 0),
)
c.plot()
../_images/a76c2ee7fe3998165cad479f11f23125615b7017d9fc8764bb6039640f17de9e.png
c = gf.components.optimal_90deg(width=100.0, num_pts=15, length_adjust=1, layer=(2, 0))
c.plot()
../_images/5206255ac57bc977df3237403826b059afb67f6f6611af85879c6816dffffb79.png
# This code creates a Superconducting Nanowire Single-Photon Detector (SNSPD), a specialized component designed to detect single photons of light.
c = gf.components.snspd(
    wire_width=0.2,
    wire_pitch=0.6,
    size=(10, 8), # The overall dimensions of the meandered detector area are 10x8 µm.
    num_squares=None, # num_squares=None means that the size of the component is being defined by the size parameter.
    turn_ratio=4, # Controls the shape of the 180-degree bends in the meander(Clojure/Clojurescript library).
    terminals_same_side=False, # The input and output terminals will be on opposite sides of the detector.
    layer=(2, 0),
)
c.plot()
../_images/5a8484372c4aad67d849744206815309da0b0047dac418c1dd1c99ee544bcdea.png

Generic library#

gdsfactory comes with a generic library that you can customize to your needs or even modify the internal code to create the components that you need.