From 56e401196acb6f566dbe9cc3b5d014d25ec4c9af Mon Sep 17 00:00:00 2001 From: Jan Petykiewicz Date: Tue, 31 Mar 2026 00:25:14 -0700 Subject: [PATCH] [PathTool] fix pathtool L-shape --- masque/builder/tools.py | 11 ++++++++--- masque/test/test_renderpather.py | 11 +++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/masque/builder/tools.py b/masque/builder/tools.py index 68e89df..f8779bd 100644 --- a/masque/builder/tools.py +++ b/masque/builder/tools.py @@ -1244,7 +1244,7 @@ class PathTool(Tool, metaclass=ABCMeta): port_names: tuple[str, str] = ('A', 'B'), **kwargs, # noqa: ARG002 (unused) ) -> Library: - out_port, dxy = self.planL( + out_port, _data = self.planL( ccw, length, in_ptype=in_ptype, @@ -1252,7 +1252,12 @@ class PathTool(Tool, metaclass=ABCMeta): ) tree, pat = Library.mktree(SINGLE_USE_PREFIX + 'traceL') - pat.path(layer=self.layer, width=self.width, vertices=[(0, 0), (length, 0)]) + vertices: list[tuple[float, float]] + if ccw is None: + vertices = [(0.0, 0.0), (length, 0.0)] + else: + vertices = [(0.0, 0.0), (length, 0.0), tuple(out_port.offset)] + pat.path(layer=self.layer, width=self.width, vertices=vertices) if ccw is None: out_rot = pi @@ -1263,7 +1268,7 @@ class PathTool(Tool, metaclass=ABCMeta): pat.ports = { port_names[0]: Port((0, 0), rotation=0, ptype=self.ptype), - port_names[1]: Port(dxy, rotation=out_rot, ptype=self.ptype), + port_names[1]: Port(out_port.offset, rotation=out_rot, ptype=self.ptype), } return tree diff --git a/masque/test/test_renderpather.py b/masque/test/test_renderpather.py index ee04671..3ad0d95 100644 --- a/masque/test/test_renderpather.py +++ b/masque/test/test_renderpather.py @@ -119,3 +119,14 @@ def test_renderpather_rename_port(rpather_setup: tuple[RenderPather, PathTool, L assert_allclose(path_shape.vertices, [[0, 0], [0, -10], [0, -20]], atol=1e-10) assert "new_start" in rp.ports assert_allclose(rp.ports["new_start"].offset, [0, -20], atol=1e-10) + + +def test_pathtool_traceL_bend_geometry_matches_ports() -> None: + tool = PathTool(layer=(1, 0), width=2, ptype="wire") + + tree = tool.traceL(True, 10) + pat = tree.top_pattern() + path_shape = cast("Path", pat.shapes[(1, 0)][0]) + + assert_allclose(path_shape.vertices, [[0, 0], [10, 0], [10, 1]], atol=1e-10) + assert_allclose(pat.ports["B"].offset, [10, 1], atol=1e-10)