mirror of https://github.com/VLSIDA/OpenRAM.git
Removed L shaped routing from gnd contact to wordlines in replica bitline. Corrected slight DRC errors. Optimizations to pbitcell.
This commit is contained in:
parent
5d6944953b
commit
a06a0975db
|
|
@ -76,7 +76,6 @@ class replica_bitline(design.design):
|
||||||
self.access_tx_offset = vector(-gap_width-self.access_tx.width-self.inv.width, 0.5*self.inv.height)
|
self.access_tx_offset = vector(-gap_width-self.access_tx.width-self.inv.width, 0.5*self.inv.height)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def add_modules(self):
|
def add_modules(self):
|
||||||
""" Add the modules for later usage """
|
""" Add the modules for later usage """
|
||||||
|
|
||||||
|
|
@ -185,18 +184,13 @@ class replica_bitline(design.design):
|
||||||
|
|
||||||
# Route the connection to the right so that it doesn't interfere with the cells
|
# Route the connection to the right so that it doesn't interfere with the cells
|
||||||
# Wordlines may be close to each other when tiled, so gnd connections are routed in opposite directions
|
# Wordlines may be close to each other when tiled, so gnd connections are routed in opposite directions
|
||||||
if row % 2 == 0:
|
|
||||||
vertical_extension = vector(0, 1.5*drc["minwidth_metal1"] + 0.5*contact.m1m2.height)
|
|
||||||
else:
|
|
||||||
vertical_extension = vector(0, -1.5*drc["minwidth_metal1"] - 1.5*contact.m1m2.height)
|
|
||||||
|
|
||||||
pin_right = pin.rc()
|
pin_right = pin.rc()
|
||||||
pin_extension1 = pin_right + vector(self.m3_pitch,0)
|
pin_extension = pin_right + vector(self.m3_pitch,0)
|
||||||
pin_extension2 = pin_extension1 + vertical_extension
|
|
||||||
if pin.layer != "metal1":
|
if pin.layer != "metal1":
|
||||||
continue
|
continue
|
||||||
self.add_path("metal1", [pin_right, pin_extension1, pin_extension2])
|
self.add_path("metal1", [pin_right, pin_extension])
|
||||||
self.add_power_pin("gnd", pin_extension2)
|
self.add_power_pin("gnd", pin_extension)
|
||||||
|
|
||||||
# for multiport, need to short wordlines to each other so they all connect to gnd
|
# for multiport, need to short wordlines to each other so they all connect to gnd
|
||||||
wl_last = self.wl_list[self.total_ports-1]+"_{}".format(row)
|
wl_last = self.wl_list[self.total_ports-1]+"_{}".format(row)
|
||||||
|
|
@ -280,7 +274,7 @@ class replica_bitline(design.design):
|
||||||
# DRAIN ROUTE
|
# DRAIN ROUTE
|
||||||
# Route the drain to the vdd rail
|
# Route the drain to the vdd rail
|
||||||
drain_offset = self.tx_inst.get_pin("D").center()
|
drain_offset = self.tx_inst.get_pin("D").center()
|
||||||
self.add_power_pin("vdd", drain_offset)
|
self.add_power_pin("vdd", drain_offset, rotate=0)
|
||||||
|
|
||||||
# SOURCE ROUTE
|
# SOURCE ROUTE
|
||||||
# Route the drain to the RBL inverter input
|
# Route the drain to the RBL inverter input
|
||||||
|
|
|
||||||
|
|
@ -222,9 +222,9 @@ class pbitcell(design.design):
|
||||||
self.rowline_spacing = self.m1_space + contact.m1m2.width
|
self.rowline_spacing = self.m1_space + contact.m1m2.width
|
||||||
|
|
||||||
# spacing for vdd
|
# spacing for vdd
|
||||||
vdd_offset_well_constraint = self.well_enclose_active + 0.5*contact.well.width
|
implant_constraint = max(inverter_pmos_contact_extension, 0) + 2*self.implant_enclose_active + 0.5*(contact.well.width - self.m1_width)
|
||||||
vdd_offset_metal1_constraint = max(inverter_pmos_contact_extension, 0) + self.m1_space + 0.5*contact.well.width
|
metal1_constraint = max(inverter_pmos_contact_extension, 0) + self.m1_space
|
||||||
self.vdd_offset = max(vdd_offset_well_constraint, vdd_offset_metal1_constraint)
|
self.vdd_offset = max(implant_constraint, metal1_constraint) + 0.5*self.m1_width
|
||||||
|
|
||||||
# read port dimensions
|
# read port dimensions
|
||||||
width_reduction = self.read_nmos.active_width - self.read_nmos.get_pin("D").cx()
|
width_reduction = self.read_nmos.active_width - self.read_nmos.get_pin("D").cx()
|
||||||
|
|
@ -334,7 +334,7 @@ class pbitcell(design.design):
|
||||||
layer="metal1",
|
layer="metal1",
|
||||||
offset=self.gnd_position,
|
offset=self.gnd_position,
|
||||||
width=self.width,
|
width=self.width,
|
||||||
height=contact.well.second_layer_width)
|
height=self.m1_width)
|
||||||
|
|
||||||
vdd_ypos = self.inverter_nmos_ypos + self.inverter_nmos.active_height + self.inverter_gap + self.inverter_pmos.active_height + self.vdd_offset
|
vdd_ypos = self.inverter_nmos_ypos + self.inverter_nmos.active_height + self.inverter_gap + self.inverter_pmos.active_height + self.vdd_offset
|
||||||
self.vdd_position = vector(0, vdd_ypos)
|
self.vdd_position = vector(0, vdd_ypos)
|
||||||
|
|
@ -342,7 +342,7 @@ class pbitcell(design.design):
|
||||||
layer="metal1",
|
layer="metal1",
|
||||||
offset=self.vdd_position,
|
offset=self.vdd_position,
|
||||||
width=self.width,
|
width=self.width,
|
||||||
height=contact.well.second_layer_width)
|
height=self.m1_width)
|
||||||
|
|
||||||
def create_readwrite_ports(self):
|
def create_readwrite_ports(self):
|
||||||
"""
|
"""
|
||||||
|
|
@ -933,8 +933,9 @@ class pbitcell(design.design):
|
||||||
|
|
||||||
def route_rbc_short(self):
|
def route_rbc_short(self):
|
||||||
""" route the short from Q_bar to gnd necessary for the replica bitcell """
|
""" route the short from Q_bar to gnd necessary for the replica bitcell """
|
||||||
Q_bar_pos = self.inverter_pmos_right.get_pin("S").uc()
|
Q_bar_pos = self.inverter_pmos_right.get_pin("S").center()
|
||||||
vdd_pos = vector(Q_bar_pos.x, self.vdd_position.y)
|
vdd_pos = self.inverter_pmos_right.get_pin("D").center()
|
||||||
|
#vdd_pos = vector(Q_bar_pos.x, self.vdd_position.y)
|
||||||
|
|
||||||
self.add_path("metal1", [Q_bar_pos, vdd_pos])
|
self.add_path("metal1", [Q_bar_pos, vdd_pos])
|
||||||
|
|
||||||
Loading…
Reference in New Issue