From 1e7ae06b7e52df715a000132513e71c96e36287d Mon Sep 17 00:00:00 2001 From: jcirimel Date: Thu, 8 Oct 2020 05:32:03 -0700 Subject: [PATCH] fix extra wl in col end, work on bring wl pins out to row end array, TODO: mirror alternating row end --- compiler/custom/s8_row_cap_array.py | 46 ++++++------ compiler/custom/s8_row_end.py | 10 ++- compiler/modules/bitcell_base_array.py | 84 ++++++++-------------- compiler/modules/replica_bitcell_array.py | 60 +++++++++++----- compiler/tests/missing_pin.gds | Bin 8520 -> 3444 bytes compiler/tests/sram_1b_16_1rw_sky130.log | 2 +- missing_pin.gds | Bin 8520 -> 3444 bytes sram_1b_16_1rw_sky130.log | 1 + 8 files changed, 101 insertions(+), 102 deletions(-) diff --git a/compiler/custom/s8_row_cap_array.py b/compiler/custom/s8_row_cap_array.py index ab3dce1c..e19db1be 100644 --- a/compiler/custom/s8_row_cap_array.py +++ b/compiler/custom/s8_row_cap_array.py @@ -73,24 +73,24 @@ class s8_row_cap_array(design.design): if alternate_bitcell == 0: row_layout.append(self.rowend1) self.cell_inst[row]=self.add_inst(name=name, mod=self.rowend1) - #self.connect_inst(self.get_bitcell_pins(row, 0)) + self.connect_inst(["wl_0_{}".format(row-1), "vpwr"]) alternate_bitcell = 1 else: row_layout.append(self.rowend2) self.cell_inst[row]=self.add_inst(name=name,mod=self.rowend2) - #self.connect_inst(self.get_bitcell_pins(row, 0)) + self.connect_inst(["wl_0_{}".format(row-1), "vpwr"]) alternate_bitcell = 0 elif (row == 0): row_layout.append(self.bottom_corner) self.cell_inst[row]=self.add_inst(name=name, mod=self.bottom_corner) - #self.connect_inst(self.get_bitcell_pins_col_cap(row, 0)) + self.connect_inst([]) elif (row == self.rows - 1): row_layout.append(self.top_corner) self.cell_inst[row]=self.add_inst(name=name, mod=self.top_corner) - #self.connect_inst(self.get_bitcell_pins_col_cap(row, 0)) + self.connect_inst([]) self.array_layout.append(row_layout) @@ -118,9 +118,9 @@ class s8_row_cap_array(design.design): if inst.width > self.width: self.width = inst.width yoffset = 0.0 - for row in range(0, len(self.array_layout)): - xoffset = 0.0 + xoffset = 0.0 + for col in range(0, len(self.array_layout[row])): inst = self.insts[col + row*len(self.array_layout[row])] inst.place(offset=[xoffset, yoffset]) @@ -138,25 +138,25 @@ class s8_row_cap_array(design.design): def add_layout_pins(self): """ Add the layout pins """ - return - row_list = self.cell.get_all_wl_names() + if self.column_offset == 0: + row_list = self.cell.get_all_wl_names() - for row in range(1, self.row_size - 1): - for cell_row in row_list: - wl_pin = self.cell_inst[row, 0].get_pin(cell_row) - self.add_layout_pin(text=cell_row + "_{0}".format(row), - layer=wl_pin.layer, - offset=wl_pin.ll().scale(0, 1), - width=self.width, - height=wl_pin.height()) + for row in range(1, self.rows-1): + if row > 0 and row < self.rows: + for cell_row in row_list: + wl_pin = self.cell_inst[row].get_pin(cell_row) + self.add_layout_pin(text=cell_row + "_0_{0}".format(row), + layer=wl_pin.layer, + offset=wl_pin.ll().scale(0, 1), + width=self.width, + height=wl_pin.height()) - # Add vdd/gnd via stacks - for row in range(1, self.row_size - 1): - for col in range(self.column_size): - inst = self.cell_inst[row, col] - for pin_name in ["vdd", "gnd"]: + # Add vdd/gnd via stacks + for row in range(1, self.rows): + inst = self.cell_inst[row] + for pin_name in ["vpwr", "vgnd"]: for pin in inst.get_pins(pin_name): self.add_power_pin(name=pin.name, - loc=pin.center(), - start_layer=pin.layer) + loc=pin.center(), + start_layer=pin.layer) diff --git a/compiler/custom/s8_row_end.py b/compiler/custom/s8_row_end.py index e9902397..d02ca709 100644 --- a/compiler/custom/s8_row_end.py +++ b/compiler/custom/s8_row_end.py @@ -17,8 +17,8 @@ class s8_row_end(design.design): def __init__(self, version, name=""): super().__init__(name) - pin_names = [] - type_list = [] + pin_names = ["wl", "vpwr"] + type_list = ["OUTPUT", "POWER"] if version == "rowend": self.name = "s8sram16x16_rowend" @@ -31,4 +31,8 @@ class s8_row_end(design.design): GDS["unit"], layer["mem"], "s8sram16x16_rowend_ce\x00") - pin_map = utils.get_libcell_pins(pin_names, self.name, GDS["unit"]) + self.pin_map = utils.get_libcell_pins(pin_names, self.name, GDS["unit"]) + + + self.add_pin("wl", "OUTPUT") + self.add_pin("vpwr", "POWER") diff --git a/compiler/modules/bitcell_base_array.py b/compiler/modules/bitcell_base_array.py index ffc3bb0f..ff2ff5a0 100644 --- a/compiler/modules/bitcell_base_array.py +++ b/compiler/modules/bitcell_base_array.py @@ -64,7 +64,7 @@ class bitcell_base_array(design.design): else: self.wordline_names[port].append("wl0_{0}_{1}".format(port, row)) self.wordline_names[port].append("wl1_{0}_{1}".format(port, row)) - + self.all_wordline_names = [x for sl in zip(*self.wordline_names) for x in sl] def add_pins(self): @@ -147,32 +147,33 @@ class bitcell_base_array(design.design): def add_layout_pins(self): """ Add the layout pins """ - if not cell_properties.compare_ports(cell_properties.bitcell_array.use_custom_cell_arrangement): - bitline_names = self.cell.get_all_bitline_names() - for col in range(self.column_size): - for port in self.all_ports: - bl_pin = self.cell_inst[0, col].get_pin(bitline_names[2 * port]) - self.add_layout_pin(text="bl_{0}_{1}".format(port, col), - layer=bl_pin.layer, - offset=bl_pin.ll().scale(1, 0), - width=bl_pin.width(), - height=self.height) - br_pin = self.cell_inst[0, col].get_pin(bitline_names[2 * port + 1]) - self.add_layout_pin(text="br_{0}_{1}".format(port, col), - layer=br_pin.layer, - offset=br_pin.ll().scale(1, 0), - width=br_pin.width(), - height=self.height) + bitline_names = self.cell.get_all_bitline_names() + for col in range(self.column_size): + for port in self.all_ports: + bl_pin = self.cell_inst[0, col].get_pin(bitline_names[2 * port]) + self.add_layout_pin(text="bl_{0}_{1}".format(port, col), + layer=bl_pin.layer, + offset=bl_pin.ll().scale(1, 0), + width=bl_pin.width(), + height=self.height) + br_pin = self.cell_inst[0, col].get_pin(bitline_names[2 * port + 1]) + self.add_layout_pin(text="br_{0}_{1}".format(port, col), + layer=br_pin.layer, + offset=br_pin.ll().scale(1, 0), + width=br_pin.width(), + height=self.height) - wl_names = self.cell.get_all_wl_names() - for row in range(self.row_size): - for port in self.all_ports: - wl_pin = self.cell_inst[row, 0].get_pin(wl_names[port]) - self.add_layout_pin(text="wl_{0}_{1}".format(port, row), - layer=wl_pin.layer, - offset=wl_pin.ll().scale(0, 1), - width=self.width, - height=wl_pin.height()) + wl_names = self.cell.get_all_wl_names() + for row in range(self.row_size): + for port in self.all_ports: + wl_pin = self.cell_inst[row, 0].get_pin(wl_names[port]) + self.add_layout_pin(text="wl_{0}_{1}".format(port, row), + layer=wl_pin.layer, + offset=wl_pin.ll().scale(0, 1), + width=self.width, + height=wl_pin.height()) + + if not cell_properties.compare_ports(cell_properties.bitcell_array.use_custom_cell_arrangement): # Copy a vdd/gnd layout pin from every cell for row in range(self.row_size): @@ -181,37 +182,8 @@ class bitcell_base_array(design.design): for pin_name in ["vdd", "gnd"]: self.copy_layout_pin(inst, pin_name) else: - bitline_names = self.cell.get_all_bitline_names() - for col in range(self.column_size): - for port in self.all_ports: - bl_pin = self.cell_inst[0, col].get_pin(bitline_names[2 * port]) - self.add_layout_pin(text="bl0_{0}_{1}".format(port, col), - layer=bl_pin.layer, - offset=bl_pin.ll().scale(1, 0), - width=bl_pin.width(), - height=self.height) - br_pin = self.cell_inst[0, col].get_pin(bitline_names[2 * port + 1]) - self.add_layout_pin(text="bl1_{0}_{1}".format(port, col), - layer=br_pin.layer, - offset=br_pin.ll().scale(1, 0), - width=br_pin.width(), - height=self.height) - wl_names = self.cell.get_all_wl_names() - for row in range(self.row_size): - for port in self.all_ports: - wl0_pin = self.cell_inst[row, 0].get_pin(wl_names[port]) - self.add_layout_pin(text="wl0_{0}_{1}".format(port, row), - layer=wl0_pin.layer, - offset=wl0_pin.ll().scale(0, 1), - width=self.width, - height=wl0_pin.height()) - wl1_pin = self.cell_inst[row, 0].get_pin(wl_names[port]) - self.add_layout_pin(text="wl1_{0}_{1}".format(port, row), - layer=wl1_pin.layer, - offset=wl1_pin.ll().scale(0, 1), - width=self.width, - height=wl1_pin.height()) + # Copy a vdd/gnd layout pin from every cell for row in range(self.row_size): for col in range(self.column_size): diff --git a/compiler/modules/replica_bitcell_array.py b/compiler/modules/replica_bitcell_array.py index 816a5391..dbd724c7 100644 --- a/compiler/modules/replica_bitcell_array.py +++ b/compiler/modules/replica_bitcell_array.py @@ -502,26 +502,18 @@ class replica_bitcell_array(bitcell_base_array.bitcell_base_array): def add_layout_pins(self): """ Add the layout pins """ - # All wordlines - # Main array wl and bl/br - for pin_name in self.all_wordline_names: - pin_list = self.bitcell_array_inst.get_pins(pin_name) - for pin in pin_list: - self.add_layout_pin(text=pin_name, - layer=pin.layer, - offset=pin.ll().scale(0, 1), - width=self.width, - height=pin.height()) - - for pin_name in self.all_bitline_names: - pin_list = self.bitcell_array_inst.get_pins(pin_name) - for pin in pin_list: - self.add_layout_pin(text=pin_name, - layer=pin.layer, - offset=pin.ll().scale(1, 0), - width=pin.width(), - height=self.height) + #All wordlines + #Main array wl and bl/br + if not cell_properties.compare_ports(cell_properties.bitcell_array.use_custom_cell_arrangement): + for pin_name in self.all_wordline_names: + pin_list = self.bitcell_array_inst.get_pins(pin_name) + for pin in pin_list: + self.add_layout_pin(text=pin_name, + layer=pin.layer, + offset=pin.ll().scale(0, 1), + width=self.width, + height=pin.height()) # Replica wordlines (go by the row instead of replica column because we may have to add a pin # even though the column is in another local bitcell array) for (names, inst) in zip(self.rbl_wordline_names, self.dummy_row_replica_insts): @@ -534,6 +526,36 @@ class replica_bitcell_array(bitcell_base_array.bitcell_base_array): offset=pin.ll().scale(0, 1), width=self.width, height=pin.height()) + else: + for pin_name in self.all_wordline_names: + pin_list = self.dummy_col_insts[0].get_pins(pin_name) + for pin in pin_list: + self.add_layout_pin(text=pin_name, + layer=pin.layer, + offset=pin.ll().scale(0, 1), + width=self.width, + height=pin.height()) + # Replica wordlines (go by the row instead of replica column because we may have to add a pin + # even though the column is in another local bitcell array) + for (names, inst) in zip(self.rbl_wordline_names, self.dummy_row_replica_insts): + for (wl_name, pin_name) in zip(names, self.dummy_row.get_wordline_names()): + if wl_name in self.gnd_wordline_names: + continue + pin = inst.get_pin(pin_name) + self.add_layout_pin(text=wl_name, + layer=pin.layer, + offset=pin.ll().scale(0, 1), + width=self.width, + height=pin.height()) + + for pin_name in self.all_bitline_names: + pin_list = self.bitcell_array_inst.get_pins(pin_name) + for pin in pin_list: + self.add_layout_pin(text=pin_name, + layer=pin.layer, + offset=pin.ll().scale(1, 0), + width=pin.width(), + height=self.height) # Replica bitlines if len(self.rbls) > 0: diff --git a/compiler/tests/missing_pin.gds b/compiler/tests/missing_pin.gds index 692677d9eebb55410a246143cdb0049584c034e1..69d112e423b42ca89bfa29d91a6b37c4cd272f15 100644 GIT binary patch literal 3444 zcmai%PiR#~6voe;`^QvLjq-eA43<(*(TJp=rWCZs)QutpS}LN3su826YEqlfx@n=P zbk|kEg+C!z(sp{*i~G~d4S^0qxUuKoAc==|ny zuN-(!2J(7+e-ZTK(`RNUJ~}pjc4%sRX7W>!tVg7H)yeBpEOD|?2K!R+Z8C5UyonD< z`=n&cy6E$zUZ1b=`jWISt=A`0BC0n+pI*Z=Nqf*QlCGII+cTe<`1s8->ru;ku*y0c z_M^`J0QVq0lJ?=2QMc&b4rqQCQ6@*he=5=r#2h_BrhX$L#? zQRTUxO)lvv@O|h5X$Ncd$q@X1#hAhD40yXD?O<2EJLL5#mPYj??O?6mZNZqaM<|nN z@LomQ!C3F#oQCYx{l=~Jb7mEI49{AD-+==lD$zajw2FjXDeCt$=)AtRfB74J+Cb}b z3Ai79g2f>CyrMgT=L`7U_oNQ2?LYm-yhN$Gw2A)Fk5c>3ii#RH8}Z{%Y76?8^?$J3 zkG-q)r}d@%D)TqMFDj;Y@r*s1v^NiaWavf_#~TUn(}gnLocGi@(lsP)ABU+V-W%JW zN$k_yx0T5+{{LhSzicn`fp)HFsMejuk0-nzT36{$$N|hwf~YT&cCa&_pijO+|C$46 z^~pK~X>Y5~j`;4hk8f*>_$2LMZG0WC#^HOBUiRZq(%vmTyoCDz_XU#nw*6teWq;hH zJ)nWfL(CoOk)$1r$A8fD(f(w9__BKbx+3ju`gcsfygJ$Fr+PivNZQ-^Q`kv z(hkP?`T33YIv&;QcrZTF#t9P`>t`(fhA=#ec3-1$SL#u~bpzZ>c`O~#?dZrnBgy;unR`oKN7>7*gC7iu)S zB*m&?Htejy7dHp^=JZ{i?-={{%Qf?3Po#GsAHmF9^V#UxxL$fz6`!1)o%Z#G`Oh+W E0bzJ6EC2ui literal 8520 zcmchcX^0#}6vwNtNm$l632QV53!X6=)b&G*c*QG<37Yl3l68|!WaDNtW~0WaC?24A zpx~Dn)F`4DqDB#n1O!2XibwQ=eh@T*ibhchD2ibG|6kSXsp^@YncWXI^!#RC_rL1Z zt5?<4HKtc^*GPYoB{ovZZ`5XJ@8`G0yXP*7gDT{Z% z^!usj?L2YomTNCJv$Jx2Z^h{cR<0Tu8Cbn;?ZDWo^~0+NM%S(zGwEbwDhI`8x~WXz z=e%lS!eb+TZpEprUrnbPlTI=dtG)Jr)P7jl_FA89dfw{8rPar?)dvn7_!H-SB${{^ z&TExwCru}FDRJ)6OGktW4G1-^Kkd=Ah-*u`Tl-M-WqY4wh z%TLsO6F%sJquRkzeR`eMlhma<>ZIOX_x0yV`+Lj~M?ktpsusp~;P(Y6k30i>z%uz7 zJOSl8W=G;TbV|0H^(tASE4Nv_OIUCGq^(!@1b*+vZ%3AsTx!cBX;1F=h_6mxT7I+~ zH{l?&Eg;HNvix|qEuR$ozB*M0mX^Xm8-{XDes>oIrAN`g-m%sVua23i_%?wf6<}H|W!Tt55&2`kZR- zFW1M1!hg>9Ps;Jx;1ckTT{x zbX}oTJ6Kx(1m@=f|9QmuCwdkqm_7<0y6aRs=+}RJus*xP`pz|pjN2V`@(S%ZeEl+C zFIU|M_3?LBPkM*1U+DWE@3D80P3yPUeSN>^P$A_H{y{KV?5c9(=j{6epi}5>~$sAT-4`$!6??r@&+^mfY(4B> z)~{4MSgL2eypN=g^()n0&@T`2)8(<|HT#o#l84K4zy7nGeu?B4W6Zn&B~SL(Nt@)C zBm0;6rBof*to#vKpP)T*fRZ2hp_G1yT`6%xJe6#J^tg*JDE*7;N-Y=k>%Umqr_YZ) za+ev$_#G4d@kZj4UI~A(ekYSpT|AV#@OusHj`BQ4+;ch|^uB*V`SecS3&@-Cv8Ya2 zC%}{w^>WXIevrA&mEUE|%<%o*+ZXZP@S!&G3hPrh!j0W2JTs=p<}%#}n3XM@v6;tH zcAtcAPgq%Y&8Upl2FJLUz~@zm+Bs6&WNL@TtxSG26H&t7?B0p_n>>#Q?`N&G+AZVq zH+fz9t|R4HAIY)D?L%#czbAKAXQMJoL*=B_JBAHAMA)w!-ZVUVW4;3McJ0vbOX1tW zj=cy7GCWhN{oo+O8}w$_>iI?{Gm}#7!!7g}5!_Xgk%1+WtcV@e4*DZ3tRH%=6shMM zm5f-W+T9AWaRliO8FJnqLGe1axL)33-oVK6 z;I1-yFsIsG#M^k^6THI@+&Vmn0J?Rm-A8isY`O{;7T_d5!HF!%srChd&w-wAo%|GnS!yV`MLYd#EjemWH?5GCwYnT(_yY&!v7Is1NT^m1( zS}O8=%MwMKC=_}QrJbBd;C#0NI9;C5@WQR4Wt>Du*zqE~%JyX9sP}<>_66n1(=b9A zd@9a$O?1pMTb?r2`=X}h!o_Gk*F6!FZ(7+wO7mQ=PV}h5*;JvTy$bcsfp{+P4LI``+sG+?VB?MRGrn z`@KrFgTDWv{%|{Y#w7Oj;>{j0mx?{y*VBD*$-2D%_Mz?UFOvPJ{aMz3J??)6*MHJ) z&};u`f4cr{^xx@q&JUipXouL9E&R{>e+M);^8R0gAIt+1;5sgt&$WKJjE_a`3(0Z7 zL+SKg#`Fa9;(*LHCG!^UF3gSj3|+1$lrPVr^1BQF{}rCO(B0$y|6^nDwjoh~Uxn3k ztuJ30m1x`w7@33BbEYeVSy{M7i(W>c9^@Kr#mGr6W}PXM>2+maJ7xdR5A^Qr|HX9A z&d$NxfgIg3!yk$7$FlxgZyX)6tu3v;v=r{%xKe7jtq)4U%u#56>r&nnUurAD7TI@@ z(kSw6CmS}E8I{{cn$&(;v*(&9G0N>3eQV_fK|HcG=xvC2GCu+B(R^B=+M&vO6( diff --git a/compiler/tests/sram_1b_16_1rw_sky130.log b/compiler/tests/sram_1b_16_1rw_sky130.log index e92e1a3b..0fafc96e 100644 --- a/compiler/tests/sram_1b_16_1rw_sky130.log +++ b/compiler/tests/sram_1b_16_1rw_sky130.log @@ -1,4 +1,4 @@ -WARNING: file magic.py: line 210: DRC Errors replica_bitcell_array 985 +WARNING: file magic.py: line 210: DRC Errors replica_bitcell_array 1010 ERROR: file magic.py: line 285: replica_bitcell_array LVS mismatch (results in /home/jesse/output/replica_bitcell_array.lvs.report) diff --git a/missing_pin.gds b/missing_pin.gds index 692677d9eebb55410a246143cdb0049584c034e1..69d112e423b42ca89bfa29d91a6b37c4cd272f15 100644 GIT binary patch literal 3444 zcmai%PiR#~6voe;`^QvLjq-eA43<(*(TJp=rWCZs)QutpS}LN3su826YEqlfx@n=P zbk|kEg+C!z(sp{*i~G~d4S^0qxUuKoAc==|ny zuN-(!2J(7+e-ZTK(`RNUJ~}pjc4%sRX7W>!tVg7H)yeBpEOD|?2K!R+Z8C5UyonD< z`=n&cy6E$zUZ1b=`jWISt=A`0BC0n+pI*Z=Nqf*QlCGII+cTe<`1s8->ru;ku*y0c z_M^`J0QVq0lJ?=2QMc&b4rqQCQ6@*he=5=r#2h_BrhX$L#? zQRTUxO)lvv@O|h5X$Ncd$q@X1#hAhD40yXD?O<2EJLL5#mPYj??O?6mZNZqaM<|nN z@LomQ!C3F#oQCYx{l=~Jb7mEI49{AD-+==lD$zajw2FjXDeCt$=)AtRfB74J+Cb}b z3Ai79g2f>CyrMgT=L`7U_oNQ2?LYm-yhN$Gw2A)Fk5c>3ii#RH8}Z{%Y76?8^?$J3 zkG-q)r}d@%D)TqMFDj;Y@r*s1v^NiaWavf_#~TUn(}gnLocGi@(lsP)ABU+V-W%JW zN$k_yx0T5+{{LhSzicn`fp)HFsMejuk0-nzT36{$$N|hwf~YT&cCa&_pijO+|C$46 z^~pK~X>Y5~j`;4hk8f*>_$2LMZG0WC#^HOBUiRZq(%vmTyoCDz_XU#nw*6teWq;hH zJ)nWfL(CoOk)$1r$A8fD(f(w9__BKbx+3ju`gcsfygJ$Fr+PivNZQ-^Q`kv z(hkP?`T33YIv&;QcrZTF#t9P`>t`(fhA=#ec3-1$SL#u~bpzZ>c`O~#?dZrnBgy;unR`oKN7>7*gC7iu)S zB*m&?Htejy7dHp^=JZ{i?-={{%Qf?3Po#GsAHmF9^V#UxxL$fz6`!1)o%Z#G`Oh+W E0bzJ6EC2ui literal 8520 zcmchcX^0#}6vwNtNm$l632QV53!X6=)b&G*c*QG<37Yl3l68|!WaDNtW~0WaC?24A zpx~Dn)F`4DqDB#n1O!2XibwQ=eh@T*ibhchD2ibG|6kSXsp^@YncWXI^!#RC_rL1Z zt5?<4HKtc^*GPYoB{ovZZ`5XJ@8`G0yXP*7gDT{Z% z^!usj?L2YomTNCJv$Jx2Z^h{cR<0Tu8Cbn;?ZDWo^~0+NM%S(zGwEbwDhI`8x~WXz z=e%lS!eb+TZpEprUrnbPlTI=dtG)Jr)P7jl_FA89dfw{8rPar?)dvn7_!H-SB${{^ z&TExwCru}FDRJ)6OGktW4G1-^Kkd=Ah-*u`Tl-M-WqY4wh z%TLsO6F%sJquRkzeR`eMlhma<>ZIOX_x0yV`+Lj~M?ktpsusp~;P(Y6k30i>z%uz7 zJOSl8W=G;TbV|0H^(tASE4Nv_OIUCGq^(!@1b*+vZ%3AsTx!cBX;1F=h_6mxT7I+~ zH{l?&Eg;HNvix|qEuR$ozB*M0mX^Xm8-{XDes>oIrAN`g-m%sVua23i_%?wf6<}H|W!Tt55&2`kZR- zFW1M1!hg>9Ps;Jx;1ckTT{x zbX}oTJ6Kx(1m@=f|9QmuCwdkqm_7<0y6aRs=+}RJus*xP`pz|pjN2V`@(S%ZeEl+C zFIU|M_3?LBPkM*1U+DWE@3D80P3yPUeSN>^P$A_H{y{KV?5c9(=j{6epi}5>~$sAT-4`$!6??r@&+^mfY(4B> z)~{4MSgL2eypN=g^()n0&@T`2)8(<|HT#o#l84K4zy7nGeu?B4W6Zn&B~SL(Nt@)C zBm0;6rBof*to#vKpP)T*fRZ2hp_G1yT`6%xJe6#J^tg*JDE*7;N-Y=k>%Umqr_YZ) za+ev$_#G4d@kZj4UI~A(ekYSpT|AV#@OusHj`BQ4+;ch|^uB*V`SecS3&@-Cv8Ya2 zC%}{w^>WXIevrA&mEUE|%<%o*+ZXZP@S!&G3hPrh!j0W2JTs=p<}%#}n3XM@v6;tH zcAtcAPgq%Y&8Upl2FJLUz~@zm+Bs6&WNL@TtxSG26H&t7?B0p_n>>#Q?`N&G+AZVq zH+fz9t|R4HAIY)D?L%#czbAKAXQMJoL*=B_JBAHAMA)w!-ZVUVW4;3McJ0vbOX1tW zj=cy7GCWhN{oo+O8}w$_>iI?{Gm}#7!!7g}5!_Xgk%1+WtcV@e4*DZ3tRH%=6shMM zm5f-W+T9AWaRliO8FJnqLGe1axL)33-oVK6 z;I1-yFsIsG#M^k^6THI@+&Vmn0J?Rm-A8isY`O{;7T_d5!HF!%srChd&w-wAo%|GnS!yV`MLYd#EjemWH?5GCwYnT(_yY&!v7Is1NT^m1( zS}O8=%MwMKC=_}QrJbBd;C#0NI9;C5@WQR4Wt>Du*zqE~%JyX9sP}<>_66n1(=b9A zd@9a$O?1pMTb?r2`=X}h!o_Gk*F6!FZ(7+wO7mQ=PV}h5*;JvTy$bcsfp{+P4LI``+sG+?VB?MRGrn z`@KrFgTDWv{%|{Y#w7Oj;>{j0mx?{y*VBD*$-2D%_Mz?UFOvPJ{aMz3J??)6*MHJ) z&};u`f4cr{^xx@q&JUipXouL9E&R{>e+M);^8R0gAIt+1;5sgt&$WKJjE_a`3(0Z7 zL+SKg#`Fa9;(*LHCG!^UF3gSj3|+1$lrPVr^1BQF{}rCO(B0$y|6^nDwjoh~Uxn3k ztuJ30m1x`w7@33BbEYeVSy{M7i(W>c9^@Kr#mGr6W}PXM>2+maJ7xdR5A^Qr|HX9A z&d$NxfgIg3!yk$7$FlxgZyX)6tu3v;v=r{%xKe7jtq)4U%u#56>r&nnUurAD7TI@@ z(kSw6CmS}E8I{{cn$&(;v*(&9G0N>3eQV_fK|HcG=xvC2GCu+B(R^B=+M&vO6( diff --git a/sram_1b_16_1rw_sky130.log b/sram_1b_16_1rw_sky130.log index f57734de..248d025f 100644 --- a/sram_1b_16_1rw_sky130.log +++ b/sram_1b_16_1rw_sky130.log @@ -17,3 +17,4 @@ [bitcell_base_array/__init__]: Creating bitcell_array 4 x 4 [bitcell_array/__init__]: Creating bitcell_array 4 x 4 [bitcell_base_array/__init__]: Creating replica_column 7 x 1 +[bitcell_base_array/__init__]: Creating dummy_array 1 x 4