Skip to content

Commit 6a7a865

Browse files
authored
Merge pull request gdsfactory#4090 from abdelq/routing_port_type
Inferring port type for the cross section in route functions
2 parents 1c68ead + 311a8a8 commit 6a7a865

6 files changed

Lines changed: 132 additions & 131 deletions

gdsfactory/routing/route_bundle.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from collections.abc import Sequence
1616
from functools import partial
17-
from typing import Literal
17+
from typing import Literal, cast
1818
from warnings import warn
1919

2020
import kfactory as kf
@@ -179,34 +179,38 @@ def route_bundle(
179179
c.plot()
180180
181181
"""
182-
if layer and cross_section:
183-
raise ValueError(
184-
f"Cannot have both {layer=} and {cross_section=} provided. Choose one."
185-
)
186182
if cross_section is None:
187-
if layer is not None and route_width is not None:
188-
cross_section = partial(
189-
gf.cross_section.cross_section, layer=layer, width=route_width
190-
)
191-
192-
else:
183+
if layer is None or route_width is None:
193184
raise ValueError(
194185
f"Either {cross_section=} or {layer=} and {route_width=} must be provided"
195186
)
187+
elif layer is not None:
188+
raise ValueError(
189+
f"Cannot have both {layer=} and {cross_section=} provided. Choose one."
190+
)
196191

197192
c = component
198193
ports1_ = list(ports1)
199194
ports2_ = list(ports2)
200195
port_type = port_type or ports1_[0].port_type
201196

197+
if cross_section is None:
198+
cross_section = partial(
199+
gf.cross_section.cross_section,
200+
layer=cast(LayerSpec, layer),
201+
width=cast(float, route_width),
202+
port_names=("e1", "e2") if port_type == "electrical" else ("o1", "o2"),
203+
port_types=(port_type, port_type),
204+
)
205+
202206
if len(ports1_) != len(ports2_):
203207
raise ValueError(
204208
f"ports1={len(ports1_)} and ports2={len(ports2_)} must be equal"
205209
)
206-
if route_width is None or route_width == 0:
207-
xs = gf.get_cross_section(cross_section)
208-
else:
210+
if route_width:
209211
xs = gf.get_cross_section(cross_section, width=route_width)
212+
else:
213+
xs = gf.get_cross_section(cross_section)
210214
width = route_width or xs.width
211215

212216
radius = radius or xs.radius

gdsfactory/routing/route_single.py

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -106,36 +106,33 @@ def route_single(
106106
gf.routing.route_single(c, mmi1.ports["o2"], mmi2.ports["o1"], radius=5, cross_section="strip")
107107
c.plot()
108108
"""
109-
p1 = port1
110-
p2 = port2
111-
c = component
112-
113109
if cross_section is None:
114110
if layer is None or route_width is None:
115111
raise ValueError(
116112
f"Either {cross_section=} or {layer=} and route_width must be provided"
117113
)
118114

119-
elif radius:
120-
cross_section = gf.cross_section.cross_section(
121-
layer=layer,
122-
width=route_width,
123-
radius=radius,
124-
)
125-
else:
126-
cross_section = gf.cross_section.cross_section(
127-
layer=layer,
128-
width=route_width,
129-
)
130-
115+
c = component
116+
p1 = port1
117+
p2 = port2
131118
port_type = port_type or p1.port_type
119+
120+
if cross_section is None:
121+
cross_section = gf.cross_section.cross_section(
122+
layer=cast(LayerSpec, layer),
123+
width=cast(float, route_width),
124+
port_names=("e1", "e2") if port_type == "electrical" else ("o1", "o2"),
125+
port_types=(port_type, port_type),
126+
)
127+
132128
if route_width:
133129
xs = gf.get_cross_section(cross_section, width=route_width)
134130
else:
135131
xs = gf.get_cross_section(cross_section)
136132
width = route_width or xs.width
133+
137134
radius = radius or xs.radius
138-
bend90 = gf.get_component(bend, cross_section=xs, radius=radius)
135+
bend90 = gf.get_component(bend, cross_section=xs, radius=radius, width=width)
139136
if auto_taper:
140137
p1 = add_auto_tapers(component, [p1], xs, layer_transitions)[0]
141138
p2 = add_auto_tapers(component, [p2], xs, layer_transitions)[0]

test-data-regression/test_netlists_edge_coupler_array_with_loopback_.yml

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
instances:
2-
bend_euler_gdsfactorypc_24164978_0_889000_A180:
2+
bend_euler_gdsfactorypc_1e74d3cf_0_889000_A180:
33
component: bend_euler
44
info:
55
dy: 30
@@ -22,9 +22,9 @@ instances:
2222
npoints: null
2323
p: 0.5
2424
radius: 30
25-
width: null
25+
width: 0.5
2626
with_arc_floorplan: true
27-
bend_euler_gdsfactorypc_24164978_m1000_127000_A180:
27+
bend_euler_gdsfactorypc_1e74d3cf_m1000_127000_A180:
2828
component: bend_euler
2929
info:
3030
dy: 30
@@ -47,9 +47,9 @@ instances:
4747
npoints: null
4848
p: 0.5
4949
radius: 30
50-
width: null
50+
width: 0.5
5151
with_arc_floorplan: true
52-
bend_euler_gdsfactorypc_24164978_m30000_792000_A270:
52+
bend_euler_gdsfactorypc_1e74d3cf_m30000_792000_A270:
5353
component: bend_euler
5454
info:
5555
dy: 30
@@ -72,9 +72,9 @@ instances:
7272
npoints: null
7373
p: 0.5
7474
radius: 30
75-
width: null
75+
width: 0.5
7676
with_arc_floorplan: true
77-
bend_euler_gdsfactorypc_24164978_m31000_30000_A270:
77+
bend_euler_gdsfactorypc_1e74d3cf_m31000_30000_A270:
7878
component: bend_euler
7979
info:
8080
dy: 30
@@ -97,7 +97,7 @@ instances:
9797
npoints: null
9898
p: 0.5
9999
radius: 30
100-
width: null
100+
width: 0.5
101101
with_arc_floorplan: true
102102
extend_ports_gdsfactory_a22b19de_0_0:
103103
component: extend_ports
@@ -147,39 +147,39 @@ instances:
147147
width: null
148148
name: edge_coupler_array_with_76837e7b
149149
nets:
150-
- p1: bend_euler_gdsfactorypc_24164978_0_889000_A180,o1
150+
- p1: bend_euler_gdsfactorypc_1e74d3cf_0_889000_A180,o1
151151
p2: extend_ports_gdsfactory_a22b19de_0_0,o8
152-
- p1: bend_euler_gdsfactorypc_24164978_0_889000_A180,o2
152+
- p1: bend_euler_gdsfactorypc_1e74d3cf_0_889000_A180,o2
153153
p2: straight_gdsfactorypcom_602f5a09_m30000_792000_A90,o2
154-
- p1: bend_euler_gdsfactorypc_24164978_m1000_127000_A180,o1
154+
- p1: bend_euler_gdsfactorypc_1e74d3cf_m1000_127000_A180,o1
155155
p2: extend_ports_gdsfactory_a22b19de_0_0,o2
156-
- p1: bend_euler_gdsfactorypc_24164978_m1000_127000_A180,o2
156+
- p1: bend_euler_gdsfactorypc_1e74d3cf_m1000_127000_A180,o2
157157
p2: straight_gdsfactorypcom_602f5a09_m31000_30000_A90,o2
158-
- p1: bend_euler_gdsfactorypc_24164978_m30000_792000_A270,o1
158+
- p1: bend_euler_gdsfactorypc_1e74d3cf_m30000_792000_A270,o1
159159
p2: straight_gdsfactorypcom_602f5a09_m30000_792000_A90,o1
160-
- p1: bend_euler_gdsfactorypc_24164978_m30000_792000_A270,o2
160+
- p1: bend_euler_gdsfactorypc_1e74d3cf_m30000_792000_A270,o2
161161
p2: extend_ports_gdsfactory_a22b19de_0_0,o7
162-
- p1: bend_euler_gdsfactorypc_24164978_m31000_30000_A270,o1
162+
- p1: bend_euler_gdsfactorypc_1e74d3cf_m31000_30000_A270,o1
163163
p2: straight_gdsfactorypcom_602f5a09_m31000_30000_A90,o1
164-
- p1: bend_euler_gdsfactorypc_24164978_m31000_30000_A270,o2
164+
- p1: bend_euler_gdsfactorypc_1e74d3cf_m31000_30000_A270,o2
165165
p2: extend_ports_gdsfactory_a22b19de_0_0,o1
166166
placements:
167-
bend_euler_gdsfactorypc_24164978_0_889000_A180:
167+
bend_euler_gdsfactorypc_1e74d3cf_0_889000_A180:
168168
mirror: false
169169
rotation: 180
170170
x: 0
171171
y: 889
172-
bend_euler_gdsfactorypc_24164978_m1000_127000_A180:
172+
bend_euler_gdsfactorypc_1e74d3cf_m1000_127000_A180:
173173
mirror: false
174174
rotation: 180
175175
x: -1
176176
y: 127
177-
bend_euler_gdsfactorypc_24164978_m30000_792000_A270:
177+
bend_euler_gdsfactorypc_1e74d3cf_m30000_792000_A270:
178178
mirror: false
179179
rotation: 270
180180
x: -30
181181
y: 792
182-
bend_euler_gdsfactorypc_24164978_m31000_30000_A270:
182+
bend_euler_gdsfactorypc_1e74d3cf_m31000_30000_A270:
183183
mirror: false
184184
rotation: 270
185185
x: -31

0 commit comments

Comments
 (0)