Browse Source

construct input connected to output on passthrough connection

devel
stefan 4 days ago
parent
commit
c90bc89522
  1. 28
      src/kyupy/bench.py

28
src/kyupy/bench.py

@ -14,7 +14,7 @@ Since simulators only support at most four-input-gates, gates with more than fou @@ -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): @@ -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): @@ -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

Loading…
Cancel
Save