single port fixes

This commit is contained in:
Jesse Cirimelli-Low 2025-09-12 11:25:03 -07:00
parent 4ce6e0538b
commit 5a74605117
9 changed files with 57 additions and 21 deletions

View File

@ -13,7 +13,7 @@ SRAM_LIB_GIT_REPO ?= https://github.com/vlsida/sky130_fd_bd_sram.git
# Use this for development
#SRAM_LIB_GIT_REPO ?= git@github.com:VLSIDA/sky130_fd_bd_sram.git
#SRAM_LIB_GIT_REPO ?= https://github.com/google/skywater-pdk-libs-sky130_fd_bd_sram.git
SRAM_LIB_GIT_COMMIT ?= 9bb620d12ae380dfe38f9a68df809f068f7b2a21
SRAM_LIB_GIT_COMMIT ?= 32f553d240545574282ac437ff98d2b889bf039f
SKY130_PDK ?= $(PDK_ROOT)/sky130A
GF180_PDK ?= $(PDK_ROOT)/gf180mcuD

View File

@ -19,7 +19,7 @@ class bitcell_array(bitcell_base_array):
Creates a rows x cols array of memory cells.
Assumes bit-lines and word lines are connected by abutment.
"""
def __init__(self, rows, cols, column_offset=0, name=""):
def __init__(self, rows, cols, column_offset=0, name="", left_rbl=None, right_rbl=None):
super().__init__(rows=rows, cols=cols, column_offset=column_offset, name=name)
debug.info(1, "Creating {0} {1} x {2}".format(self.name, rows, cols))
self.add_comment("rows: {0} cols: {1}".format(rows, cols))

View File

@ -78,7 +78,9 @@ class replica_bitcell_array(bitcell_base_array):
self.bitcell_array = factory.create(module_type="bitcell_array",
column_offset=len(self.left_rbl),
cols=self.column_size,
rows=self.row_size)
rows=self.row_size,
left_rbl=self.left_rbl,
right_rbl=self.right_rbl)
# Replica bitlines
self.replica_columns = {}

View File

@ -833,8 +833,8 @@ Xrca_top_4
X0 ll WL BR VNB sky130_fd_pr__special_nfet_pass w=0.14 l=0.15
X1 ul Q_bar_float VGND VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15
X2 BL WL ul VNB sky130_fd_pr__special_nfet_pass w=0.14 l=0.15
*X3 ur WL ur VPB sky130_fd_pr__special_pfet_pass w=0.07 l=0.095
*X4 lr WL lr VPB sky130_fd_pr__special_pfet_pass w=0.07 l=0.095
*X3 ur WL ur VPB sky130_fd_pr__special_pfet_pass w=0.14u l=25n
*X4 lr WL lr VPB sky130_fd_pr__special_pfet_pass w=0.14u l=25n
X5 VPWR Q_float lr VPB sky130_fd_pr__special_pfet_pass w=0.14 l=0.15
X6 ur Q_bar_float VPWR VPB sky130_fd_pr__special_pfet_pass w=0.14 l=0.15
X7 VGND Q_float ll VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15
@ -977,8 +977,8 @@ Xrca_19
X0 Q_bar WL BR VNB sky130_fd_pr__special_nfet_pass w=0.14 l=0.15
X1 Q Q_bar VGND VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15
X2 BL WL Q VNB sky130_fd_pr__special_nfet_pass w=0.14 l=0.15
*X3 Q WL Q VPB sky130_fd_pr__special_pfet_pass w=0.07 l=0.095
*X4 Q_bar WL Q_bar VPB sky130_fd_pr__special_pfet_pass w=0.07 l=0.095
*X3 Q WL Q VPB sky130_fd_pr__special_pfet_pass w=0.14u l=25n
*X4 Q_bar WL Q_bar VPB sky130_fd_pr__special_pfet_pass w=0.14u l=25n
X5 VPWR Q Q_bar VPB sky130_fd_pr__special_pfet_pass w=0.14 l=0.15
X6 Q Q_bar VPWR VPB sky130_fd_pr__special_pfet_pass w=0.14 l=0.15
X7 VGND Q Q_bar VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15
@ -989,8 +989,8 @@ X7 VGND Q Q_bar VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15
X0 Q_bar WL BR VNB sky130_fd_pr__special_nfet_pass w=0.14 l=0.15
X1 Q Q_bar VGND VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15
X2 BL WL Q VNB sky130_fd_pr__special_nfet_pass w=0.14 l=0.15
*X3 Q WL Q VPB sky130_fd_pr__special_pfet_pass w=0.07 l=0.095
*X4 Q_bar WL Q_bar VPB sky130_fd_pr__special_pfet_pass w=0.07 l=0.095
*X3 Q WL Q VPB sky130_fd_pr__special_pfet_pass w=0.14u l=25n
*X4 Q_bar WL Q_bar VPB sky130_fd_pr__special_pfet_pass w=0.14u l=25n
X5 VPWR Q Q_bar VPB sky130_fd_pr__special_pfet_pass w=0.14 l=0.15
X6 Q Q_bar VPWR VPB sky130_fd_pr__special_pfet_pass w=0.14 l=0.15
X7 VGND Q Q_bar VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15

View File

@ -833,8 +833,8 @@ Xrca_top_4
X0 ll WL BR VNB sky130_fd_pr__special_nfet_pass w=0.14 l=0.15
X1 ul Q_bar_float VGND VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15
X2 BL WL ul VNB sky130_fd_pr__special_nfet_pass w=0.14 l=0.15
*X3 ur WL ur VPB sky130_fd_pr__special_pfet_pass w=0.07 l=0.095
*X4 lr WL lr VPB sky130_fd_pr__special_pfet_pass w=0.07 l=0.095
*X3 ur WL ur VPB sky130_fd_pr__special_pfet_pass w=0.14u l=25n
*X4 lr WL lr VPB sky130_fd_pr__special_pfet_pass w=0.14u l=25n
X5 VPWR Q_float lr VPB sky130_fd_pr__special_pfet_pass w=0.14 l=0.15
X6 ur Q_bar_float VPWR VPB sky130_fd_pr__special_pfet_pass w=0.14 l=0.15
X7 VGND Q_float ll VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15
@ -977,8 +977,8 @@ Xrca_19
X0 Q_bar WL BR VNB sky130_fd_pr__special_nfet_pass w=0.14 l=0.15
X1 Q Q_bar VGND VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15
X2 BL WL Q VNB sky130_fd_pr__special_nfet_pass w=0.14 l=0.15
*X3 Q WL Q VPB sky130_fd_pr__special_pfet_pass w=0.07 l=0.095
*X4 Q_bar WL Q_bar VPB sky130_fd_pr__special_pfet_pass w=0.07 l=0.095
*X3 Q WL Q VPB sky130_fd_pr__special_pfet_pass w=0.14u l=25n
*X4 Q_bar WL Q_bar VPB sky130_fd_pr__special_pfet_pass w=0.14u l=25n
X5 VPWR Q Q_bar VPB sky130_fd_pr__special_pfet_pass w=0.14 l=0.15
X6 Q Q_bar VPWR VPB sky130_fd_pr__special_pfet_pass w=0.14 l=0.15
X7 VGND Q Q_bar VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15
@ -989,8 +989,8 @@ X7 VGND Q Q_bar VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15
X0 Q_bar WL BR VNB sky130_fd_pr__special_nfet_pass w=0.14 l=0.15
X1 Q Q_bar VGND VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15
X2 BL WL Q VNB sky130_fd_pr__special_nfet_pass w=0.14 l=0.15
*X3 Q WL Q VPB sky130_fd_pr__special_pfet_pass w=0.07 l=0.095
*X4 Q_bar WL Q_bar VPB sky130_fd_pr__special_pfet_pass w=0.07 l=0.095
*X3 Q WL Q VPB sky130_fd_pr__special_pfet_pass w=0.14u l=25n
*X4 Q_bar WL Q_bar VPB sky130_fd_pr__special_pfet_pass w=0.14u l=25n
X5 VPWR Q Q_bar VPB sky130_fd_pr__special_pfet_pass w=0.14 l=0.15
X6 Q Q_bar VPWR VPB sky130_fd_pr__special_pfet_pass w=0.14 l=0.15
X7 VGND Q Q_bar VNB sky130_fd_pr__special_nfet_latch w=0.21 l=0.15

View File

@ -23,6 +23,10 @@ class sky130_bitcell(bitcell_base):
cell_name = "sky130_fd_bd_sram__sram_sp_cell_opt1"
elif version == "opt1a":
cell_name = "sky130_fd_bd_sram__sram_sp_cell_opt1a"
elif version == "opt1_noblcon":
cell_name = "sky130_fd_bd_sram__openram_sp_cell_opt1_noblcon"
elif version == "opt1a_noblcon":
cell_name = "sky130_fd_bd_sram__openram_sp_cell_opt1a_noblcon"
else:
debug.error("Invalid sky130 cell name", -1)

View File

@ -19,14 +19,18 @@ class sky130_bitcell_array(bitcell_array, sky130_bitcell_base_array):
Creates a rows x cols array of memory cells.
Assumes bit-lines and word lines are connected by abutment.
"""
def __init__(self, rows, cols, column_offset=0, name=""):
def __init__(self, rows, cols, column_offset=0, name="",left_rbl=None, right_rbl=None):
super().__init__(rows=rows, cols=cols, column_offset=column_offset, name=name)
self.left_rbl = left_rbl
self.right_rbl = right_rbl
def add_modules(self):
""" Add the modules used in this design """
# Bitcell for port names only
self.cell = factory.create(module_type=OPTS.bitcell, version="opt1")
self.cella = factory.create(module_type=OPTS.bitcell, version="opt1a")
#self.cell_noblcon = factory.create(module_type=OPTS.bitcell, version="opt1_noblcon")
#self.cella_noblcon = factory.create(module_type=OPTS.bitcell, version="opt1a_noblcon")
self.strap = factory.create(module_type="internal", version="wlstrap")
self.strap_p = factory.create(module_type="internal", version="wlstrap_p")
self.strapa = factory.create(module_type="internal", version="wlstrapa")
@ -36,6 +40,9 @@ class sky130_bitcell_array(bitcell_array, sky130_bitcell_base_array):
""" Create the module instances used in this design """
self.all_inst={}
self.cell_inst={}
#self.cell_noblcon_inst = geometry.instance("cell_noblcon_inst", mod=self.cell_noblcon, is_bitcell=True)
#self.cella_noblcon_inst = geometry.instance("cella_noblcon_inst", mod=self.cella_noblcon, is_bitcell=True)
bit_row_opt1 = [geometry.instance("00_opt1", mod=self.cell, is_bitcell=True, mirror='XY')] \
+ [geometry.instance("01_strap_p", mod=self.strap_p, is_bitcell=False, mirror='MX')]\
@ -46,11 +53,32 @@ class sky130_bitcell_array(bitcell_array, sky130_bitcell_base_array):
+ [geometry.instance("11_strap_p", mod=self.strap_p, is_bitcell=False)] \
+ [geometry.instance("12_opt1a", mod=self.cella, is_bitcell=True)] \
+ [geometry.instance("13_strapa", mod=self.strapa, is_bitcell=False)]
bit_block = []
pattern.append_row_to_block(bit_block, bit_row_opt1)
pattern.append_row_to_block(bit_block, bit_row_opt1a)
for row in bit_block:
row = pattern.rotate_list(row, self.column_offset * 2)
self.pattern = pattern(self, "bitcell_array", bit_block, num_rows=self.row_size, num_cols=self.column_size, num_cores_x=ceil(self.column_size/2), num_cores_y=ceil(self.row_size/2), name_template="bit_r{0}_c{1}")
self.pattern.connect_array()
# for i in range(len(self.insts)):
# if self.left_rbl:
# if "r{}".format(self.row_size-1) in self.insts[i].name:
# if self.insts[i].mod == self.cell:
# self.insts[i].mod = self.cell_noblcon_inst.mod
# self.insts[i].gds = self.cell_noblcon_inst.gds
# elif self.insts[i].mod == self.cella:
# self.insts[i].mod = self.cella_noblcon_inst.mod
# self.insts[i].gds = self.cella_noblcon_inst.gds
# if self.right_rbl:
# if "r{}".format("0") in self.insts[i].name:
# if self.insts[i].mod == self.cell:
# self.insts[i].mod = self.cell_noblcon_inst.mod
# self.insts[i].gds = self.cell_noblcon_inst.gds
# elif self.insts[i].mod == self.cella:
# self.insts[i].mod = self.cella_noblcon_inst.mod
# self.insts[i].gds = self.cella_noblcon_inst.gds

View File

@ -50,9 +50,9 @@ class sky130_dummy_array(dummy_array, sky130_bitcell_base_array):
bit_block = []
if(self.row_offset % 2 == 0):
next_row = 0
else:
next_row = 1
else:
next_row = 0
for i in range(self.row_size):
if next_row == 0:

View File

@ -814,7 +814,9 @@ flatglob = ["*_?mos_m*",
blackbox_cells = ["sky130_fd_bd_sram__openram_dp_cell",
"sky130_fd_bd_sram__openram_dp_cell_dummy",
"sky130_fd_bd_sram__openram_dp_cell_replica",
"sky130_fd_bd_sram__openram_sp_cell_opt1_noblcon",
"sky130_fd_bd_sram__openram_sp_cell_opt1a_noblcon",
"sky130_fd_bd_sram__openram_sp_colend_replica",
"sky130_fd_bd_sram__openram_sp_colenda_replica",
"sky130_fd_bd_sram__sram_sp_cell_opt1a",