mirror of https://github.com/VLSIDA/OpenRAM.git
Add supply rails to dff array. PEP8 cleanup.
This commit is contained in:
parent
5f76514cf0
commit
cd66ddb37c
|
|
@ -35,7 +35,7 @@ class dff_buf(design.design):
|
||||||
# This causes a DRC in the pinv which assumes min width rails. This ensures the output
|
# This causes a DRC in the pinv which assumes min width rails. This ensures the output
|
||||||
# contact does not violate spacing to the rail in the NMOS.
|
# contact does not violate spacing to the rail in the NMOS.
|
||||||
debug.check(inv1_size>=2, "Inverter must be greater than two for rail spacing DRC rules.")
|
debug.check(inv1_size>=2, "Inverter must be greater than two for rail spacing DRC rules.")
|
||||||
debug.check(inv2_size>=2, "Inverter must be greater than two for rail spacing DRC rules.")
|
debug.check(inv2_size>=2, "Inverter must be greater than two for rail spacing DRC rules.")
|
||||||
|
|
||||||
self.inv1_size=inv1_size
|
self.inv1_size=inv1_size
|
||||||
self.inv2_size=inv2_size
|
self.inv2_size=inv2_size
|
||||||
|
|
@ -52,14 +52,13 @@ class dff_buf(design.design):
|
||||||
def create_layout(self):
|
def create_layout(self):
|
||||||
self.place_instances()
|
self.place_instances()
|
||||||
self.width = self.inv2_inst.rx()
|
self.width = self.inv2_inst.rx()
|
||||||
|
|
||||||
self.height = self.dff.height
|
self.height = self.dff.height
|
||||||
|
|
||||||
|
|
||||||
self.route_wires()
|
self.route_wires()
|
||||||
self.add_layout_pins()
|
self.add_layout_pins()
|
||||||
self.add_boundary()
|
self.add_boundary()
|
||||||
self.DRC_LVS()
|
self.DRC_LVS()
|
||||||
|
|
||||||
def add_modules(self):
|
def add_modules(self):
|
||||||
self.dff = factory.create(module_type="dff")
|
self.dff = factory.create(module_type="dff")
|
||||||
self.add_mod(self.dff)
|
self.add_mod(self.dff)
|
||||||
|
|
@ -73,8 +72,6 @@ class dff_buf(design.design):
|
||||||
size=self.inv2_size,
|
size=self.inv2_size,
|
||||||
height=self.dff.height)
|
height=self.dff.height)
|
||||||
self.add_mod(self.inv2)
|
self.add_mod(self.inv2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def add_pins(self):
|
def add_pins(self):
|
||||||
self.add_pin("D", "INPUT")
|
self.add_pin("D", "INPUT")
|
||||||
|
|
@ -96,17 +93,19 @@ class dff_buf(design.design):
|
||||||
|
|
||||||
self.inv1_inst=self.add_inst(name="dff_buf_inv1",
|
self.inv1_inst=self.add_inst(name="dff_buf_inv1",
|
||||||
mod=self.inv1)
|
mod=self.inv1)
|
||||||
self.connect_inst(["qint", "Qb", "vdd", "gnd"])
|
self.connect_inst(["qint", "Qb", "vdd", "gnd"])
|
||||||
|
|
||||||
self.inv2_inst=self.add_inst(name="dff_buf_inv2",
|
self.inv2_inst=self.add_inst(name="dff_buf_inv2",
|
||||||
mod=self.inv2)
|
mod=self.inv2)
|
||||||
self.connect_inst(["Qb", "Q", "vdd", "gnd"])
|
self.connect_inst(["Qb", "Q", "vdd", "gnd"])
|
||||||
|
|
||||||
def place_instances(self):
|
def place_instances(self):
|
||||||
# Add the DFF
|
# Add the DFF
|
||||||
self.dff_inst.place(vector(0,0))
|
self.dff_inst.place(vector(0, 0))
|
||||||
|
|
||||||
# Add INV1 to the right
|
# Add INV1 to the right
|
||||||
|
# The INV needs well spacing because the DFF is likely from a library
|
||||||
|
# with different well construction rules
|
||||||
well_spacing = 0
|
well_spacing = 0
|
||||||
try:
|
try:
|
||||||
well_spacing = max(well_spacing, self.nwell_space)
|
well_spacing = max(well_spacing, self.nwell_space)
|
||||||
|
|
@ -129,7 +128,7 @@ class dff_buf(design.design):
|
||||||
# Route dff q to inv1 a
|
# Route dff q to inv1 a
|
||||||
q_pin = self.dff_inst.get_pin("Q")
|
q_pin = self.dff_inst.get_pin("Q")
|
||||||
a1_pin = self.inv1_inst.get_pin("A")
|
a1_pin = self.inv1_inst.get_pin("A")
|
||||||
mid_x_offset = 0.5*(a1_pin.cx() + q_pin.cx())
|
mid_x_offset = 0.5 * (a1_pin.cx() + q_pin.cx())
|
||||||
mid1 = vector(mid_x_offset, q_pin.cy())
|
mid1 = vector(mid_x_offset, q_pin.cy())
|
||||||
mid2 = vector(mid_x_offset, a1_pin.cy())
|
mid2 = vector(mid_x_offset, a1_pin.cy())
|
||||||
self.add_path("m3", [q_pin.center(), mid1, mid2, a1_pin.center()])
|
self.add_path("m3", [q_pin.center(), mid1, mid2, a1_pin.center()])
|
||||||
|
|
@ -143,7 +142,7 @@ class dff_buf(design.design):
|
||||||
# Route inv1 z to inv2 a
|
# Route inv1 z to inv2 a
|
||||||
z1_pin = self.inv1_inst.get_pin("Z")
|
z1_pin = self.inv1_inst.get_pin("Z")
|
||||||
a2_pin = self.inv2_inst.get_pin("A")
|
a2_pin = self.inv2_inst.get_pin("A")
|
||||||
mid_x_offset = 0.5*(z1_pin.cx() + a2_pin.cx())
|
mid_x_offset = 0.5 * (z1_pin.cx() + a2_pin.cx())
|
||||||
self.mid_qb_pos = vector(mid_x_offset, z1_pin.cy())
|
self.mid_qb_pos = vector(mid_x_offset, z1_pin.cy())
|
||||||
mid2 = vector(mid_x_offset, a2_pin.cy())
|
mid2 = vector(mid_x_offset, a2_pin.cy())
|
||||||
self.add_path("m1", [z1_pin.center(), self.mid_qb_pos, mid2, a2_pin.center()])
|
self.add_path("m1", [z1_pin.center(), self.mid_qb_pos, mid2, a2_pin.center()])
|
||||||
|
|
@ -181,8 +180,8 @@ class dff_buf(design.design):
|
||||||
height=din_pin.height())
|
height=din_pin.height())
|
||||||
|
|
||||||
dout_pin = self.inv2_inst.get_pin("Z")
|
dout_pin = self.inv2_inst.get_pin("Z")
|
||||||
mid_pos = dout_pin.center() + vector(self.m1_pitch,0)
|
mid_pos = dout_pin.center() + vector(self.m1_pitch, 0)
|
||||||
q_pos = mid_pos - vector(0,self.m2_pitch)
|
q_pos = mid_pos - vector(0, self.m2_pitch)
|
||||||
self.add_layout_pin_rect_center(text="Q",
|
self.add_layout_pin_rect_center(text="Q",
|
||||||
layer="m2",
|
layer="m2",
|
||||||
offset=q_pos)
|
offset=q_pos)
|
||||||
|
|
@ -190,7 +189,7 @@ class dff_buf(design.design):
|
||||||
self.add_via_center(layers=self.m1_stack,
|
self.add_via_center(layers=self.m1_stack,
|
||||||
offset=q_pos)
|
offset=q_pos)
|
||||||
|
|
||||||
qb_pos = self.mid_qb_pos + vector(0,self.m2_pitch)
|
qb_pos = self.mid_qb_pos + vector(0, self.m2_pitch)
|
||||||
self.add_layout_pin_rect_center(text="Qb",
|
self.add_layout_pin_rect_center(text="Qb",
|
||||||
layer="m2",
|
layer="m2",
|
||||||
offset=qb_pos)
|
offset=qb_pos)
|
||||||
|
|
@ -200,7 +199,7 @@ class dff_buf(design.design):
|
||||||
|
|
||||||
def get_clk_cin(self):
|
def get_clk_cin(self):
|
||||||
"""Return the total capacitance (in relative units) that the clock is loaded by in the dff"""
|
"""Return the total capacitance (in relative units) that the clock is loaded by in the dff"""
|
||||||
#This is a handmade cell so the value must be entered in the tech.py file or estimated.
|
# This is a handmade cell so the value must be entered in the tech.py file or estimated.
|
||||||
#Calculated in the tech file by summing the widths of all the gates and dividing by the minimum width.
|
# Calculated in the tech file by summing the widths of all the gates and dividing by the minimum width.
|
||||||
#FIXME: Dff changed in a past commit. The parameter need to be updated.
|
# FIXME: Dff changed in a past commit. The parameter need to be updated.
|
||||||
return parameter["dff_clk_cin"]
|
return parameter["dff_clk_cin"]
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ class dff_buf_array(design.design):
|
||||||
self.width = self.columns * self.dff.width
|
self.width = self.columns * self.dff.width
|
||||||
self.height = self.rows * self.dff.height
|
self.height = self.rows * self.dff.height
|
||||||
self.place_dff_array()
|
self.place_dff_array()
|
||||||
|
self.route_supplies()
|
||||||
self.add_layout_pins()
|
self.add_layout_pins()
|
||||||
self.add_boundary()
|
self.add_boundary()
|
||||||
self.DRC_LVS()
|
self.DRC_LVS()
|
||||||
|
|
@ -94,15 +95,25 @@ class dff_buf_array(design.design):
|
||||||
|
|
||||||
def place_dff_array(self):
|
def place_dff_array(self):
|
||||||
|
|
||||||
well_spacing = max(self.nwell_space,
|
well_spacing = 0
|
||||||
self.pwell_space,
|
try:
|
||||||
self.pwell_to_nwell)
|
well_spacing = max(self.nwell_space, well_spacing)
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
well_spacing = max(self.pwell_space, well_spacing)
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
well_spacing = max(self.pwell_to_nwell, well_spacing)
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
|
||||||
dff_pitch = self.dff.width + well_spacing + self.well_extend_active
|
dff_pitch = self.dff.width + well_spacing + self.well_extend_active
|
||||||
|
|
||||||
for row in range(self.rows):
|
for row in range(self.rows):
|
||||||
for col in range(self.columns):
|
for col in range(self.columns):
|
||||||
name = "Xdff_r{0}_c{1}".format(row, col)
|
# name = "Xdff_r{0}_c{1}".format(row, col)
|
||||||
if (row % 2 == 0):
|
if (row % 2 == 0):
|
||||||
base = vector(col * dff_pitch, row * self.dff.height)
|
base = vector(col * dff_pitch, row * self.dff.height)
|
||||||
mirror = "R0"
|
mirror = "R0"
|
||||||
|
|
@ -141,8 +152,17 @@ class dff_buf_array(design.design):
|
||||||
dout_bar_name = "dout_bar_{0}_{1}".format(row, col)
|
dout_bar_name = "dout_bar_{0}_{1}".format(row, col)
|
||||||
|
|
||||||
return dout_bar_name
|
return dout_bar_name
|
||||||
|
|
||||||
def add_layout_pins(self):
|
def route_supplies(self):
|
||||||
|
for row in range(self.rows):
|
||||||
|
vdd0_pin=self.dff_insts[row, 0].get_pin("vdd")
|
||||||
|
vddn_pin=self.dff_insts[row, self.columns - 1].get_pin("vdd")
|
||||||
|
self.add_path(vdd0_pin.layer, [vdd0_pin.lc(), vddn_pin.rc()], width=vdd0_pin.height())
|
||||||
|
|
||||||
|
gnd0_pin=self.dff_insts[row, 0].get_pin("gnd")
|
||||||
|
gndn_pin=self.dff_insts[row, self.columns - 1].get_pin("gnd")
|
||||||
|
self.add_path(gnd0_pin.layer, [gnd0_pin.lc(), gndn_pin.rc()], width=gnd0_pin.height())
|
||||||
|
|
||||||
for row in range(self.rows):
|
for row in range(self.rows):
|
||||||
for col in range(self.columns):
|
for col in range(self.columns):
|
||||||
# Continous vdd rail along with label.
|
# Continous vdd rail along with label.
|
||||||
|
|
@ -152,6 +172,8 @@ class dff_buf_array(design.design):
|
||||||
# Continous gnd rail along with label.
|
# Continous gnd rail along with label.
|
||||||
gnd_pin=self.dff_insts[row, col].get_pin("gnd")
|
gnd_pin=self.dff_insts[row, col].get_pin("gnd")
|
||||||
self.add_power_pin("gnd", gnd_pin.lc())
|
self.add_power_pin("gnd", gnd_pin.lc())
|
||||||
|
|
||||||
|
def add_layout_pins(self):
|
||||||
|
|
||||||
for row in range(self.rows):
|
for row in range(self.rows):
|
||||||
for col in range(self.columns):
|
for col in range(self.columns):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue