Rewrite enclose grids to be cleaner

This commit is contained in:
mrg 2021-02-26 11:14:08 -08:00
parent 013836bb3d
commit 2a9b5db6d4
1 changed files with 16 additions and 13 deletions

View File

@ -34,7 +34,6 @@ class pin_group:
# Remove any redundant pins (i.e. contained in other pins) # Remove any redundant pins (i.e. contained in other pins)
self.remove_redundant_pins() self.remove_redundant_pins()
self.router = router self.router = router
# These are the corresponding pin grids for each pin group. # These are the corresponding pin grids for each pin group.
self.grids = set() self.grids = set()
@ -101,13 +100,11 @@ class pin_group:
if local_debug: if local_debug:
debug.info(0, "INITIAL: {}".format(pin_list)) debug.info(0, "INITIAL: {}".format(pin_list))
new_pin_list = pin_list.copy() add_indices = set(range(len(pin_list)))
remove_indices = set()
# This is n^2, but the number is small # This is n^2, but the number is small
for index1, pin1 in enumerate(pin_list): for index1, pin1 in enumerate(pin_list):
# If we remove this pin, it can't contain other pins # If we remove this pin, it can't contain other pins
if index1 in remove_indices: if index1 not in add_indices:
continue continue
for index2, pin2 in enumerate(pin_list): for index2, pin2 in enumerate(pin_list):
@ -117,17 +114,15 @@ class pin_group:
if index1 == index2: if index1 == index2:
continue continue
# If we already removed it, can't remove it again... # If we already removed it, can't remove it again...
if index2 in remove_indices: if index2 not in add_indices:
continue continue
if pin1.contains(pin2): if pin1.contains(pin2):
if local_debug: if local_debug:
debug.info(0, "{0} contains {1}".format(pin1, pin2)) debug.info(0, "{0} contains {1}".format(pin1, pin2))
remove_indices.add(index2) add_indices.remove(index2)
# Remove them in decreasing order to not invalidate the indices new_pin_list = [pin_list[x] for x in add_indices]
for i in sorted(remove_indices, reverse=True):
del new_pin_list[i]
if local_debug: if local_debug:
debug.info(0, "FINAL : {}".format(new_pin_list)) debug.info(0, "FINAL : {}".format(new_pin_list))
@ -423,13 +418,15 @@ class pin_group:
# We may have started with an empty set # We may have started with an empty set
debug.check(len(self.grids) > 0, "Cannot seed an grid empty set.") debug.check(len(self.grids) > 0, "Cannot seed an grid empty set.")
common_blockages = self.router.get_blocked_grids() & self.grids
# Start with the ll and make the widest row # Start with the ll and make the widest row
row = [ll] row = [ll]
# Move in dir1 while we can # Move in dir1 while we can
while True: while True:
next_cell = row[-1] + offset1 next_cell = row[-1] + offset1
# Can't move if not in the pin shape # Can't move if not in the pin shape
if next_cell in self.grids and next_cell not in self.router.get_blocked_grids(): if next_cell in self.grids and next_cell not in common_blockages:
row.append(next_cell) row.append(next_cell)
else: else:
break break
@ -438,7 +435,7 @@ class pin_group:
next_row = [x + offset2 for x in row] next_row = [x + offset2 for x in row]
for cell in next_row: for cell in next_row:
# Can't move if any cell is not in the pin shape # Can't move if any cell is not in the pin shape
if cell not in self.grids or cell in self.router.get_blocked_grids(): if cell not in self.grids or cell in common_blockages:
break break
else: else:
row = next_row row = next_row
@ -619,6 +616,11 @@ class pin_group:
# Set of track adjacent to or paritally overlap a pin (not full DRC connection) # Set of track adjacent to or paritally overlap a pin (not full DRC connection)
partial_set = set() partial_set = set()
# for pin in self.pins:
# lx = pin.lx()
# ly = pin.by()
# if lx > 87.9 and lx < 87.99 and ly > 18.56 and ly < 18.6:
# breakpoint()
for pin in self.pins: for pin in self.pins:
debug.info(4, " Converting {0}".format(pin)) debug.info(4, " Converting {0}".format(pin))
# Determine which tracks the pin overlaps # Determine which tracks the pin overlaps
@ -632,7 +634,8 @@ class pin_group:
blockage_in_tracks = self.router.convert_blockage(pin) blockage_in_tracks = self.router.convert_blockage(pin)
# Must include the pins here too because these are computed in a different # Must include the pins here too because these are computed in a different
# way than blockages. # way than blockages.
self.blockages.update(sufficient | insufficient | blockage_in_tracks) blockages = sufficient | insufficient | blockage_in_tracks
self.blockages.update(blockages)
# If we have a blockage, we must remove the grids # If we have a blockage, we must remove the grids
# Remember, this excludes the pin blockages already # Remember, this excludes the pin blockages already