Fix bug in multifinger ptx. Replace LEF file with new snapped layout.

This commit is contained in:
mguthaus 2017-10-06 16:23:23 -07:00
parent 10a8531813
commit 5c10aebc0f
6 changed files with 3951 additions and 1716 deletions

View File

@ -36,7 +36,6 @@ class nand_2(design.design):
self.add_pins()
self.create_layout()
print self.pin_map
self.DRC_LVS()
def add_pins(self):

View File

@ -238,17 +238,17 @@ class ptx(design.design):
# following poly(s)
for i in range(0, self.mults):
if self.connect_poly:
self.add_layout_pin(text="G",
layer="poly",
offset=[poly_xoffset, poly_yoffset],
width=self.poly_width,
height=self.poly_height)
else:
# Add the rectangle in case we remove the pin when joining fingers
self.add_rect(layer="poly",
offset=[poly_xoffset, poly_yoffset],
width=self.poly_width,
height=self.poly_height)
else:
self.add_layout_pin(text="G",
layer="poly",
offset=[poly_xoffset, poly_yoffset],
width=self.poly_width,
height=self.poly_height)
self.poly_positions.append(vector(poly_xoffset, poly_yoffset))
poly_xoffset += self.mults_poly_to_poly + drc["minwidth_poly"]
@ -325,17 +325,17 @@ class ptx(design.design):
size=(1, self.num_contacts))
# source are even
if self.connect_active:
self.add_layout_pin(text="S",
layer="metal1",
offset=offset+contact.second_layer_position,
width=contact.second_layer_width,
height=contact.second_layer_height)
else:
# Add this in case the pins get removed when fingers joined
self.add_rect(layer="metal1",
offset=offset+contact.second_layer_position,
width=contact.second_layer_width,
height=contact.second_layer_height)
else:
self.add_layout_pin(text="S",
layer="metal1",
offset=offset+contact.second_layer_position,
width=contact.second_layer_width,
height=contact.second_layer_height)
self.active_contact_positions.append(offset)
# middle contact columns
@ -350,18 +350,18 @@ class ptx(design.design):
size=(1, self.num_contacts))
# source are even, drain are odd
if self.connect_active:
# Add this in case the pins get removed when fingers joined
self.add_rect(layer="metal1",
offset=offset+contact.second_layer_position,
width=contact.second_layer_width,
height=contact.second_layer_height)
else:
name = "S" if i%2==1 else "D"
self.add_layout_pin(text=name,
layer="metal1",
offset=offset+contact.second_layer_position,
width=contact.second_layer_width,
height=contact.second_layer_height)
else:
# Add this in case the pins get removed when fingers joined
self.add_rect(layer="metal1",
offset=offset+contact.second_layer_position,
width=contact.second_layer_width,
height=contact.second_layer_height)
self.active_contact_positions.append(offset)
@ -375,17 +375,17 @@ class ptx(design.design):
size=(1, self.num_contacts))
# source are even, drain are odd
if self.connect_active:
self.add_rect(layer="metal1",
offset=offset+contact.second_layer_position,
width=contact.second_layer_width,
height=contact.second_layer_height)
else:
name = "D" if self.mults%2==1 else "S"
self.add_layout_pin(text=name,
layer="metal1",
offset=offset+contact.second_layer_position,
width=contact.second_layer_width,
height=contact.second_layer_height)
else:
self.add_rect(layer="metal1",
offset=offset+contact.second_layer_position,
width=contact.second_layer_width,
height=contact.second_layer_height)
# Add this in case the pins get removed when fingers joined
self.active_contact_positions.append(offset)

View File

@ -25,9 +25,9 @@ class pinv_test(unittest.TestCase):
import pinv
import tech
debug.info(2, "Checking min size inverter")
tx = pinv.pinv(nmos_width=tech.drc["minwidth_tx"], beta=tech.parameter["pinv_beta"])
self.local_check(tx)
# debug.info(2, "Checking min size inverter")
# tx = pinv.pinv(nmos_width=tech.drc["minwidth_tx"], beta=tech.parameter["pinv_beta"])
# self.local_check(tx)
debug.info(2, "Checking 2x min size inverter")
tx = pinv.pinv(nmos_width=2 * tech.drc["minwidth_tx"], beta=tech.parameter["pinv_beta"])

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -144,8 +144,8 @@ class wordline_driver(design.design):
self.add_center_rect(layer="metal1",
start=clk_offset,
end=a_pos)
self.add_center_via(layers=("metal1", "via1", "metal2"),
offset=clk_offset)
m1m2_via = self.add_center_via(layers=("metal1", "via1", "metal2"),
offset=clk_offset)
# first inv to nand2 B
zl_pos = inv1_inst.get_pin("Z").lc()
@ -165,14 +165,14 @@ class wordline_driver(design.design):
a_pin = nand_inst.get_pin("A")
a_pos = a_pin.lc()
input_offset = vector(0,a_pos.y)
mid_via_offset = vector(clk_offset.x,a_pos.y) + vector(drc["minwidth_metal2"]+drc["metal2_to_metal2"],0)
mid_via_offset = vector(clk_offset.x,a_pos.y) + vector(0.5*drc["minwidth_metal2"]+drc["metal2_to_metal2"]+0.5*m1m2_via.width,0)
# must under the clk line in M1
self.add_center_layout_pin(text="in[{0}]".format(row),
layer="metal1",
start=input_offset,
end=mid_via_offset)
m1m2_via=self.add_center_via(layers=("metal1", "via1", "metal2"),
offset=mid_via_offset)
self.add_center_via(layers=("metal1", "via1", "metal2"),
offset=mid_via_offset)
# now connect to the nand2 A
self.add_center_rect(layer="metal2",