From 091d0f8775591b8247287427d81a4b3f75789381 Mon Sep 17 00:00:00 2001 From: Eren Dogan Date: Wed, 26 Jul 2023 21:46:30 -0700 Subject: [PATCH] Convert pins and blockages for graph router --- compiler/router/graph_router.py | 38 +++++++++++++++++++++++++++++++++ compiler/router/graph_shape.py | 7 ++++++ 2 files changed, 45 insertions(+) diff --git a/compiler/router/graph_router.py b/compiler/router/graph_router.py index d7075831..1423870e 100644 --- a/compiler/router/graph_router.py +++ b/compiler/router/graph_router.py @@ -75,6 +75,10 @@ class graph_router(router_tech): self.find_blockages() self.find_vias() + # Convert blockages and vias if they overlap a pin + self.convert_vias() + self.convert_blockages() + # Add side pins self.calculate_ring_bbox() if self.pin_type in ["top", "bottom", "right", "left"]: @@ -229,6 +233,40 @@ class graph_router(router_tech): self.vias.append(self.inflate_shape(new_shape, is_via=True)) + def convert_vias(self): + """ Convert the vias that overlap a pin. """ + + for via in self.vias: + via_core = via.get_core() + for pin in self.all_pins: + pin_core = pin.get_core() + via_core.lpp = pin_core.lpp + if via_core.overlaps(pin_core): + via.rename(pin.name) + break + + + def convert_blockages(self): + """ Convert the blockages that overlap a pin. """ + + for blockage in self.blockages: + blockage_core = blockage.get_core() + for pin in self.all_pins: + pin_core = pin.get_core() + if blockage_core.overlaps(pin_core): + blockage.rename(pin.name) + break + else: + for via in self.vias: + if via.name == "via": + continue + via_core = via.get_core() + via_core.lpp = blockage_core.lpp + if blockage_core.overlaps(via_core): + blockage.rename(via.name) + break + + def inflate_shape(self, shape, is_pin=False, is_via=False): """ Inflate a given shape with spacing rules. """ diff --git a/compiler/router/graph_shape.py b/compiler/router/graph_shape.py index 13a572c1..1221dabe 100644 --- a/compiler/router/graph_shape.py +++ b/compiler/router/graph_shape.py @@ -44,6 +44,13 @@ class graph_shape(pin_layout): return snap(super().width()) + def rename(self, new_name): + """ Change the name of `self` and `self.core`. """ + + self.name = new_name + self.get_core().name = new_name + + def get_core(self): """ Return `self` if `self.core` is None. Otherwise, return `self.core`.