mirror of https://github.com/VLSIDA/OpenRAM.git
Remove inverter in wordline driver
This commit is contained in:
parent
9e0b31d685
commit
21759d59b4
|
|
@ -44,7 +44,7 @@ class wordline_driver(design.design):
|
||||||
# Outputs from wordline_driver.
|
# Outputs from wordline_driver.
|
||||||
for i in range(self.rows):
|
for i in range(self.rows):
|
||||||
self.add_pin("wl_{0}".format(i))
|
self.add_pin("wl_{0}".format(i))
|
||||||
self.add_pin("en")
|
self.add_pin("en_bar")
|
||||||
self.add_pin("vdd")
|
self.add_pin("vdd")
|
||||||
self.add_pin("gnd")
|
self.add_pin("gnd")
|
||||||
|
|
||||||
|
|
@ -67,7 +67,7 @@ class wordline_driver(design.design):
|
||||||
""" Add a pin for each row of vdd/gnd which are must-connects next level up. """
|
""" Add a pin for each row of vdd/gnd which are must-connects next level up. """
|
||||||
|
|
||||||
# Find the x offsets for where the vias/pins should be placed
|
# Find the x offsets for where the vias/pins should be placed
|
||||||
a_xoffset = self.inv1_inst[0].rx()
|
a_xoffset = self.nand_inst[0].rx()
|
||||||
b_xoffset = self.inv2_inst[0].lx()
|
b_xoffset = self.inv2_inst[0].lx()
|
||||||
for num in range(self.rows):
|
for num in range(self.rows):
|
||||||
# this will result in duplicate polygons for rails, but who cares
|
# this will result in duplicate polygons for rails, but who cares
|
||||||
|
|
@ -95,24 +95,16 @@ class wordline_driver(design.design):
|
||||||
|
|
||||||
|
|
||||||
def create_drivers(self):
|
def create_drivers(self):
|
||||||
self.inv1_inst = []
|
|
||||||
self.nand_inst = []
|
self.nand_inst = []
|
||||||
self.inv2_inst = []
|
self.inv2_inst = []
|
||||||
for row in range(self.rows):
|
for row in range(self.rows):
|
||||||
name_inv1 = "wl_driver_inv_en{}".format(row)
|
|
||||||
name_nand = "wl_driver_nand{}".format(row)
|
name_nand = "wl_driver_nand{}".format(row)
|
||||||
name_inv2 = "wl_driver_inv{}".format(row)
|
name_inv2 = "wl_driver_inv{}".format(row)
|
||||||
|
|
||||||
# add inv1 based on the info above
|
|
||||||
self.inv1_inst.append(self.add_inst(name=name_inv1,
|
|
||||||
mod=self.inv_no_output))
|
|
||||||
self.connect_inst(["en",
|
|
||||||
"en_bar_{0}".format(row),
|
|
||||||
"vdd", "gnd"])
|
|
||||||
# add nand 2
|
# add nand 2
|
||||||
self.nand_inst.append(self.add_inst(name=name_nand,
|
self.nand_inst.append(self.add_inst(name=name_nand,
|
||||||
mod=self.nand2))
|
mod=self.nand2))
|
||||||
self.connect_inst(["en_bar_{0}".format(row),
|
self.connect_inst(["en_bar",
|
||||||
"in_{0}".format(row),
|
"in_{0}".format(row),
|
||||||
"wl_bar_{0}".format(row),
|
"wl_bar_{0}".format(row),
|
||||||
"vdd", "gnd"])
|
"vdd", "gnd"])
|
||||||
|
|
@ -125,8 +117,7 @@ class wordline_driver(design.design):
|
||||||
|
|
||||||
|
|
||||||
def place_drivers(self):
|
def place_drivers(self):
|
||||||
inv1_xoffset = 2*self.m1_width + 5*self.m1_space
|
nand2_xoffset = 2*self.m1_width + 5*self.m1_space
|
||||||
nand2_xoffset = inv1_xoffset + self.inv.width
|
|
||||||
inv2_xoffset = nand2_xoffset + self.nand2.width
|
inv2_xoffset = nand2_xoffset + self.nand2.width
|
||||||
|
|
||||||
self.width = inv2_xoffset + self.inv.width
|
self.width = inv2_xoffset + self.inv.width
|
||||||
|
|
@ -140,13 +131,9 @@ class wordline_driver(design.design):
|
||||||
y_offset = self.inv.height*row
|
y_offset = self.inv.height*row
|
||||||
inst_mirror = "R0"
|
inst_mirror = "R0"
|
||||||
|
|
||||||
inv1_offset = [inv1_xoffset, y_offset]
|
|
||||||
nand2_offset=[nand2_xoffset, y_offset]
|
nand2_offset=[nand2_xoffset, y_offset]
|
||||||
inv2_offset=[inv2_xoffset, y_offset]
|
inv2_offset=[inv2_xoffset, y_offset]
|
||||||
|
|
||||||
# add inv1 based on the info above
|
|
||||||
self.inv1_inst[row].place(offset=inv1_offset,
|
|
||||||
mirror=inst_mirror)
|
|
||||||
# add nand 2
|
# add nand 2
|
||||||
self.nand_inst[row].place(offset=nand2_offset,
|
self.nand_inst[row].place(offset=nand2_offset,
|
||||||
mirror=inst_mirror)
|
mirror=inst_mirror)
|
||||||
|
|
@ -159,7 +146,7 @@ class wordline_driver(design.design):
|
||||||
""" Route all of the signals """
|
""" Route all of the signals """
|
||||||
|
|
||||||
# Wordline enable connection
|
# Wordline enable connection
|
||||||
en_pin=self.add_layout_pin(text="en",
|
en_pin=self.add_layout_pin(text="en_bar",
|
||||||
layer="metal2",
|
layer="metal2",
|
||||||
offset=[self.m1_width + 2*self.m1_space,0],
|
offset=[self.m1_width + 2*self.m1_space,0],
|
||||||
width=self.m2_width,
|
width=self.m2_width,
|
||||||
|
|
@ -167,12 +154,11 @@ class wordline_driver(design.design):
|
||||||
|
|
||||||
|
|
||||||
for row in range(self.rows):
|
for row in range(self.rows):
|
||||||
inv1_inst = self.inv1_inst[row]
|
|
||||||
nand_inst = self.nand_inst[row]
|
nand_inst = self.nand_inst[row]
|
||||||
inv2_inst = self.inv2_inst[row]
|
inv2_inst = self.inv2_inst[row]
|
||||||
|
|
||||||
# en connection
|
# en_bar connection
|
||||||
a_pin = inv1_inst.get_pin("A")
|
a_pin = nand_inst.get_pin("A")
|
||||||
a_pos = a_pin.lc()
|
a_pos = a_pin.lc()
|
||||||
clk_offset = vector(en_pin.bc().x,a_pos.y)
|
clk_offset = vector(en_pin.bc().x,a_pos.y)
|
||||||
self.add_segment_center(layer="metal1",
|
self.add_segment_center(layer="metal1",
|
||||||
|
|
@ -181,13 +167,6 @@ class wordline_driver(design.design):
|
||||||
self.add_via_center(layers=("metal1", "via1", "metal2"),
|
self.add_via_center(layers=("metal1", "via1", "metal2"),
|
||||||
offset=clk_offset)
|
offset=clk_offset)
|
||||||
|
|
||||||
# first inv to nand2 A
|
|
||||||
zb_pos = inv1_inst.get_pin("Z").bc()
|
|
||||||
zu_pos = inv1_inst.get_pin("Z").uc()
|
|
||||||
bl_pos = nand_inst.get_pin("A").lc()
|
|
||||||
br_pos = nand_inst.get_pin("A").rc()
|
|
||||||
self.add_path("metal1", [zb_pos, zu_pos, bl_pos, br_pos])
|
|
||||||
|
|
||||||
# Nand2 out to 2nd inv
|
# Nand2 out to 2nd inv
|
||||||
zr_pos = nand_inst.get_pin("Z").rc()
|
zr_pos = nand_inst.get_pin("Z").rc()
|
||||||
al_pos = inv2_inst.get_pin("A").lc()
|
al_pos = inv2_inst.get_pin("A").lc()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue