colend fixes in progress

This commit is contained in:
Jesse Cirimelli-Low 2022-06-15 22:34:21 -07:00
parent 69bb6826dc
commit 98fe4c74a4
5 changed files with 36 additions and 27 deletions

View File

@ -107,6 +107,7 @@ class sky130_bitcell_base_array(bitcell_base_array):
strap_pins.extend(["top_gate"]) strap_pins.extend(["top_gate"])
else: else:
strap_pins.extend(["bot_gate"]) strap_pins.extend(["bot_gate"])
strap_pins.extend(["vdd", "gnd"])
return strap_pins return strap_pins
def get_row_cap_pins(self, row, col): def get_row_cap_pins(self, row, col):
@ -131,7 +132,7 @@ class sky130_bitcell_base_array(bitcell_base_array):
self.copy_layout_pin(inst, pin_name) self.copy_layout_pin(inst, pin_name)
if row == 2: #add only 1 label per col if row == 2: #add only 1 label per col
if 'VPB' in self.cell_inst[row, col].mod.pins: if 'VPB' or 'vpb' in self.cell_inst[row, col].mod.pins:
pin = inst.get_pin("vpb") pin = inst.get_pin("vpb")
self.objs.append(geometry.rectangle(layer["nwell"], self.objs.append(geometry.rectangle(layer["nwell"],
pin.ll(), pin.ll(),
@ -139,7 +140,7 @@ class sky130_bitcell_base_array(bitcell_base_array):
pin.height())) pin.height()))
self.objs.append(geometry.label("vdd", layer["nwell"], pin.center())) self.objs.append(geometry.label("vdd", layer["nwell"], pin.center()))
if 'VNB' in self.cell_inst[row, col].mod.pins: if 'VNB' or 'vnb'in self.cell_inst[row, col].mod.pins:
try: try:
from tech import layer_override from tech import layer_override
if layer_override['VNB']: if layer_override['VNB']:

View File

@ -42,7 +42,7 @@ class sky130_col_cap_array(sky130_bitcell_base_array):
self.place_array("dummy_r{0}_c{1}", self.mirror) self.place_array("dummy_r{0}_c{1}", self.mirror)
self.add_layout_pins() self.add_layout_pins()
#self.add_supply_pins() self.add_supply_pins()
self.add_boundary() self.add_boundary()
self.DRC_LVS() self.DRC_LVS()
@ -79,6 +79,8 @@ class sky130_col_cap_array(sky130_bitcell_base_array):
pins.append("gnd") pins.append("gnd")
pins.append("fake_br_{}".format(bitline)) pins.append("fake_br_{}".format(bitline))
pins.append("gate") pins.append("gate")
pins.append("vdd")
pins.append("gnd")
bitline += 1 bitline += 1
elif col % 4 == 1: elif col % 4 == 1:
row_layout.append(self.colend2) row_layout.append(self.colend2)
@ -94,6 +96,8 @@ class sky130_col_cap_array(sky130_bitcell_base_array):
pins.append("gnd") pins.append("gnd")
pins.append("fake_br_{}".format(bitline)) pins.append("fake_br_{}".format(bitline))
pins.append("gate") pins.append("gate")
pins.append("vdd")
pins.append("gnd")
bitline += 1 bitline += 1
elif col % 4 ==3: elif col % 4 ==3:
row_layout.append(self.colend2) row_layout.append(self.colend2)
@ -136,6 +140,7 @@ class sky130_col_cap_array(sky130_bitcell_base_array):
self.add_pin("gnd", "GROUND") self.add_pin("gnd", "GROUND")
self.add_pin("gate", "BIAS") self.add_pin("gate", "BIAS")
def add_layout_pins(self): def add_layout_pins(self):
""" Add the layout pins """ """ Add the layout pins """
# Add vdd/gnd via stacks # Add vdd/gnd via stacks
@ -208,35 +213,36 @@ class sky130_col_cap_array(sky130_bitcell_base_array):
offset=pin.ll().scale(1, 0), offset=pin.ll().scale(1, 0),
width=pin.width(), width=pin.width(),
height=pin.height()) height=pin.height())
return return
def add_supply_pins(self): def add_supply_pins(self):
for col in range(self.cols): for col in range(len(self.insts)):
inst = self.cell_inst[col] inst = self.cell_inst[col]
if 'VPB' in self.cell_inst[col].mod.pins:
if 'VPB' or 'vnb' in self.cell_inst[col].mod.pins:
pin = inst.get_pin("vpb") pin = inst.get_pin("vpb")
self.objs.append(geometry.rectangle(layer["nwell"], self.objs.append(geometry.rectangle(layer["nwell"],
pin.ll(), pin.ll(),
pin.width(), pin.width(),
pin.height())) pin.height()))
self.objs.append(geometry.label("vdd", layer["nwell"], pin.center())) self.objs.append(geometry.label("vdd", layer["nwell"], pin.center()))
if 'VNB' in self.cell_inst[col].mod.pins:
if 'VNB' or 'vnb' in self.cell_inst[col].mod.pins:
try: try:
from tech import layer_override from tech import layer_override
if layer_override['VNB']: if layer_override['VNB']:
pin = inst.get_pin("vnb") pin = inst.get_pin("vnb")
self.objs.append(geometry.label("gnd", layer["pwellp"], pin.center())) self.objs.append(geometry.label("gnd", layer["pwellp"], pin.center()))
self.objs.append(geometry.rectangle(layer["pwellp"], self.objs.append(geometry.rectangle(layer["pwellp"],
pin.ll(), pin.ll(),
pin.width(), pin.width(),
pin.height())) pin.height()))
except: except:
pin = inst.get_pin("vnb") pin = inst.get_pin("vnb")
self.add_label("vdd", pin.layer, pin.center())
def create_all_wordline_names(self, row_size=None): def create_all_wordline_names(self, row_size=None):
if row_size == None: if row_size == None:

View File

@ -167,7 +167,7 @@ class sky130_dummy_array(sky130_bitcell_base_array):
for row in range(self.row_size): for row in range(self.row_size):
for col in range(self.column_size): for col in range(self.column_size):
inst = self.cell_inst[row, col] inst = self.cell_inst[row, col]
if 'VPB' in self.cell_inst[row, col].mod.pins: if 'VPB' or 'vpb' in self.cell_inst[row, col].mod.pins:
pin = inst.get_pin("vpb") pin = inst.get_pin("vpb")
self.objs.append(geometry.rectangle(layer["nwell"], self.objs.append(geometry.rectangle(layer["nwell"],
pin.ll(), pin.ll(),
@ -175,7 +175,7 @@ class sky130_dummy_array(sky130_bitcell_base_array):
pin.height())) pin.height()))
self.objs.append(geometry.label("vdd", layer["nwell"], pin.center())) self.objs.append(geometry.label("vdd", layer["nwell"], pin.center()))
if 'VNB' in self.cell_inst[row, col].mod.pins: if 'VNB' or 'vnb' in self.cell_inst[row, col].mod.pins:
try: try:
from tech import layer_override from tech import layer_override
if layer_override['VNB']: if layer_override['VNB']:

View File

@ -226,7 +226,7 @@ class sky130_replica_column(sky130_bitcell_base_array):
for pin_name in ["vdd", "gnd"]: for pin_name in ["vdd", "gnd"]:
self.copy_layout_pin(inst, pin_name) self.copy_layout_pin(inst, pin_name)
if row == 2: if row == 2:
if 'VPB' in self.cell_inst[row].mod.pins: if 'VPB' or 'vpb' in self.cell_inst[row].mod.pins:
pin = inst.get_pin("vpb") pin = inst.get_pin("vpb")
self.objs.append(geometry.rectangle(layer["nwell"], self.objs.append(geometry.rectangle(layer["nwell"],
pin.ll(), pin.ll(),
@ -234,7 +234,7 @@ class sky130_replica_column(sky130_bitcell_base_array):
pin.height())) pin.height()))
self.objs.append(geometry.label("vdd", layer["nwell"], pin.center())) self.objs.append(geometry.label("vdd", layer["nwell"], pin.center()))
if 'VNB' in self.cell_inst[row].mod.pins: if 'VNB' or 'vnb' in self.cell_inst[row].mod.pins:
try: try:
from tech import layer_override from tech import layer_override
if layer_override['VNB']: if layer_override['VNB']:

View File

@ -116,13 +116,15 @@ cell_properties.bitcell_2port.vdd_dir = "H"
cell_properties.bitcell_2port.gnd_layer = "m2" cell_properties.bitcell_2port.gnd_layer = "m2"
cell_properties.bitcell_2port.gnd_dir = "H" cell_properties.bitcell_2port.gnd_dir = "H"
cell_properties.col_cap_1port_bitcell = cell(['br', 'vdd', 'gnd', 'bl', 'gate'], cell_properties.col_cap_1port_bitcell = cell(['bl', 'vdd', 'gnd', 'br', 'gate', 'vpb', 'vnb'],
['INPUT', 'POWER', 'GROUND', 'INPUT', 'INPUT'], ['INPUT', 'POWER', 'GROUND', 'INPUT', 'INPUT', 'BIAS', 'BIAS'],
{'bl': 'BL0', {'bl': 'bl',
'br': 'BL1', 'br': 'br',
'vdd': 'VPWR', 'vdd': 'vdd',
'gnd': 'VGND', 'gnd': 'gnd',
'gate': 'gate'}) 'gate': 'gate',
'vnb': 'vnb',
'vpb': 'vpb'})
cell_properties.col_cap_1port_bitcell.boundary_layer = "mem" cell_properties.col_cap_1port_bitcell.boundary_layer = "mem"
cell_properties.col_cap_1port_strap_power = cell(['vdd', 'vpb', 'vnb'], cell_properties.col_cap_1port_strap_power = cell(['vdd', 'vpb', 'vnb'],