mirror of https://github.com/VLSIDA/OpenRAM.git
Prevent DRC violations for vdd and gnd pins
This commit is contained in:
parent
a47bc7ebee
commit
5bf629f3e5
|
|
@ -47,7 +47,8 @@ class hanan_graph:
|
||||||
# Check if any blockage blocks this probe
|
# Check if any blockage blocks this probe
|
||||||
for blockage in self.graph_blockages:
|
for blockage in self.graph_blockages:
|
||||||
# Check if two shapes overlap
|
# Check if two shapes overlap
|
||||||
if blockage.overlaps(probe_shape):
|
# Inflated blockages of pins don't block probes
|
||||||
|
if blockage.overlaps(probe_shape) and blockage.name != self.source.name:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
@ -67,7 +68,7 @@ class hanan_graph:
|
||||||
|
|
||||||
# Find the blockages that are in the routing area
|
# Find the blockages that are in the routing area
|
||||||
self.graph_blockages = []
|
self.graph_blockages = []
|
||||||
for blockage in self.get_blockages(source.name):
|
for blockage in self.router.blockages:
|
||||||
# Set the region's lpp to current blockage's lpp so that the
|
# Set the region's lpp to current blockage's lpp so that the
|
||||||
# overlaps method works
|
# overlaps method works
|
||||||
region.lpp = blockage.lpp
|
region.lpp = blockage.lpp
|
||||||
|
|
@ -82,24 +83,6 @@ class hanan_graph:
|
||||||
debug.info(0, "Number of nodes in the routing graph: {}".format(len(self.nodes)))
|
debug.info(0, "Number of nodes in the routing graph: {}".format(len(self.nodes)))
|
||||||
|
|
||||||
|
|
||||||
def get_blockages(self, pin_name):
|
|
||||||
"""
|
|
||||||
Return all blockages for this routing region, including pins with
|
|
||||||
different name.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Create a copy of blockages
|
|
||||||
blockages = self.router.blockages[:]
|
|
||||||
# Create a copy of pins with different name than the routed pins
|
|
||||||
offset = self.router.layer_widths[0] / 2
|
|
||||||
for name, pins in self.router.pins.items():
|
|
||||||
if name == pin_name:
|
|
||||||
continue
|
|
||||||
for pin in pins:
|
|
||||||
blockages.append(deepcopy(pin).inflated_pin(multiple=1, extra_spacing=offset))
|
|
||||||
return blockages
|
|
||||||
|
|
||||||
|
|
||||||
def generate_cartesian_values(self):
|
def generate_cartesian_values(self):
|
||||||
"""
|
"""
|
||||||
Generate x and y values from all the corners of the shapes in the
|
Generate x and y values from all the corners of the shapes in the
|
||||||
|
|
@ -200,7 +183,9 @@ class hanan_graph:
|
||||||
point = node.center
|
point = node.center
|
||||||
for blockage in self.graph_blockages:
|
for blockage in self.graph_blockages:
|
||||||
# Remove if the node is inside a blockage
|
# Remove if the node is inside a blockage
|
||||||
if self.inside_shape(point, blockage):
|
# If the blockage is an inflated routable, remove if outside
|
||||||
|
# the routable shape
|
||||||
|
if self.inside_shape(point, blockage) and (blockage.name != self.source.name or not self.inside_shape(point, blockage.inflated_from)):
|
||||||
node.remove_all_neighbors()
|
node.remove_all_neighbors()
|
||||||
self.nodes.remove(node)
|
self.nodes.remove(node)
|
||||||
break
|
break
|
||||||
|
|
|
||||||
|
|
@ -144,6 +144,11 @@ class hanan_router(router_tech):
|
||||||
for blockage in blockages:
|
for blockage in blockages:
|
||||||
self.blockages.append(blockage.inflated_pin(multiple=1, extra_spacing=offset))
|
self.blockages.append(blockage.inflated_pin(multiple=1, extra_spacing=offset))
|
||||||
|
|
||||||
|
# Add vdd and gnd pins as blockages as well
|
||||||
|
# NOTE: This is done to make vdd and gnd pins DRC-safe
|
||||||
|
for pin in self.all_pins:
|
||||||
|
self.blockages.append(pin.inflated_pin(multiple=1, extra_spacing=offset, keep_link=True))
|
||||||
|
|
||||||
|
|
||||||
def add_path(self, path):
|
def add_path(self, path):
|
||||||
""" Add the route path to the layout. """
|
""" Add the route path to the layout. """
|
||||||
|
|
|
||||||
|
|
@ -14,12 +14,14 @@ class hanan_shape(pin_layout):
|
||||||
the Hanan router.
|
the Hanan router.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, name, rect, layer_name_pp):
|
def __init__(self, name, rect, layer_name_pp, inflated_from=None):
|
||||||
|
|
||||||
pin_layout.__init__(self, name, rect, layer_name_pp)
|
pin_layout.__init__(self, name, rect, layer_name_pp)
|
||||||
|
|
||||||
|
self.inflated_from = inflated_from
|
||||||
|
|
||||||
def inflated_pin(self, spacing=None, multiple=0.5, extra_spacing=0):
|
|
||||||
|
def inflated_pin(self, spacing=None, multiple=0.5, extra_spacing=0, keep_link=False):
|
||||||
""" Override the default inflated_pin behavior. """
|
""" Override the default inflated_pin behavior. """
|
||||||
|
|
||||||
ll, ur = self.inflate(spacing, multiple)
|
ll, ur = self.inflate(spacing, multiple)
|
||||||
|
|
@ -27,7 +29,7 @@ class hanan_shape(pin_layout):
|
||||||
newll = ll - extra
|
newll = ll - extra
|
||||||
newur = ur + extra
|
newur = ur + extra
|
||||||
inflated_area = (newll, newur)
|
inflated_area = (newll, newur)
|
||||||
return hanan_shape(self.name, inflated_area, self.layer)
|
return hanan_shape(self.name, inflated_area, self.layer, self if keep_link else None)
|
||||||
|
|
||||||
|
|
||||||
def aligns(self, other):
|
def aligns(self, other):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue