From ba8e80d2053ead94925de7627589d9b8c8ecd9f7 Mon Sep 17 00:00:00 2001 From: Eren Dogan Date: Wed, 2 Aug 2023 19:33:48 -0700 Subject: [PATCH] Replace layout pins in the new signal escape router --- compiler/router/router.py | 14 +++++++++----- compiler/router/signal_escape_router.py | 17 ++++++++++++++++- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/compiler/router/router.py b/compiler/router/router.py index 39c5cdb1..1fc83bef 100644 --- a/compiler/router/router.py +++ b/compiler/router/router.py @@ -227,7 +227,8 @@ class router(router_tech): """ Add the route path to the layout. """ nodes = self.prepare_path(path) - self.add_route(nodes) + shapes = self.add_route(nodes) + return shapes def prepare_path(self, path): @@ -263,6 +264,7 @@ class router(router_tech): working for this router. """ + new_shapes = [] for i in range(0, len(nodes) - 1): start = nodes[i].center end = nodes[i + 1].center @@ -276,10 +278,12 @@ class router(router_tech): self.design.add_via_center(layers=self.layers, offset=offset) else: # Wire - self.design.add_rect(layer=self.get_layer(start.z), - offset=offset, - width=abs(diff.x) + self.track_wire, - height=abs(diff.y) + self.track_wire) + shape = self.design.add_rect(layer=self.get_layer(start.z), + offset=offset, + width=abs(diff.x) + self.track_wire, + height=abs(diff.y) + self.track_wire) + new_shapes.append(shape) + return new_shapes def write_debug_gds(self, gds_name, g=None, source=None, target=None): diff --git a/compiler/router/signal_escape_router.py b/compiler/router/signal_escape_router.py index 945b4b40..ffe47981 100644 --- a/compiler/router/signal_escape_router.py +++ b/compiler/router/signal_escape_router.py @@ -79,12 +79,14 @@ class signal_escape_router(router): debug.info(0, "Retry routing in larger routing region with scale {}".format(scale)) continue # Create the path shapes on layout - self.add_path(path) + new_shapes = self.add_path(path) + self.new_pins[source.name] = new_shapes[0] # Find the recently added shapes self.prepare_gds_reader() self.find_blockages(name) self.find_vias() break + self.replace_layout_pins() def add_perimeter_fake_pins(self): @@ -152,3 +154,16 @@ class signal_escape_router(router): fake = self.get_closest_perimeter_fake_pin(pin) to_route.append((pin, fake, pin.distance(fake))) return sorted(to_route, key=lambda x: x[2]) + + + def replace_layout_pins(self): + """ """ + + for name, pin in self.new_pins.items(): + pin = graph_shape(pin.name, pin.boundary, pin.lpp) + # Find the intersection of this pin on the perimeter + for fake in self.fake_pins: + edge = pin.intersection(fake) + if edge: + break + self.design.replace_layout_pin(name, edge)