mirror of https://github.com/VLSIDA/OpenRAM.git
Fix offsets for ring
This commit is contained in:
parent
e611f66767
commit
6de5787e58
|
|
@ -132,25 +132,25 @@ class grid:
|
||||||
# Add the left/right columns
|
# Add the left/right columns
|
||||||
if side=="all" or side=="left":
|
if side=="all" or side=="left":
|
||||||
for x in range(self.ll.x + offset, self.ll.x + width + offset, 1):
|
for x in range(self.ll.x + offset, self.ll.x + width + offset, 1):
|
||||||
for y in range(self.ll.y + margin, self.ur.y - margin, 1):
|
for y in range(self.ll.y + offset + margin, self.ur.y - offset - margin, 1):
|
||||||
for layer in layers:
|
for layer in layers:
|
||||||
perimeter_list.append(vector3d(x, y, layer))
|
perimeter_list.append(vector3d(x, y, layer))
|
||||||
|
|
||||||
if side=="all" or side=="right":
|
if side=="all" or side=="right":
|
||||||
for x in range(self.ur.x - width - offset, self.ur.x - offset, 1):
|
for x in range(self.ur.x - width - offset, self.ur.x - offset, 1):
|
||||||
for y in range(self.ll.y + margin, self.ur.y - margin, 1):
|
for y in range(self.ll.y + offset + margin, self.ur.y - offset - margin, 1):
|
||||||
for layer in layers:
|
for layer in layers:
|
||||||
perimeter_list.append(vector3d(x, y, layer))
|
perimeter_list.append(vector3d(x, y, layer))
|
||||||
|
|
||||||
if side=="all" or side=="bottom":
|
if side=="all" or side=="bottom":
|
||||||
for y in range(self.ll.y + offset, self.ll.y + width + offset, 1):
|
for y in range(self.ll.y + offset, self.ll.y + width + offset, 1):
|
||||||
for x in range(self.ll.x + margin, self.ur.x - margin, 1):
|
for x in range(self.ll.x + offset + margin, self.ur.x - offset - margin, 1):
|
||||||
for layer in layers:
|
for layer in layers:
|
||||||
perimeter_list.append(vector3d(x, y, layer))
|
perimeter_list.append(vector3d(x, y, layer))
|
||||||
|
|
||||||
if side=="all" or side=="top":
|
if side=="all" or side=="top":
|
||||||
for y in range(self.ur.y - width - offset, self.ur.y - offset, 1):
|
for y in range(self.ur.y - width - offset, self.ur.y - offset, 1):
|
||||||
for x in range(self.ll.x + margin, self.ur.x - margin, 1):
|
for x in range(self.ll.x + offset + margin, self.ur.x - offset - margin, 1):
|
||||||
for layer in layers:
|
for layer in layers:
|
||||||
perimeter_list.append(vector3d(x, y, layer))
|
perimeter_list.append(vector3d(x, y, layer))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,9 @@ class router(router_tech):
|
||||||
self.margin = margin
|
self.margin = margin
|
||||||
self.init_bbox(bbox, margin)
|
self.init_bbox(bbox, margin)
|
||||||
|
|
||||||
|
# New pins if we create a ring or side pins or etc.
|
||||||
|
self.new_pins = {}
|
||||||
|
|
||||||
def init_bbox(self, bbox=None, margin=0):
|
def init_bbox(self, bbox=None, margin=0):
|
||||||
"""
|
"""
|
||||||
Initialize the ll,ur values with the paramter or using the layout boundary.
|
Initialize the ll,ur values with the paramter or using the layout boundary.
|
||||||
|
|
@ -907,18 +910,23 @@ class router(router_tech):
|
||||||
layers=[1]))
|
layers=[1]))
|
||||||
pg.enclosures = pg.compute_enclosures()
|
pg.enclosures = pg.compute_enclosures()
|
||||||
pg.pins = set(pg.enclosures)
|
pg.pins = set(pg.enclosures)
|
||||||
|
|
||||||
self.cell.pin_map[name].update(pg.pins)
|
self.cell.pin_map[name].update(pg.pins)
|
||||||
self.pin_groups[name].append(pg)
|
self.pin_groups[name].append(pg)
|
||||||
|
|
||||||
|
self.new_pins[name] = pg.pins
|
||||||
|
|
||||||
def add_ring_supply_pin(self, name, width=2):
|
def add_ring_supply_pin(self, name, width=2):
|
||||||
"""
|
"""
|
||||||
Adds a ring supply pin
|
Adds a ring supply pin that goes inside the given bbox.
|
||||||
"""
|
"""
|
||||||
pg = pin_group(name, [], self)
|
pg = pin_group(name, [], self)
|
||||||
|
# Offset the vdd inside one ring width
|
||||||
|
# Units are in routing grids
|
||||||
if name == "vdd":
|
if name == "vdd":
|
||||||
offset = width
|
offset = width + 1
|
||||||
else:
|
else:
|
||||||
offset = 0
|
offset = 1
|
||||||
|
|
||||||
# LEFT
|
# LEFT
|
||||||
left_grids = set(self.rg.get_perimeter_list(side="left",
|
left_grids = set(self.rg.get_perimeter_list(side="left",
|
||||||
|
|
@ -946,24 +954,30 @@ class router(router_tech):
|
||||||
offset=offset,
|
offset=offset,
|
||||||
layers=[0]))
|
layers=[0]))
|
||||||
|
|
||||||
# The big pin group
|
horizontal_layer_grids = left_grids | right_grids
|
||||||
pg.grids = left_grids | right_grids | top_grids | bottom_grids
|
|
||||||
pg.enclosures = pg.compute_enclosures()
|
|
||||||
pg.pins = set(pg.enclosures)
|
|
||||||
self.cell.pin_map[name].update(pg.pins)
|
|
||||||
self.pin_groups[name].append(pg)
|
|
||||||
|
|
||||||
# Must move to the same layer
|
# Must move to the same layer to find layer 1 corner grids
|
||||||
vertical_layer_grids = set()
|
vertical_layer_grids = set()
|
||||||
for x in top_grids | bottom_grids:
|
for x in top_grids | bottom_grids:
|
||||||
vertical_layer_grids.add(vector3d(x.x, x.y, 1))
|
vertical_layer_grids.add(vector3d(x.x, x.y, 1))
|
||||||
horizontal_layer_grids = left_grids | right_grids
|
|
||||||
|
|
||||||
# Add vias in the overlap points
|
# Add vias in the overlap points
|
||||||
corner_grids = vertical_layer_grids & horizontal_layer_grids
|
horizontal_corner_grids = vertical_layer_grids & horizontal_layer_grids
|
||||||
for g in corner_grids:
|
for g in horizontal_corner_grids:
|
||||||
self.add_via(g)
|
self.add_via(g)
|
||||||
|
|
||||||
|
# The big pin group, but exclude the corners from the pins
|
||||||
|
pg.grids = (left_grids | right_grids | top_grids | bottom_grids)
|
||||||
|
pg.enclosures = pg.compute_enclosures()
|
||||||
|
pg.pins = set(pg.enclosures)
|
||||||
|
|
||||||
|
self.cell.pin_map[name].update(pg.pins)
|
||||||
|
self.pin_groups[name].append(pg)
|
||||||
|
self.new_pins[name] = pg.pins
|
||||||
|
|
||||||
|
def get_new_pins(self, name):
|
||||||
|
return self.new_pins[name]
|
||||||
|
|
||||||
def add_perimeter_target(self, side="all"):
|
def add_perimeter_target(self, side="all"):
|
||||||
"""
|
"""
|
||||||
This will mark all the cells on the perimeter of the original layout as a target.
|
This will mark all the cells on the perimeter of the original layout as a target.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue