mirror of https://github.com/VLSIDA/OpenRAM.git
Avoid DRC errors when routing the same type of pin
This commit is contained in:
parent
38110a55e1
commit
6e051e7f06
|
|
@ -53,9 +53,33 @@ class 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
|
||||||
# Inflated blockages of pins don't block probes
|
if blockage.overlaps(probe_shape):
|
||||||
if blockage.overlaps(probe_shape) and (not self.is_routable(blockage) or not blockage.inflated_from.overlaps(probe_shape)):
|
# Probe is blocked if the shape isn't routable
|
||||||
return True
|
if not self.is_routable(blockage):
|
||||||
|
return True
|
||||||
|
elif blockage.inflated_from is None:
|
||||||
|
continue
|
||||||
|
elif blockage.inflated_from.overlaps(probe_shape):
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_node_blocked(self, node):
|
||||||
|
""" Return if a node is blocked by a blockage. """
|
||||||
|
|
||||||
|
for blockage in self.graph_blockages:
|
||||||
|
# Check if two shapes overlap
|
||||||
|
if self.inside_shape(node.center, blockage):
|
||||||
|
if not self.is_routable(blockage):
|
||||||
|
return True
|
||||||
|
elif blockage.inflated_from is None:
|
||||||
|
return False
|
||||||
|
elif self.inside_shape(node.center, blockage.inflated_from):
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -77,14 +101,14 @@ class 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.router.blockages:
|
for blockage in self.router.blockages:
|
||||||
# FIXME: Include pins as blockages as well to prevent DRC errors
|
|
||||||
if self.is_routable(blockage):
|
|
||||||
continue
|
|
||||||
# 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
|
||||||
if region.overlaps(blockage):
|
if region.overlaps(blockage):
|
||||||
self.graph_blockages.append(blockage)
|
self.graph_blockages.append(blockage)
|
||||||
|
for shape in [source, target]:
|
||||||
|
if shape not in self.graph_blockages:
|
||||||
|
self.graph_blockages.append(shape)
|
||||||
debug.info(3, "Number of blockages detected in the routing region: {}".format(len(self.graph_blockages)))
|
debug.info(3, "Number of blockages detected in the routing region: {}".format(len(self.graph_blockages)))
|
||||||
|
|
||||||
# Create the graph
|
# Create the graph
|
||||||
|
|
@ -106,7 +130,9 @@ class graph:
|
||||||
# Add inner values for blockages of the routed type
|
# Add inner values for blockages of the routed type
|
||||||
x_offset = vector(self.router.offset, 0)
|
x_offset = vector(self.router.offset, 0)
|
||||||
y_offset = vector(0, self.router.offset)
|
y_offset = vector(0, self.router.offset)
|
||||||
for shape in [self.source, self.target]:
|
for shape in self.graph_blockages:
|
||||||
|
if not self.is_routable(shape):
|
||||||
|
continue
|
||||||
aspect_ratio = shape.width() / shape.height()
|
aspect_ratio = shape.width() / shape.height()
|
||||||
# FIXME: Aspect ratio may not be the best way to determine this
|
# FIXME: Aspect ratio may not be the best way to determine this
|
||||||
# If the pin is tall or fat, add two points on the ends
|
# If the pin is tall or fat, add two points on the ends
|
||||||
|
|
@ -185,14 +211,8 @@ class graph:
|
||||||
|
|
||||||
for i in range(len(self.nodes) - 1, -1, -1):
|
for i in range(len(self.nodes) - 1, -1, -1):
|
||||||
node = self.nodes[i]
|
node = self.nodes[i]
|
||||||
point = node.center
|
if self.is_node_blocked(node):
|
||||||
for blockage in self.graph_blockages:
|
node.remove = True
|
||||||
# Remove if the node is inside a blockage
|
|
||||||
# If the blockage is an inflated routable, remove if outside
|
|
||||||
# the routable shape
|
|
||||||
if self.inside_shape(point, blockage) and (not self.is_routable(blockage) or not self.inside_shape(point, blockage.inflated_from)):
|
|
||||||
node.remove = True
|
|
||||||
break
|
|
||||||
|
|
||||||
|
|
||||||
def remove_blocked_nodes(self):
|
def remove_blocked_nodes(self):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue