81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
import pytest
|
|
from numpy.testing import assert_allclose
|
|
from numpy import pi
|
|
|
|
from ..builder import Pather
|
|
from ..builder.tools import AutoTool
|
|
from ..library import Library
|
|
from ..pattern import Pattern
|
|
from ..ports import Port
|
|
|
|
|
|
def make_straight(length: float, width: float = 2, ptype: str = "wire") -> Pattern:
|
|
pat = Pattern()
|
|
pat.rect((1, 0), xmin=0, xmax=length, yctr=0, ly=width)
|
|
pat.ports["in"] = Port((0, 0), 0, ptype=ptype)
|
|
pat.ports["out"] = Port((length, 0), pi, ptype=ptype)
|
|
return pat
|
|
|
|
|
|
@pytest.fixture
|
|
def autotool_setup() -> tuple[Pather, AutoTool, Library]:
|
|
lib = Library()
|
|
|
|
# Define a simple bend
|
|
bend_pat = Pattern()
|
|
# 2x2 bend from (0,0) rot 0 to (2, -2) rot pi/2 (Clockwise)
|
|
bend_pat.ports["in"] = Port((0, 0), 0, ptype="wire")
|
|
bend_pat.ports["out"] = Port((2, -2), pi / 2, ptype="wire")
|
|
lib["bend"] = bend_pat
|
|
lib.abstract("bend")
|
|
|
|
# Define a transition (e.g., via)
|
|
via_pat = Pattern()
|
|
via_pat.ports["m1"] = Port((0, 0), 0, ptype="wire_m1")
|
|
via_pat.ports["m2"] = Port((1, 0), pi, ptype="wire_m2")
|
|
lib["via"] = via_pat
|
|
via_abs = lib.abstract("via")
|
|
|
|
tool_m1 = AutoTool(
|
|
straights=[
|
|
AutoTool.Straight(ptype="wire_m1", fn=lambda length: make_straight(length, ptype="wire_m1"), in_port_name="in", out_port_name="out")
|
|
],
|
|
bends=[],
|
|
sbends=[],
|
|
transitions={("wire_m2", "wire_m1"): AutoTool.Transition(via_abs, "m2", "m1")},
|
|
default_out_ptype="wire_m1",
|
|
)
|
|
|
|
p = Pather(lib, tools=tool_m1)
|
|
# Start with an m2 port
|
|
p.ports["start"] = Port((0, 0), pi, ptype="wire_m2")
|
|
|
|
return p, tool_m1, lib
|
|
|
|
|
|
def test_autotool_transition(autotool_setup: tuple[Pather, AutoTool, Library]) -> None:
|
|
p, _tool, _lib = autotool_setup
|
|
|
|
# Route m1 from an m2 port. Should trigger via.
|
|
# length 10. Via length is 1. So straight m1 should be 9.
|
|
p.straight("start", 10)
|
|
|
|
# Start at (0,0) rot pi (facing West).
|
|
# Forward (+pi relative to port) is East (+x).
|
|
# Via: m2(1,0)pi -> m1(0,0)0.
|
|
# Plug via m2 into start(0,0)pi: transformation rot=mod(pi-pi-pi, 2pi)=pi.
|
|
# rotate via by pi: m2 at (0,0), m1 at (-1, 0) rot pi.
|
|
# Then straight m1 of length 9 from (-1, 0) rot pi -> ends at (8, 0) rot pi.
|
|
# Wait, (length, 0) relative to (-1, 0) rot pi:
|
|
# transform (9, 0) by pi: (-9, 0).
|
|
# (-1, 0) + (-9, 0) = (-10, 0)? No.
|
|
# Let's re-calculate.
|
|
# start (0,0) rot pi. Direction East.
|
|
# via m2 is at (0,0), m1 is at (1,0).
|
|
# When via is plugged into start: m2 goes to (0,0).
|
|
# since start is pi and m2 is pi, rotation is 0.
|
|
# so via m1 is at (1,0) rot 0.
|
|
# then straight m1 length 9 from (1,0) rot 0: ends at (10, 0) rot 0.
|
|
|
|
assert_allclose(p.ports["start"].offset, [10, 0], atol=1e-10)
|
|
assert p.ports["start"].ptype == "wire_m1"
|