From 2a8879e3d43a9c1cab12cca37de26256de0459fa Mon Sep 17 00:00:00 2001 From: Jan Petykiewicz Date: Wed, 12 Nov 2025 23:53:45 -0800 Subject: [PATCH] [AutoTool] consolidate duplicate code for path() and render() --- masque/builder/tools.py | 130 +++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 67 deletions(-) diff --git a/masque/builder/tools.py b/masque/builder/tools.py index d28b402..31cc289 100644 --- a/masque/builder/tools.py +++ b/masque/builder/tools.py @@ -516,44 +516,6 @@ class AutoTool(Tool, metaclass=ABCMeta): self.transitions.setdefault(ooii, self.transitions[iioo].reversed()) return self - def path( - self, - ccw: SupportsBool | None, - length: float, - *, - in_ptype: str | None = None, - out_ptype: str | None = None, - port_names: tuple[str, str] = ('A', 'B'), - **kwargs, - ) -> Library: - _out_port, data = self.planL( - ccw, - length, - in_ptype = in_ptype, - out_ptype = out_ptype, - ) - - tree, pat = Library.mktree(SINGLE_USE_PREFIX + 'path') - pat.add_port_pair(names=port_names, ptype='unk' if in_ptype is None else in_ptype) - if data.in_transition: - pat.plug(data.in_transition.abstract, {port_names[1]: data.in_transition.their_port_name}) - if not numpy.isclose(data.straight_length, 0): - straight_pat_or_tree = data.straight.fn(data.straight_length, **kwargs) - if isinstance(straight_pat_or_tree, Pattern): - straight = tree <= {SINGLE_USE_PREFIX + 'straight': straight_pat_or_tree} - else: - straight = tree <= straight_pat_or_tree - pat.plug(straight, {port_names[1]: data.straight.in_port_name}) - if data.b_transition: - pat.plug(data.b_transition.abstract, {port_names[1]: data.b_transition.our_port_name}) - if data.ccw is not None: - assert data.bend is not None - pat.plug(data.bend.abstract, {port_names[1]: data.bend.in_port_name}, mirrored=bool(data.ccw) == data.bend.clockwise) - if data.out_transition: - pat.plug(data.out_transition.abstract, {port_names[1]: data.out_transition.our_port_name}) - - return tree - @staticmethod def _bend2dxy(bend: Bend, ccw: SupportsBool | None) -> tuple[NDArray[numpy.float64], float]: if ccw is None: @@ -647,6 +609,68 @@ class AutoTool(Tool, metaclass=ABCMeta): out_port = Port((length, bend_run), rotation=bend_angle, ptype=out_ptype_actual) return out_port, data + def _renderL( + self, + data: LData, + tree: ILibrary, + port_names: tuple[str, str], + append: bool, + ) -> ILibrary: + """ + Render an L step into a preexisting tree + """ + pat = tree.top() + if data.in_transition: + pat.plug(data.in_transition.abstract, {port_names[1]: data.in_transition.their_port_name}) + if not numpy.isclose(data.straight_length, 0): + straight_pat_or_tree = data.straight.fn(data.straight_length, **kwargs) + pmap = {port_names[1]: data.straight.in_port_name} + if isinstance(straight_pat_or_tree, Pattern): + straight_pat = straight_pat_or_tree + if append: + pat.plug(straight_pat, pmap, append=True) + else: + straight_name = tree <= {SINGLE_USE_PREFIX + 'straight': straight_pat} + pat.plug(straight_name, pmap) + else: + straight_tree = straight_pat_or_tree + if append: + top = straight_tree.top() + straight_tree.flatten(top) + pat.plug(straight_tree[top], pmap, append=True) + else: + straight = tree <= straight_pat_or_tree + pat.plug(straight, pmap) + if data.b_transition: + pat.plug(data.b_transition.abstract, {port_names[1]: data.b_transition.our_port_name}) + if data.ccw is not None: + pat.plug(data.bend.abstract, {port_names[1]: data.bend.in_port_name}, mirrored=bool(data.ccw) == data.bend.clockwise) + if data.out_transition: + pat.plug(data.out_transition.abstract, {port_names[1]: data.out_transition.our_port_name}) + return tree + + def path( + self, + ccw: SupportsBool | None, + length: float, + *, + in_ptype: str | None = None, + out_ptype: str | None = None, + port_names: tuple[str, str] = ('A', 'B'), + **kwargs, + ) -> Library: + _out_port, data = self.planL( + ccw, + length, + in_ptype = in_ptype, + out_ptype = out_ptype, + ) + + tree, pat = Library.mktree(SINGLE_USE_PREFIX + 'path') + pat.add_port_pair(names=port_names, ptype='unk' if in_ptype is None else in_ptype) + self._renderL(data=data, tree=tree, port_names=port_names, append=False) + return tree + def render( self, batch: Sequence[RenderStep], @@ -660,37 +684,9 @@ class AutoTool(Tool, metaclass=ABCMeta): pat.add_port_pair(names=(port_names[0], port_names[1])) for step in batch: - data = step.data assert step.tool == self - if step.opcode == 'L': - if data.in_transition: - pat.plug(data.in_transition.abstract, {port_names[1]: data.in_transition.their_port_name}) - if not numpy.isclose(data.straight_length, 0): - straight_pat_or_tree = data.straight.fn(data.straight_length, **kwargs) - pmap = {port_names[1]: data.straight.in_port_name} - if isinstance(straight_pat_or_tree, Pattern): - straight_pat = straight_pat_or_tree - if append: - pat.plug(straight_pat, pmap, append=True) - else: - straight_name = tree <= {SINGLE_USE_PREFIX + 'straight': straight_pat} - pat.plug(straight_name, pmap) - else: - straight_tree = straight_pat_or_tree - if append: - top = straight_tree.top() - straight_tree.flatten(top) - pat.plug(straight_tree[top], pmap, append=True) - else: - straight = tree <= straight_pat_or_tree - pat.plug(straight, pmap) - if data.b_transition: - pat.plug(data.b_transition.abstract, {port_names[1]: data.b_transition.our_port_name}) - if data.ccw is not None: - pat.plug(data.bend.abstract, {port_names[1]: data.bend.in_port_name}, mirrored=bool(data.ccw) == data.bend.clockwise) - if data.out_transition: - pat.plug(data.out_transition.abstract, {port_names[1]: data.out_transition.our_port_name}) + self._renderL(data=step.data, tree=tree, port_names=port_names, append=append) return tree