From c90bc89522bd0ba39ac0786dd43f19a8502c4224 Mon Sep 17 00:00:00 2001 From: stefan Date: Wed, 24 Jun 2026 22:42:10 +0900 Subject: [PATCH] construct input connected to output on passthrough connection --- src/kyupy/bench.py | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/kyupy/bench.py b/src/kyupy/bench.py index 63cb8b4..d8fe98f 100644 --- a/src/kyupy/bench.py +++ b/src/kyupy/bench.py @@ -14,7 +14,7 @@ Since simulators only support at most four-input-gates, gates with more than fou from lark import Lark, Transformer from .circuit import Circuit, Node, Line -from . import readtext, batchrange +from . import readtext, batchrange, log def treeify(l, max_degree=4): if len(l) <= max_degree: return l @@ -26,12 +26,32 @@ class BenchTransformer(Transformer): def __init__(self, name): super().__init__() self.c = Circuit(name) + self.inputs = set() + self.outputs = set() def start(self, _): return self.c def parameters(self, args): return [self.c.get_or_add_fork(str(name)) for name in args if name is not None] - def interface(self, args): self.c.io_nodes.extend(args[0]) + def input(self, args): + for input in args[0]: + if input in self.outputs: + new_input = self.c.get_or_add_fork(input.name + '~i') + Line(self.c, new_input, input) + log.warn(f'input-output passthrough, renaming input: {input.name} -> {new_input.name}') + input = new_input + self.inputs.add(input) + self.c.io_nodes.append(input) + + def output(self, args): + for output in args[0]: + if output in self.inputs: + new_output = self.c.get_or_add_fork(output.name + '~o') + Line(self.c, output, new_output) + log.warn(f'input-output passthrough, renaming output: {output.name} -> {new_output.name}') + output = new_output + self.outputs.add(output) + self.c.io_nodes.append(output) def _cell_tree_inner(self, name, kind, inner_kind, drivers): cell = Node(self.c, name, f'{kind}{len(drivers)}') @@ -69,8 +89,8 @@ class BenchTransformer(Transformer): GRAMMAR = r""" start: (statement)* statement: input | output | assignment - input: ("INPUT" | "input") parameters -> interface - output: ("OUTPUT" | "output") parameters -> interface + input: ("INPUT" | "input") parameters + output: ("OUTPUT" | "output") parameters assignment: NAME "=" NAME parameters parameters: "(" [ NAME ( "," NAME )* ] ")" NAME: /[-_a-z0-9]+/i