mirror of https://github.com/VLSIDA/OpenRAM.git
Don't add vias when placing dff array
This commit is contained in:
parent
286ac635d6
commit
94b1e729ab
|
|
@ -477,7 +477,6 @@ class layout():
|
||||||
"""
|
"""
|
||||||
Remove the old pin and replace with a new one
|
Remove the old pin and replace with a new one
|
||||||
"""
|
"""
|
||||||
import pdb; pdb.set_trace()
|
|
||||||
self.remove_layout_pin(text)
|
self.remove_layout_pin(text)
|
||||||
self.add_layout_pin(text=text,
|
self.add_layout_pin(text=text,
|
||||||
layer=pin.layer,
|
layer=pin.layer,
|
||||||
|
|
@ -1209,7 +1208,7 @@ class layout():
|
||||||
elif add_vias:
|
elif add_vias:
|
||||||
self.add_power_pin(name, pin.center(), start_layer=pin.layer)
|
self.add_power_pin(name, pin.center(), start_layer=pin.layer)
|
||||||
|
|
||||||
def add_io_pin(self, instance, pin_name, new_name=""):
|
def add_io_pin(self, instance, pin_name, new_name="", start_layer=None):
|
||||||
"""
|
"""
|
||||||
Add a signle input or output pin up to metal 3.
|
Add a signle input or output pin up to metal 3.
|
||||||
"""
|
"""
|
||||||
|
|
@ -1218,8 +1217,11 @@ class layout():
|
||||||
if new_name == "":
|
if new_name == "":
|
||||||
new_name = pin_name
|
new_name = pin_name
|
||||||
|
|
||||||
|
if not start_layer:
|
||||||
|
start_layer = pin.layer
|
||||||
|
|
||||||
# Just use the power pin function for now to save code
|
# Just use the power pin function for now to save code
|
||||||
self.add_power_pin(name=new_name, loc=pin.center(), start_layer=pin.layer)
|
self.add_power_pin(name=new_name, loc=pin.center(), start_layer=start_layer)
|
||||||
|
|
||||||
def add_power_pin(self, name, loc, size=[1, 1], directions=None, start_layer="m1"):
|
def add_power_pin(self, name, loc, size=[1, 1], directions=None, start_layer="m1"):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -119,8 +119,6 @@ class supply_tree_router(router):
|
||||||
if mst[x][y]>0:
|
if mst[x][y]>0:
|
||||||
connections.append((x, y))
|
connections.append((x, y))
|
||||||
|
|
||||||
debug.info(1,"MST has {0} segments.".format(len(connections)))
|
|
||||||
|
|
||||||
# Route MST components
|
# Route MST components
|
||||||
for (src, dest) in connections:
|
for (src, dest) in connections:
|
||||||
self.route_signal(pin_name, src, dest)
|
self.route_signal(pin_name, src, dest)
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,7 @@ class sram_1bank(sram_base):
|
||||||
# We need to temporarily add some pins for the x offsets
|
# We need to temporarily add some pins for the x offsets
|
||||||
# but we'll remove them so that they have the right y
|
# but we'll remove them so that they have the right y
|
||||||
# offsets after the DFF placement.
|
# offsets after the DFF placement.
|
||||||
self.add_layout_pins(escape_route=False)
|
self.add_layout_pins(escape_route=False, add_vias=False)
|
||||||
self.route_dffs(add_routes=False)
|
self.route_dffs(add_routes=False)
|
||||||
self.remove_layout_pins()
|
self.remove_layout_pins()
|
||||||
|
|
||||||
|
|
@ -245,7 +245,7 @@ class sram_1bank(sram_base):
|
||||||
self.data_pos[port] = vector(x_offset, y_offset)
|
self.data_pos[port] = vector(x_offset, y_offset)
|
||||||
self.spare_wen_pos[port] = vector(x_offset, y_offset)
|
self.spare_wen_pos[port] = vector(x_offset, y_offset)
|
||||||
|
|
||||||
def add_layout_pins(self, escape_route=True):
|
def add_layout_pins(self, escape_route=True, add_vias=True):
|
||||||
"""
|
"""
|
||||||
Add the top-level pins for a single bank SRAM with control.
|
Add the top-level pins for a single bank SRAM with control.
|
||||||
"""
|
"""
|
||||||
|
|
@ -257,14 +257,25 @@ class sram_1bank(sram_base):
|
||||||
# Port 1 is right/top
|
# Port 1 is right/top
|
||||||
bottom_or_top = "bottom" if port==0 else "top"
|
bottom_or_top = "bottom" if port==0 else "top"
|
||||||
left_or_right = "left" if port==0 else "right"
|
left_or_right = "left" if port==0 else "right"
|
||||||
|
|
||||||
|
# Hack: If we are escape routing, set the pin layer to
|
||||||
|
# None so that we will start from the pin layer
|
||||||
|
# Otherwise, set it as the pin layer so that no vias are added.
|
||||||
|
# Otherwise, when we remove pins to move the dff array dynamically,
|
||||||
|
# we will leave some remaining vias when the pin locations change.
|
||||||
|
if add_vias:
|
||||||
|
pin_layer = None
|
||||||
|
else:
|
||||||
|
pin_layer = self.pwr_grid_layer
|
||||||
|
|
||||||
# Connect the control pins as inputs
|
# Connect the control pins as inputs
|
||||||
for signal in self.control_logic_inputs[port]:
|
for signal in self.control_logic_inputs[port]:
|
||||||
if signal.startswith("rbl"):
|
if signal.startswith("rbl"):
|
||||||
continue
|
continue
|
||||||
self.add_io_pin(self.control_logic_insts[port],
|
self.add_io_pin(self.control_logic_insts[port],
|
||||||
signal,
|
signal,
|
||||||
signal + "{}".format(port))
|
signal + "{}".format(port),
|
||||||
|
start_layer=pin_layer)
|
||||||
if signal=="clk":
|
if signal=="clk":
|
||||||
all_pins.append(("{0}{1}".format(signal, port), bottom_or_top))
|
all_pins.append(("{0}{1}".format(signal, port), bottom_or_top))
|
||||||
else:
|
else:
|
||||||
|
|
@ -274,27 +285,31 @@ class sram_1bank(sram_base):
|
||||||
for bit in range(self.word_size + self.num_spare_cols):
|
for bit in range(self.word_size + self.num_spare_cols):
|
||||||
self.add_io_pin(self.data_dff_insts[port],
|
self.add_io_pin(self.data_dff_insts[port],
|
||||||
"din_{}".format(bit),
|
"din_{}".format(bit),
|
||||||
"din{0}[{1}]".format(port, bit))
|
"din{0}[{1}]".format(port, bit),
|
||||||
|
start_layer=pin_layer)
|
||||||
all_pins.append(("din{0}[{1}]".format(port, bit), bottom_or_top))
|
all_pins.append(("din{0}[{1}]".format(port, bit), bottom_or_top))
|
||||||
|
|
||||||
if port in self.readwrite_ports or port in self.read_ports:
|
if port in self.readwrite_ports or port in self.read_ports:
|
||||||
for bit in range(self.word_size + self.num_spare_cols):
|
for bit in range(self.word_size + self.num_spare_cols):
|
||||||
self.add_io_pin(self.bank_inst,
|
self.add_io_pin(self.bank_inst,
|
||||||
"dout{0}_{1}".format(port, bit),
|
"dout{0}_{1}".format(port, bit),
|
||||||
"dout{0}[{1}]".format(port, bit))
|
"dout{0}[{1}]".format(port, bit),
|
||||||
|
start_layer=pin_layer)
|
||||||
all_pins.append(("dout{0}[{1}]".format(port, bit), bottom_or_top))
|
all_pins.append(("dout{0}[{1}]".format(port, bit), bottom_or_top))
|
||||||
|
|
||||||
for bit in range(self.col_addr_size):
|
for bit in range(self.col_addr_size):
|
||||||
self.add_io_pin(self.col_addr_dff_insts[port],
|
self.add_io_pin(self.col_addr_dff_insts[port],
|
||||||
"din_{}".format(bit),
|
"din_{}".format(bit),
|
||||||
"addr{0}[{1}]".format(port, bit))
|
"addr{0}[{1}]".format(port, bit),
|
||||||
|
start_layer=pin_layer)
|
||||||
|
|
||||||
all_pins.append(("addr{0}[{1}]".format(port, bit), bottom_or_top))
|
all_pins.append(("addr{0}[{1}]".format(port, bit), bottom_or_top))
|
||||||
|
|
||||||
for bit in range(self.row_addr_size):
|
for bit in range(self.row_addr_size):
|
||||||
self.add_io_pin(self.row_addr_dff_insts[port],
|
self.add_io_pin(self.row_addr_dff_insts[port],
|
||||||
"din_{}".format(bit),
|
"din_{}".format(bit),
|
||||||
"addr{0}[{1}]".format(port, bit + self.col_addr_size))
|
"addr{0}[{1}]".format(port, bit + self.col_addr_size),
|
||||||
|
start_layer=pin_layer)
|
||||||
all_pins.append(("addr{0}[{1}]".format(port, bit + self.col_addr_size), left_or_right))
|
all_pins.append(("addr{0}[{1}]".format(port, bit + self.col_addr_size), left_or_right))
|
||||||
|
|
||||||
if port in self.write_ports:
|
if port in self.write_ports:
|
||||||
|
|
@ -302,14 +317,16 @@ class sram_1bank(sram_base):
|
||||||
for bit in range(self.num_wmasks):
|
for bit in range(self.num_wmasks):
|
||||||
self.add_io_pin(self.wmask_dff_insts[port],
|
self.add_io_pin(self.wmask_dff_insts[port],
|
||||||
"din_{}".format(bit),
|
"din_{}".format(bit),
|
||||||
"wmask{0}[{1}]".format(port, bit))
|
"wmask{0}[{1}]".format(port, bit),
|
||||||
|
start_layer=pin_layer)
|
||||||
all_pins.append(("wmask{0}[{1}]".format(port, bit), bottom_or_top))
|
all_pins.append(("wmask{0}[{1}]".format(port, bit), bottom_or_top))
|
||||||
|
|
||||||
if port in self.write_ports:
|
if port in self.write_ports:
|
||||||
for bit in range(self.num_spare_cols):
|
for bit in range(self.num_spare_cols):
|
||||||
self.add_io_pin(self.spare_wen_dff_insts[port],
|
self.add_io_pin(self.spare_wen_dff_insts[port],
|
||||||
"din_{}".format(bit),
|
"din_{}".format(bit),
|
||||||
"spare_wen{0}[{1}]".format(port, bit))
|
"spare_wen{0}[{1}]".format(port, bit),
|
||||||
|
start_layer=pin_layer)
|
||||||
all_pins.append(("spare_wen{0}[{1}]".format(port, bit), bottom_or_top))
|
all_pins.append(("spare_wen{0}[{1}]".format(port, bit), bottom_or_top))
|
||||||
|
|
||||||
if escape_route:
|
if escape_route:
|
||||||
|
|
|
||||||
|
|
@ -196,7 +196,7 @@ class sram_base(design, verilog, lef):
|
||||||
|
|
||||||
self.add_lvs_correspondence_points()
|
self.add_lvs_correspondence_points()
|
||||||
|
|
||||||
self.offset_all_coordinates()
|
#self.offset_all_coordinates()
|
||||||
|
|
||||||
highest_coord = self.find_highest_coords()
|
highest_coord = self.find_highest_coords()
|
||||||
self.width = highest_coord[0]
|
self.width = highest_coord[0]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue