/
map_ports_layer_to_orientation.py
76 lines (54 loc) · 1.88 KB
/
map_ports_layer_to_orientation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
"""
when we auto_rename_ports_layer_orientation we get the wrong mapping
"""
from typing import Dict
from gdsfactory.types import Port
def map_ports_layer_to_orientation(ports: Dict[str, Port]) -> Dict[str, str]:
"""Returns ports mapping
{'1_0_W0': 1, '1_0_E0':2}
.. code::
N0 N1
|___|_
W1 -| |- E1
| |
W0 -|______|- E0
| |
S0 S1
"""
m = {}
layers = {port.layer for port in ports.values()}
for layer in layers:
ports_on_layer = [p for p in ports.values() if p.layer == layer]
direction_ports = {x: [] for x in ["E", "N", "W", "S"]}
for p in ports_on_layer:
angle = p.orientation % 360
if angle <= 45 or angle >= 315:
direction_ports["E"].append(p)
elif angle <= 135 and angle >= 45:
direction_ports["N"].append(p)
elif angle <= 225 and angle >= 135:
direction_ports["W"].append(p)
else:
direction_ports["S"].append(p)
for direction, ports_sorted in direction_ports.items():
if direction in ["N", "S"]:
ports_sorted.sort(key=lambda p: +p.x) # sort west to east
else:
ports_sorted.sort(key=lambda p: +p.y) # sort south to north
m.update(
{
f"{layer[0]}_{layer[1]}_{direction}{i}": port.name
for i, port in enumerate(ports_sorted)
}
)
return m
if __name__ == "__main__":
from pprint import pprint
import gdsfactory as gf
# c = gf.Component()
c = gf.components.straight_heater_metal()
# FIXME, this line has an issue
c.auto_rename_ports_layer_orientation()
m = map_ports_layer_to_orientation(c.ports)
pprint(m)
c.show(show_ports=True)