mirror of https://github.com/VLSIDA/OpenRAM.git
Use and2_dec instead of buf_dec for better wldriver layout
This commit is contained in:
parent
b621c3bdc0
commit
3829213afe
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue