Use and2_dec instead of buf_dec for better wldriver layout

This commit is contained in:
mrg 2020-12-01 11:19:12 -08:00
parent b621c3bdc0
commit 3829213afe
2 changed files with 20 additions and 6 deletions

View File

@ -8,7 +8,7 @@ import debug
import design import design
from sram_factory import factory from sram_factory import factory
from vector import vector from vector import vector
from tech import layer from tech import layer, drc
from globals import OPTS from globals import OPTS
from tech import layer_properties as layer_props from tech import layer_properties as layer_props
@ -86,6 +86,13 @@ class port_address(design.design):
else: else:
self.add_power_pin("vdd", rbl_vdd_pin.lc()) self.add_power_pin("vdd", rbl_vdd_pin.lc())
# Also connect the B input of the RBL and_dec to vdd
if OPTS.local_array_size == 0:
rbl_b_pin = self.rbl_driver_inst.get_pin("B")
rbl_loc = rbl_b_pin.center() - vector(3 * self.m1_pitch, 0)
self.add_path(rbl_b_pin.layer, [rbl_b_pin.center(), rbl_loc])
self.add_power_pin("vdd", rbl_loc)
def route_pins(self): def route_pins(self):
for row in range(self.addr_size): for row in range(self.addr_size):
decoder_name = "addr_{}".format(row) decoder_name = "addr_{}".format(row)
@ -157,11 +164,13 @@ class port_address(design.design):
b = factory.create(module_type=OPTS.bitcell) b = factory.create(module_type=OPTS.bitcell)
if local_array_size > 0: if local_array_size > 0:
# The local wordline driver will change the polarity
self.rbl_driver = factory.create(module_type="inv_dec", self.rbl_driver = factory.create(module_type="inv_dec",
size=driver_size, size=driver_size,
height=b.height) height=b.height)
else: else:
self.rbl_driver = factory.create(module_type="buf_dec", # There is no local wordline driver
self.rbl_driver = factory.create(module_type="and2_dec",
size=driver_size, size=driver_size,
height=b.height) height=b.height)
@ -189,6 +198,8 @@ class port_address(design.design):
temp = [] temp = []
temp.append("wl_en") temp.append("wl_en")
if OPTS.local_array_size == 0:
temp.append("vdd")
temp.append("rbl_wl") temp.append("rbl_wl")
temp.append("vdd") temp.append("vdd")
temp.append("gnd") temp.append("gnd")
@ -221,7 +232,10 @@ class port_address(design.design):
wordline_driver_array_offset = vector(self.row_decoder_inst.rx(), 0) wordline_driver_array_offset = vector(self.row_decoder_inst.rx(), 0)
self.wordline_driver_array_inst.place(wordline_driver_array_offset) self.wordline_driver_array_inst.place(wordline_driver_array_offset)
x_offset = self.wordline_driver_array_inst.rx() - self.rbl_driver.width - self.m1_pitch # The wordline driver also had an extra gap on the right, so use this offset
well_gap = 2 * drc("pwell_to_nwell") + drc("nwell_enclose_active")
x_offset = self.wordline_driver_array_inst.rx() - well_gap - self.rbl_driver.width
if self.port == 0: if self.port == 0:
rbl_driver_offset = vector(x_offset, rbl_driver_offset = vector(x_offset,
0) 0)

View File

@ -121,18 +121,18 @@ class replica_bitcell_array(bitcell_base_array):
# the array. # the array.
# These go from the top (where the bitcell array starts ) down # These go from the top (where the bitcell array starts ) down
replica_bit = self.rbl[0] - port replica_bit = self.rbl[0] - port
column_offset = self.rbl[0]
elif port in self.right_rbl: elif port in self.right_rbl:
# We will always have self.rbl[0] rows of replica wordlines below # We will always have self.rbl[0] rows of replica wordlines below
# the array. # the array.
# These go from the bottom up # These go from the bottom up
replica_bit = self.rbl[0] + self.row_size + port replica_bit = self.rbl[0] + self.row_size + port
column_offset = self.rbl[0] + self.column_size + 1
else: else:
continue continue
# If we have an odd numer on the bottom
column_offset = self.rbl[0] + 1
self.replica_columns[port] = factory.create(module_type="replica_column", self.replica_columns[port] = factory.create(module_type="replica_column",
rows=self.row_size, rows=self.row_size,
rbl=self.rbl, rbl=self.rbl,