mirror of https://github.com/VLSIDA/OpenRAM.git
Extra track in data bus. Remove old code.
This commit is contained in:
parent
eb11ac22f3
commit
5626fd182e
|
|
@ -73,10 +73,11 @@ class sram_1bank(sram_base):
|
||||||
self.data_bus_gap = self.m4_nonpref_pitch * 2
|
self.data_bus_gap = self.m4_nonpref_pitch * 2
|
||||||
|
|
||||||
# Spare wen are on a separate layer so not included
|
# Spare wen are on a separate layer so not included
|
||||||
self.data_bus_size = [None] * len(self.all_ports)
|
# Start with 1 track minimum
|
||||||
|
self.data_bus_size = [1] * len(self.all_ports)
|
||||||
for port in self.all_ports:
|
for port in self.all_ports:
|
||||||
# All ports need the col addr flops
|
# All ports need the col addr flops
|
||||||
self.data_bus_size[port] = self.col_addr_size
|
self.data_bus_size[port] += self.col_addr_size
|
||||||
# Write ports need the data input flops and write mask flops
|
# Write ports need the data input flops and write mask flops
|
||||||
if port in self.write_ports:
|
if port in self.write_ports:
|
||||||
self.data_bus_size[port] += self.num_wmasks + self.word_size
|
self.data_bus_size[port] += self.num_wmasks + self.word_size
|
||||||
|
|
@ -324,16 +325,6 @@ class sram_1bank(sram_base):
|
||||||
|
|
||||||
self.route_row_addr_dff()
|
self.route_row_addr_dff()
|
||||||
|
|
||||||
# if self.col_addr_dff:
|
|
||||||
# self.route_col_addr_dff()
|
|
||||||
|
|
||||||
# self.route_data_dff()
|
|
||||||
|
|
||||||
# if self.write_size:
|
|
||||||
# self.route_wmask_dff()
|
|
||||||
|
|
||||||
# if self.num_spare_cols:
|
|
||||||
# self.route_spare_wen_dff()
|
|
||||||
for port in self.all_ports:
|
for port in self.all_ports:
|
||||||
self.route_dff(port)
|
self.route_dff(port)
|
||||||
|
|
||||||
|
|
@ -488,137 +479,6 @@ class sram_1bank(sram_base):
|
||||||
offset=mid_pos)
|
offset=mid_pos)
|
||||||
self.add_path(bank_pin.layer, [mid_pos, bank_pos])
|
self.add_path(bank_pin.layer, [mid_pos, bank_pos])
|
||||||
|
|
||||||
def route_col_addr_dff(self):
|
|
||||||
""" Connect the output of the col flops to the bank pins """
|
|
||||||
for port in self.all_ports:
|
|
||||||
if port % 2:
|
|
||||||
offset = self.col_addr_dff_insts[port].ll() - vector(0, self.col_addr_bus_size)
|
|
||||||
else:
|
|
||||||
offset = self.col_addr_dff_insts[port].ul() + vector(0, self.col_addr_bus_gap)
|
|
||||||
|
|
||||||
bus_names = ["addr_{}".format(x) for x in range(self.col_addr_size)]
|
|
||||||
col_addr_bus_offsets = self.create_horizontal_bus(layer="m1",
|
|
||||||
offset=offset,
|
|
||||||
names=bus_names,
|
|
||||||
length=self.col_addr_dff_insts[port].width)
|
|
||||||
|
|
||||||
dff_names = ["dout_{}".format(x) for x in range(self.col_addr_size)]
|
|
||||||
data_dff_map = zip(dff_names, bus_names)
|
|
||||||
self.connect_horizontal_bus(data_dff_map,
|
|
||||||
self.col_addr_dff_insts[port],
|
|
||||||
col_addr_bus_offsets)
|
|
||||||
|
|
||||||
bank_names = ["addr{0}_{1}".format(port, x) for x in range(self.col_addr_size)]
|
|
||||||
data_bank_map = zip(bank_names, bus_names)
|
|
||||||
self.connect_horizontal_bus(data_bank_map,
|
|
||||||
self.bank_inst,
|
|
||||||
col_addr_bus_offsets)
|
|
||||||
|
|
||||||
def route_data_dff(self):
|
|
||||||
""" Connect the output of the data flops to the write driver """
|
|
||||||
# This is where the channel will start (y-dimension at least)
|
|
||||||
for port in self.write_ports:
|
|
||||||
if port % 2:
|
|
||||||
offset = self.data_dff_insts[port].ll() - vector(0, self.data_bus_size[port])
|
|
||||||
else:
|
|
||||||
offset = self.data_dff_insts[port].ul() + vector(0, self.data_bus_gap)
|
|
||||||
|
|
||||||
dff_names = ["dout_{}".format(x) for x in range(self.word_size + self.num_spare_cols)]
|
|
||||||
dff_pins = [self.data_dff_insts[port].get_pin(x) for x in dff_names]
|
|
||||||
if self.write_size or self.num_spare_cols:
|
|
||||||
for x in dff_names:
|
|
||||||
pin = self.data_dff_insts[port].get_pin(x)
|
|
||||||
pin_offset = pin.center()
|
|
||||||
self.add_via_center(layers=self.m1_stack,
|
|
||||||
offset=pin_offset,
|
|
||||||
directions=("V", "V"))
|
|
||||||
self.add_via_stack_center(from_layer="m2",
|
|
||||||
to_layer="m4",
|
|
||||||
offset=pin_offset)
|
|
||||||
|
|
||||||
bank_names = ["din{0}_{1}".format(port, x) for x in range(self.word_size + self.num_spare_cols)]
|
|
||||||
bank_pins = [self.bank_inst.get_pin(x) for x in bank_names]
|
|
||||||
if self.write_size or self.num_spare_cols:
|
|
||||||
for x in bank_names:
|
|
||||||
pin = self.bank_inst.get_pin(x)
|
|
||||||
if port % 2:
|
|
||||||
pin_offset = pin.uc()
|
|
||||||
else:
|
|
||||||
pin_offset = pin.bc()
|
|
||||||
self.add_via_stack_center(from_layer=pin.layer,
|
|
||||||
to_layer="m4",
|
|
||||||
offset=pin_offset)
|
|
||||||
|
|
||||||
route_map = list(zip(bank_pins, dff_pins))
|
|
||||||
if self.write_size or self.num_spare_cols:
|
|
||||||
layer_stack = self.m3_stack
|
|
||||||
else:
|
|
||||||
layer_stack = self.m1_stack
|
|
||||||
|
|
||||||
self.create_horizontal_channel_route(netlist=route_map,
|
|
||||||
offset=offset,
|
|
||||||
layer_stack=layer_stack)
|
|
||||||
|
|
||||||
def route_wmask_dff(self):
|
|
||||||
""" Connect the output of the wmask flops to the write mask AND array """
|
|
||||||
# This is where the channel will start (y-dimension at least)
|
|
||||||
for port in self.write_ports:
|
|
||||||
if port % 2:
|
|
||||||
offset = self.wmask_dff_insts[port].ll() - vector(0, self.wmask_bus_size)
|
|
||||||
else:
|
|
||||||
offset = self.wmask_dff_insts[port].ul() + vector(0, self.wmask_bus_gap)
|
|
||||||
|
|
||||||
dff_names = ["dout_{}".format(x) for x in range(self.num_wmasks)]
|
|
||||||
dff_pins = [self.wmask_dff_insts[port].get_pin(x) for x in dff_names]
|
|
||||||
for x in dff_names:
|
|
||||||
offset_pin = self.wmask_dff_insts[port].get_pin(x).center()
|
|
||||||
self.add_via_center(layers=self.m1_stack,
|
|
||||||
offset=offset_pin,
|
|
||||||
directions=("V", "V"))
|
|
||||||
|
|
||||||
bank_names = ["bank_wmask{0}_{1}".format(port, x) for x in range(self.num_wmasks)]
|
|
||||||
bank_pins = [self.bank_inst.get_pin(x) for x in bank_names]
|
|
||||||
for x in bank_names:
|
|
||||||
offset_pin = self.bank_inst.get_pin(x).center()
|
|
||||||
self.add_via_center(layers=self.m1_stack,
|
|
||||||
offset=offset_pin)
|
|
||||||
|
|
||||||
route_map = list(zip(bank_pins, dff_pins))
|
|
||||||
self.create_horizontal_channel_route(netlist=route_map,
|
|
||||||
offset=offset,
|
|
||||||
layer_stack=self.m1_stack)
|
|
||||||
|
|
||||||
def route_spare_wen_dff(self):
|
|
||||||
""" Connect the output of the spare write enable flops to the spare write drivers """
|
|
||||||
# This is where the channel will start (y-dimension at least)
|
|
||||||
for port in self.write_ports:
|
|
||||||
if port % 2:
|
|
||||||
# for port 0
|
|
||||||
offset = self.spare_wen_dff_insts[port].ll() - vector(0, self.spare_wen_bus_size)
|
|
||||||
else:
|
|
||||||
offset = self.spare_wen_dff_insts[port].ul() + vector(0, self.spare_wen_bus_gap)
|
|
||||||
|
|
||||||
dff_names = ["dout_{}".format(x) for x in range(self.num_spare_cols)]
|
|
||||||
dff_pins = [self.spare_wen_dff_insts[port].get_pin(x) for x in dff_names]
|
|
||||||
for x in dff_names:
|
|
||||||
offset_pin = self.spare_wen_dff_insts[port].get_pin(x).center()
|
|
||||||
self.add_via_center(layers=self.m1_stack,
|
|
||||||
offset=offset_pin,
|
|
||||||
directions=("V", "V"))
|
|
||||||
|
|
||||||
bank_names = ["bank_spare_wen{0}_{1}".format(port, x) for x in range(self.num_spare_cols)]
|
|
||||||
bank_pins = [self.bank_inst.get_pin(x) for x in bank_names]
|
|
||||||
for x in bank_names:
|
|
||||||
offset_pin = self.bank_inst.get_pin(x).center()
|
|
||||||
self.add_via_center(layers=self.m1_stack,
|
|
||||||
offset=offset_pin)
|
|
||||||
|
|
||||||
route_map = list(zip(bank_pins, dff_pins))
|
|
||||||
self.create_horizontal_channel_route(netlist=route_map,
|
|
||||||
offset=offset,
|
|
||||||
layer_stack=self.m1_stack)
|
|
||||||
|
|
||||||
|
|
||||||
def add_lvs_correspondence_points(self):
|
def add_lvs_correspondence_points(self):
|
||||||
"""
|
"""
|
||||||
This adds some points for easier debugging if LVS goes wrong.
|
This adds some points for easier debugging if LVS goes wrong.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue