From 8d9b79dfd806bea4a73dc5fb1a8ecff138d0ff43 Mon Sep 17 00:00:00 2001 From: Matt Guthaus Date: Fri, 16 Feb 2018 15:25:27 -0800 Subject: [PATCH 01/70] Add dff_buf for buffered flop arrays. --- compiler/modules/dff.py | 2 +- compiler/modules/dff_buf.py | 146 +++++++ compiler/tests/11_dff_buf_test.py | 36 ++ technology/freepdk45/gds_lib/dff.gds | Bin 22528 -> 22528 bytes technology/freepdk45/sp_lib/dff.sp | 18 +- technology/scn3me_subm/gds_lib/dff.gds | Bin 18414 -> 16622 bytes technology/scn3me_subm/mag_lib/dff.mag | 538 ++++++++++++------------- technology/scn3me_subm/sp_lib/dff.sp | 14 +- 8 files changed, 458 insertions(+), 296 deletions(-) create mode 100644 compiler/modules/dff_buf.py create mode 100644 compiler/tests/11_dff_buf_test.py diff --git a/compiler/modules/dff.py b/compiler/modules/dff.py index 2db12281..62e424cb 100644 --- a/compiler/modules/dff.py +++ b/compiler/modules/dff.py @@ -10,7 +10,7 @@ class dff(design.design): Memory address flip-flop """ - pin_names = ["d", "q", "clk", "vdd", "gnd"] + pin_names = ["D", "Q", "clk", "vdd", "gnd"] (width,height) = utils.get_libcell_size("dff", GDS["unit"], layer["boundary"]) pin_map = utils.get_libcell_pins(pin_names, "dff", GDS["unit"], layer["boundary"]) diff --git a/compiler/modules/dff_buf.py b/compiler/modules/dff_buf.py new file mode 100644 index 00000000..bcd03f16 --- /dev/null +++ b/compiler/modules/dff_buf.py @@ -0,0 +1,146 @@ +import debug +import design +from tech import drc +from math import log +from vector import vector +from globals import OPTS +from pinv import pinv + +class dff_buf(design.design): + """ + This is a simple buffered DFF. The output is buffered + with two inverters, of variable size, to provide q + and qbar. This is to enable driving large fanout loads. + """ + + def __init__(self, inv1_size, inv2_size, name=""): + + if name=="": + name = "dff_buf_{0}_{1}".format(inv1_size, inv2_size) + design.design.__init__(self, name) + debug.info(1, "Creating {}".format(self.name)) + + c = reload(__import__(OPTS.dff)) + self.mod_dff = getattr(c, OPTS.dff) + self.dff = self.mod_dff("dff") + self.add_mod(self.dff) + + self.inv1 = pinv(size=inv1_size,height=self.dff.height) + self.add_mod(self.inv1) + + self.inv2 = pinv(size=inv2_size,height=self.dff.height) + self.add_mod(self.inv2) + + self.width = self.dff.width + self.inv1.width + self.inv2.width + self.height = self.dff.height + + self.create_layout() + + def create_layout(self): + self.add_pins() + self.add_insts() + self.add_wires() + self.add_layout_pins() + self.DRC_LVS() + + def add_pins(self): + self.add_pin("D") + self.add_pin("Q") + self.add_pin("Qb") + self.add_pin("clk") + self.add_pin("vdd") + self.add_pin("gnd") + + def add_insts(self): + # Add the DFF + self.dff_inst=self.add_inst(name="dff_buf_dff", + mod=self.dff, + offset=vector(0,0)) + self.connect_inst(["D", "qint", "clk", "vdd", "gnd"]) + + # Add INV1 to the right + self.inv1_inst=self.add_inst(name="dff_buf_inv1", + mod=self.inv1, + offset=vector(self.dff_inst.rx(),0)) + self.connect_inst(["qint", "Qb", "vdd", "gnd"]) + + # Add INV2 to the right + self.inv2_inst=self.add_inst(name="dff_buf_inv2", + mod=self.inv2, + offset=vector(self.inv1_inst.rx(),0)) + self.connect_inst(["Qb", "Q", "vdd", "gnd"]) + + def add_wires(self): + # Route dff q to inv1 a + q_pin = self.dff_inst.get_pin("Q") + a1_pin = self.inv1_inst.get_pin("A") + mid_point = vector(a1_pin.cx(), q_pin.cy()) + self.add_wire(("metal3","via2","metal2"), + [q_pin.center(), mid_point, a1_pin.center()]) + self.add_via_center(("metal2","via2","metal3"), + q_pin.center()) + self.add_via_center(("metal1","via1","metal2"), + a1_pin.center()) + + # Route inv1 z to inv2 a + z1_pin = self.inv1_inst.get_pin("Z") + a2_pin = self.inv2_inst.get_pin("A") + mid_point = vector(z1_pin.cx(), a2_pin.cy()) + self.add_wire(("metal1","via1","metal2"), + [z1_pin.center(), mid_point, a2_pin.center()]) + + def add_layout_pins(self): + + # Continous vdd rail along with label. + vdd_pin=self.dff_inst.get_pin("vdd") + self.add_layout_pin(text="vdd", + layer="metal1", + offset=vdd_pin.ll(), + width=self.width, + height=vdd_pin.height()) + + # Continous gnd rail along with label. + gnd_pin=self.dff_inst.get_pin("gnd") + self.add_layout_pin(text="gnd", + layer="metal1", + offset=gnd_pin.ll(), + width=self.width, + height=vdd_pin.height()) + + clk_pin = self.dff_inst.get_pin("clk") + self.add_layout_pin(text="clk", + layer=clk_pin.layer, + offset=clk_pin.ll(), + width=clk_pin.width(), + height=clk_pin.height()) + + din_pin = self.dff_inst.get_pin("D") + self.add_layout_pin(text="D", + layer=din_pin.layer, + offset=din_pin.ll(), + width=din_pin.width(), + height=din_pin.height()) + + dout_pin = self.inv2_inst.get_pin("Z") + self.add_layout_pin(text="Q", + layer=dout_pin.layer, + offset=dout_pin.ll(), + width=dout_pin.width(), + height=dout_pin.height()) + + dout_pin = self.inv1_inst.get_pin("Z") + self.add_layout_pin(text="Qb", + layer=dout_pin.layer, + offset=dout_pin.ll(), + width=dout_pin.width(), + height=dout_pin.height()) + + + + def analytical_delay(self, slew, load=0.0): + """ Calculate the analytical delay of DFF-> INV -> INV """ + dff_delay=self.dff.analytical_delay(slew=slew, load=self.inv1.input_load()) + inv1_delay = self.inv1.analytical_delay(slew=dff_delay.slew, load=self.inv2.input_load()) + inv2_delay = self.inv2.analytical_delay(slew=inv1_delay.slew, load=load) + return dff_delay + inv1_delay + inv2_delay + diff --git a/compiler/tests/11_dff_buf_test.py b/compiler/tests/11_dff_buf_test.py new file mode 100644 index 00000000..3827647e --- /dev/null +++ b/compiler/tests/11_dff_buf_test.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python2.7 +""" +Run a regresion test on a dff_buf. +""" + +import unittest +from testutils import header,openram_test +import sys,os +sys.path.append(os.path.join(sys.path[0],"..")) +import globals +from globals import OPTS +import debug + +class dff_buf_test(openram_test): + + def runTest(self): + globals.init_openram("config_20_{0}".format(OPTS.tech_name)) + global verify + import verify + OPTS.check_lvsdrc = False + + import dff_buf + + debug.info(2, "Testing dff_buf 4x 8x") + a = dff_buf.dff_buf(4, 8) + self.local_check(a) + + OPTS.check_lvsdrc = True + globals.end_openram() + +# instantiate a copdsay of the class to actually run the test +if __name__ == "__main__": + (OPTS, args) = globals.parse_args() + del sys.argv[1:] + header(__file__, OPTS.tech_name) + unittest.main() diff --git a/technology/freepdk45/gds_lib/dff.gds b/technology/freepdk45/gds_lib/dff.gds index 572020266bfa851afb05d797d738e6316c4e751e..db7d3af31b9b86b49b4bf1bb369048f353431d67 100644 GIT binary patch delta 109 zcmZqJz}T>Xae}NPAA=Nw00R#bTS{tLVrfnZ1A_=NtDVA;*-IY>f3sAI5x?NO<_Cie zD-#0;10w?yP%R6C6@w6%1=c$;?f|39#D&tEtr#ycG6rtuWxnUSd9}|@&dpCe4lr*{ I37f+R0OxBRXae}NP7lR6eC<6}@TS{tLVrfnZ1A_=NtDVA;*-IY>f3sAI5x?NOmWe@z zm5G6afsuiUL4bjU!HPi$%mVA37>9ZUcK diff --git a/technology/freepdk45/sp_lib/dff.sp b/technology/freepdk45/sp_lib/dff.sp index 8cc62891..51d99ad1 100644 --- a/technology/freepdk45/sp_lib/dff.sp +++ b/technology/freepdk45/sp_lib/dff.sp @@ -3,11 +3,11 @@ * Program "Calibre xRC" * Version "v2007.2_34.24" * -.subckt dff d q clk vdd gnd +.subckt dff D Q clk vdd gnd * -MM21 q a_66_6# gnd gnd NMOS_VTG L=5e-08 W=5e-07 +MM21 Q a_66_6# gnd gnd NMOS_VTG L=5e-08 W=5e-07 MM19 a_76_6# a_2_6# a_66_6# gnd NMOS_VTG L=5e-08 W=2.5e-07 -MM20 gnd q a_76_6# gnd NMOS_VTG L=5e-08 W=2.5e-07 +MM20 gnd Q a_76_6# gnd NMOS_VTG L=5e-08 W=2.5e-07 MM18 a_66_6# clk a_61_6# gnd NMOS_VTG L=5e-08 W=2.5e-07 MM17 a_61_6# a_34_4# gnd gnd NMOS_VTG L=5e-08 W=2.5e-07 MM10 gnd clk a_2_6# gnd NMOS_VTG L=5e-08 W=5e-07 @@ -15,9 +15,9 @@ MM16 a_34_4# a_22_6# gnd gnd NMOS_VTG L=5e-08 W=2.5e-07 MM15 gnd a_34_4# a_31_6# gnd NMOS_VTG L=5e-08 W=2.5e-07 MM14 a_31_6# clk a_22_6# gnd NMOS_VTG L=5e-08 W=2.5e-07 MM13 a_22_6# a_2_6# a_17_6# gnd NMOS_VTG L=5e-08 W=2.5e-07 -MM12 a_17_6# d gnd gnd NMOS_VTG L=5e-08 W=2.5e-07 -MM11 q a_66_6# vdd vdd PMOS_VTG L=5e-08 W=1e-06 -MM9 vdd q a_76_84# vdd PMOS_VTG L=5e-08 W=2.5e-07 +MM12 a_17_6# D gnd gnd NMOS_VTG L=5e-08 W=2.5e-07 +MM11 Q a_66_6# vdd vdd PMOS_VTG L=5e-08 W=1e-06 +MM9 vdd Q a_76_84# vdd PMOS_VTG L=5e-08 W=2.5e-07 MM8 a_76_84# clk a_66_6# vdd PMOS_VTG L=5e-08 W=2.5e-07 MM7 a_66_6# a_2_6# a_61_74# vdd PMOS_VTG L=5e-08 W=5e-07 MM6 a_61_74# a_34_4# vdd vdd PMOS_VTG L=5e-08 W=5e-07 @@ -26,16 +26,16 @@ MM5 a_34_4# a_22_6# vdd vdd PMOS_VTG L=5e-08 W=5e-07 MM4 vdd a_34_4# a_31_74# vdd PMOS_VTG L=5e-08 W=5e-07 MM3 a_31_74# a_2_6# a_22_6# vdd PMOS_VTG L=5e-08 W=5e-07 MM2 a_22_6# clk a_17_74# vdd PMOS_VTG L=5e-08 W=5e-07 -MM1 a_17_74# d vdd vdd PMOS_VTG L=5e-08 W=5e-07 +MM1 a_17_74# D vdd vdd PMOS_VTG L=5e-08 W=5e-07 * c_9 a_66_6# 0 0.271997f * c_20 clk 0 0.350944f -* c_27 q 0 0.202617f +* c_27 Q 0 0.202617f * c_32 a_76_84# 0 0.0210573f * c_38 a_76_6# 0 0.0204911f * c_45 a_34_4# 0 0.172306f * c_55 a_2_6# 0 0.283119f * c_59 a_22_6# 0 0.157312f -* c_64 d 0 0.0816386f +* c_64 D 0 0.0816386f * c_73 gnd 0 0.254131f * c_81 vdd 0 0.23624f * diff --git a/technology/scn3me_subm/gds_lib/dff.gds b/technology/scn3me_subm/gds_lib/dff.gds index 679792f4c0996808545cbe0dcc2d0a0070d5ac80..b96235c7500aba5314ed95369b44d5000c60b5ff 100644 GIT binary patch literal 16622 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

*svc zD}JHhn9iSZSVy*-`HRw1?Wa%YvEB5G(l6v^JA1`1^hEnPKkz$4m}hJpa{l6Yl-~IM zP^*8{&;7dj#BkjU`R%y}?ND4%I+*OgwqBr)_Wl+16QzTF`MKX={l$L$wqNTJztFFa z$7jD|9Fpy3{}-jF+F$jv-Smt7`q|E2@e94){*mhX?e^oo?Z7}Mp8{{KQ2LHq{uO`t z?)H@D7PKSVhxt5kbI@_!>is*tNOFd^^1V4`Z5hxvu z#7BSmyZ4hbFJq#8e@Xho@u;8oYZ_}NIWrynfzrXKpY30dA0yh%d0@RLeK_uC`$pg8 z+d2M%k1t9GlkqRP&Bq@<>+2^<2c!P%89Z-%7Wsp7TYdXQ>0s2)yo)%$$8}!C{})5M zlJOtFd-q%50}Eg9O9!Lz9ojx}2K^pny?Fmc>0s2Kop5eB*FDhcjXi)U9gO-JH^csm z~p5bNCIvugXz_4E{GJD{xoj40E zCpl~6PnMLPnmzdSa{2(W24@cXJ0VI3quFPF3A-I|JyrmIJr->j@OZ@x)>0f$eSh{cRre6^(Xc>bstW?!C1($CdX zl%Dc)_38W;Z3gZBWA+rKgYoub*U0m@3#E^5Z$#-yKl0{k$NZ;u`}{@eU^G7S=6NK2 z%wLqA@-uIqN7BdDLzJHKGjE|wVhE=H<0mL-zg~_H2-4qZ+GFkhO7U(k1XEZ!b*zj z(|vEe?d)^>M{36CLMU>7b*Z#=ox{oM0$&LL4d+xv;q>rZZV z{|R^=h99)O7xsRl^v3^%>;bp=Roc~MClWW`0%ZI&HGoQ2K0;4!Fc=OUwPL1SKZWS6=V^ zqI59nU-6{(kG;|RMd@JF&ozhjGoo&`_Y$Qi>PH{zM6z!5i_%l|qmOm6>!5!0vwo!X zRQ>2txqK{pe@?Na?BianG^*L5v}A1p9yPJw)kXwEpxB-|79s zFL{4K>3636LpON;&@a5dp!6Hk{$+grLOYgy&-)8XzbftT&U=6NE8bsF`h48a`ImJf zSvRgfqV!b#=wtnis2}~TpHX_Ee)O?^M%0f!*3T$CQ9t@vKO^c#AM0n7o~R#vte+9} zqmT77N>9}f^UvDL;3ppeF@F`5ep#aa@J(>uC9&V5zo7JeY5(NS-aq*p?=L9*=Cpqu z-W)Ohx>vlvp!E8iquTt>am)OT$e-hu`5UDt@~4ma8<9VK%-<+Ikw1OR--!I_WBx|z ziTvqf{zl|aAM-a#Pvp;W%lwVVoAVFzH%d?BPapF)B5(SbzfpQ3fBKle5qZTc!#wYJXLZw=wQ-6$N3Ka`J237lnzGyd}e1H zlJWV>E=o_uHy`5Lvp?e7vwtAthvU)s>^B>>q21)ye7`9ueOtW!^ljYl{TrY4{({o? z$NjuNjBiAI-ap1SN>9Y6kMWI&PaoqOrKjR!-n956;&T2j$oT$vw0=Bp@kzv`zaZoL z<5557Eygz@KIbjQH%d?BPaoqO5uZNBH%hPPKU#Z!!k%;dQM40WyB&4QN=gT-?LW`Y zzfQF0AI>-Mw*#evQNO)=eh{8k*!P_*$^A<>9`)P1W9~n(_pyEFLnUqh3B9rZth7J8 zJ3bcpSLeT=iqen8+s}8t*#Z2JzeN6{6-uvvd-zke{)kxoUxRbU%AfNZN9-C4yB2>9{v}cSrNP>f@4=pO zZ~yH$fz+E{qWG6lQ@<+Pv1?~KmtNOkJtp@I)(+NV&~~sMgSI34HolEqU)JNw-HWdW v|LS$_2ZPsR)9Jz5!Fp`mF<3j;KL%|F`$w;KU`c9Y8hZWT>lOIFtiXQ(77yGn literal 16384 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 Date: Fri, 20 Apr 2018 17:09:15 -0700 Subject: [PATCH 63/70] Divide index --- compiler/modules/sense_amp_array.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/modules/sense_amp_array.py b/compiler/modules/sense_amp_array.py index 6658a093..03c13a95 100644 --- a/compiler/modules/sense_amp_array.py +++ b/compiler/modules/sense_amp_array.py @@ -65,7 +65,7 @@ class sense_amp_array(design.design): inst = self.add_inst(name=name, mod=self.amp, offset=amp_position) - self.connect_inst(["bl[{0}]".format(i),"br[{0}]".format(i), + self.connect_inst(["bl[{0}]".format(i/self.words_per_row),"br[{0}]".format(i/self.words_per_row), "data[{0}]".format(i/self.words_per_row), "en", "vdd", "gnd"]) From cd502895c4f8d65cec4c23965c37f1f249df5818 Mon Sep 17 00:00:00 2001 From: Matt Guthaus Date: Mon, 23 Apr 2018 08:48:50 -0700 Subject: [PATCH 64/70] Undoing last change. --- compiler/modules/sense_amp_array.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/modules/sense_amp_array.py b/compiler/modules/sense_amp_array.py index 03c13a95..763435c9 100644 --- a/compiler/modules/sense_amp_array.py +++ b/compiler/modules/sense_amp_array.py @@ -65,7 +65,8 @@ class sense_amp_array(design.design): inst = self.add_inst(name=name, mod=self.amp, offset=amp_position) - self.connect_inst(["bl[{0}]".format(i/self.words_per_row),"br[{0}]".format(i/self.words_per_row), + self.connect_inst(["bl[{0}]".format(i), + "br[{0}]".format(i), "data[{0}]".format(i/self.words_per_row), "en", "vdd", "gnd"]) From 269d553857871de3ca324808504302b1f8db421c Mon Sep 17 00:00:00 2001 From: Matt Guthaus Date: Mon, 23 Apr 2018 09:14:18 -0700 Subject: [PATCH 65/70] Move sense amp to tri gate routing to M3... not ideal. --- compiler/modules/bank.py | 36 ++++-------------- technology/freepdk45/gds_lib/tri_gate.gds | Bin 12288 -> 12288 bytes technology/scn3me_subm/gds_lib/tri_gate.gds | Bin 4832 -> 4576 bytes .../scn3me_subm/gds_lib/write_driver.gds | Bin 11740 -> 11804 bytes technology/scn3me_subm/mag_lib/tri_gate.mag | 14 +------ .../scn3me_subm/mag_lib/write_driver.mag | 7 ++-- 6 files changed, 13 insertions(+), 44 deletions(-) diff --git a/compiler/modules/bank.py b/compiler/modules/bank.py index 24287eb1..e781d9a7 100644 --- a/compiler/modules/bank.py +++ b/compiler/modules/bank.py @@ -106,8 +106,6 @@ class bank(design.design): self.route_bank_select() self.route_vdd_gnd() - #self.route_vdd_supply() - #self.route_gnd_supply() def add_modules(self): """ Add modules. The order should not matter! """ @@ -619,34 +617,14 @@ class bank(design.design): # Connection of data_out of sense amp to data_in tri_gate_in = self.tri_gate_array_inst.get_pin("in[{}]".format(i)).lc() sa_data_out = self.sense_amp_array_inst.get_pin("data[{}]".format(i)).bc() - - self.add_path("metal2",[sa_data_out,tri_gate_in]) - # # if we need a bend or not - # if tri_gate_in.x-sa_data_out.x>self.m2_pitch: - # # We'll connect to the bottom of the SA pin - # bendX = sa_data_out.x - # else: - # # We'll connect to the left of the SA pin - # sa_data_out = self.sense_amp_array_inst.get_pin("data[{}]".format(i)).lc() - # bendX = tri_gate_in.x - 3*self.m3_width - # bendY = tri_gate_in.y - 2*self.m2_width - - # # Connection point of M2 and M3 paths, below the tri gate and - # # to the left of the tri gate input - # bend = vector(bendX, bendY) - - # # Connect an M2 path to the gate - # mid3 = [tri_gate_in.x, bendY] # guarantee down then left - # self.add_path("metal2", [bend, mid3, tri_gate_in]) - - # # connect up then right to sense amp - # mid1 = vector(bendX,sa_data_out.y) - # self.add_path("metal3", [bend, mid1, sa_data_out]) - - - # offset = bend - vector([0.5*drc["minwidth_metal3"]] * 2) - # self.add_via(("metal2", "via2", "metal3"),offset) + self.add_via_center(layers=("metal2", "via2", "metal3"), + offset=tri_gate_in, + rotate=90) + self.add_via_center(layers=("metal2", "via2", "metal3"), + offset=sa_data_out, + rotate=90) + self.add_path("metal3",[sa_data_out,tri_gate_in]) def route_tri_gate_out(self): """ Metal 3 routing of tri_gate output data """ diff --git a/technology/freepdk45/gds_lib/tri_gate.gds b/technology/freepdk45/gds_lib/tri_gate.gds index 4879c9ef4459964c73485a36d806b8dbeb0f9d16..aca2ac0d43cf01eedac22066fdd083242f6ad997 100644 GIT binary patch delta 101 zcmZojXh@hK?JUl~$-u#2$-u+JmXey5SejG9z#ziRYNv2y_R`0}-z=44#4q@+dB-5b z%EZ9Wz{1_lNl0cNP-L}*kx%Vx}np|KolBhVm_>zJT4 OBUGHRe6xz?9aaET2P9Yk diff --git a/technology/scn3me_subm/gds_lib/tri_gate.gds b/technology/scn3me_subm/gds_lib/tri_gate.gds index 2c0e3aceef530be446cc7b68741d17430b672ebd..b3d696d0e71fc607340d78526fa569e1a10d56cf 100644 GIT binary patch delta 130 zcmaE$`aoHUfsKKQftf*uk%^&n@6xKJ)*TLv~hCI$uu z9RX$r2B8BC4D1{X45AVUnlk|+4x`yQHZS9nVpZa|VPG(Q!N4Hqf}pKtFff3`A@t-& z{7GC~JrE^aJ(K+e#F&6ont<=*&HRE&talg~#0wZ0U^Gaj;1mW17|nWTvYLQi5J(y% u45NW=Wf25opflNcnHcPl-7k;g=z9EU7N}4bVa0Ofo5-A!oVTPmY$cwz`!C1#Oy%K G!TuI+zvGLn5FzgDMJV7^(jh%skg@pkC?p7_a diff --git a/technology/scn3me_subm/mag_lib/tri_gate.mag b/technology/scn3me_subm/mag_lib/tri_gate.mag index da973d0b..a393074b 100644 --- a/technology/scn3me_subm/mag_lib/tri_gate.mag +++ b/technology/scn3me_subm/mag_lib/tri_gate.mag @@ -1,6 +1,6 @@ magic tech scmos -timestamp 1524065602 +timestamp 1524499924 << nwell >> rect -2 45 38 73 << pwell >> @@ -84,18 +84,8 @@ rect 15 46 19 50 rect 25 34 29 38 rect 24 19 28 23 << metal2 >> -rect 13 46 15 50 rect 15 34 25 38 -rect 15 9 19 34 -rect 19 5 20 9 -rect 15 0 19 5 -<< m3contact >> -rect 15 5 19 9 -<< metal3 >> -rect 14 9 20 10 -rect 14 5 15 9 -rect 19 5 20 9 -rect 14 4 20 5 +rect 15 0 19 34 << m3p >> rect 0 0 34 73 << labels >> diff --git a/technology/scn3me_subm/mag_lib/write_driver.mag b/technology/scn3me_subm/mag_lib/write_driver.mag index 5e80eff9..80e09d11 100644 --- a/technology/scn3me_subm/mag_lib/write_driver.mag +++ b/technology/scn3me_subm/mag_lib/write_driver.mag @@ -1,6 +1,6 @@ magic tech scmos -timestamp 1523920689 +timestamp 1524499497 << nwell >> rect -3 101 37 138 rect -3 0 37 51 @@ -167,6 +167,7 @@ rect 32 181 33 185 rect 13 169 16 177 rect 13 165 15 169 rect 4 148 8 163 +rect 12 157 15 161 rect 12 156 16 157 rect 12 148 16 152 rect 4 132 8 144 @@ -197,7 +198,7 @@ rect 11 24 36 28 << m2contact >> rect 10 192 14 196 rect 20 189 24 193 -rect 11 157 15 161 +rect 23 153 27 157 rect 16 118 20 122 rect 26 86 30 90 rect 19 64 23 68 @@ -217,7 +218,7 @@ rlabel metal2 12 200 12 200 5 bl rlabel metal2 22 200 22 200 5 br rlabel m2contact 21 66 21 66 1 gnd rlabel m2contact 28 88 28 88 1 gnd -rlabel m2contact 13 159 13 159 1 gnd rlabel m2contact 21 33 21 33 1 vdd rlabel m2contact 18 120 18 120 1 vdd +rlabel m2contact 25 155 25 155 1 gnd << end >> From e04f53dc27c7ec9ed7cb58cbceef9fd4983c8eb6 Mon Sep 17 00:00:00 2001 From: Matt Guthaus Date: Mon, 23 Apr 2018 09:18:34 -0700 Subject: [PATCH 66/70] Rotate via --- compiler/modules/bank.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/compiler/modules/bank.py b/compiler/modules/bank.py index e781d9a7..a7a1b138 100644 --- a/compiler/modules/bank.py +++ b/compiler/modules/bank.py @@ -619,11 +619,9 @@ class bank(design.design): sa_data_out = self.sense_amp_array_inst.get_pin("data[{}]".format(i)).bc() self.add_via_center(layers=("metal2", "via2", "metal3"), - offset=tri_gate_in, - rotate=90) + offset=tri_gate_in) self.add_via_center(layers=("metal2", "via2", "metal3"), - offset=sa_data_out, - rotate=90) + offset=sa_data_out) self.add_path("metal3",[sa_data_out,tri_gate_in]) def route_tri_gate_out(self): From 85b7b73903753f423ef44284984155e60d78d994 Mon Sep 17 00:00:00 2001 From: Matt Guthaus Date: Mon, 23 Apr 2018 10:19:26 -0700 Subject: [PATCH 67/70] Flip sense amp y axis --- technology/freepdk45/gds_lib/sense_amp.gds | Bin 16384 -> 16384 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/technology/freepdk45/gds_lib/sense_amp.gds b/technology/freepdk45/gds_lib/sense_amp.gds index b40b4b866f3ff09d38e387da265e6bff2a913db4..c215f793c7811fe0bbf3a9733e6327cbfaaba047 100644 GIT binary patch literal 16384 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 literal 16384 zcmeI3dx%|E8O8TK=iZx{%w+QDWG0iDBr}twC6cs5Nr-7{LPU!XDy5yDDr z=VoJmoc~tmX5Zq;xb1B|J}DiH#CI-R!S;J@dIbJgoD-$T+m9-I%KJ(B^5Z4x567$V z^Je{W=8rl~J?rZyO3&;0SNzEPpNKi@*+%{Hk0OUa=_xi?IeuEz`# z{61Y$I#}&LHNU$S^AG&wJpAroC8dK=e|C>^m=hhj=F5n`tfX}Cf97}Re0-AeTc0V( z_~Cdo{!;s!`Cll$)$g%L{er&Yv3ULL`Z$j~FaMyY{Q1imzejQ3z>zWZos%V{gVFj8 z>dzkV@kz$dSC?e`a6B4+sr}9TFBG5och~i&Qwey)Gj{KNI5@wvXK zPF8pLMd|&vpFZX<(%&O~d%)+Hn!h&wd(6K*=AW9s+W%O$KKg&n-@Jc))W1{B|015h z>VEV)J?Hd#{$l$Y&tEk^^VdGR*Zw~oulApspV#L)N!q@lvHuLmqkdjr>#X)YqI9t8 zAFkFfzs|XdA7S1A`5c|&N0bgm{jHyQKS^JrIJX6RrwrVRy;F{N z2BLH@>SzDpeIohZjQvNH4krEf+}^`49ZdQahw}jAi_%l^dEYwD-#@!wxPPK_FdE

*svc zD}JHhn9iSZSVy*-`HRw1?Wa%YvEB5G(l6v^JA1`1^hEnPKkz$4m}hJpa{l6Yl-~IM zP^*8{&;7dj#BkjU`R%y}?ND4%I+*OgwqBr)_Wl+16QzTF`MKX={l$L$wqNTJztFFa z$7jD|9Fpy3{}-jF+F$jv-Smt7`q|E2@e94){*mhX?e^oo?Z7}Mp8{{KQ2LHq{uO`t z?)H@D7PKSVhxt5kbI@_!>is*tNOFd^^1V4`Z5hxvu z#7BSmyZ4hbFJq#8e@Xho@u;8oYZ_}NIWrynfzrXKpY30dA0yh%d0@RLeK_uC`$pg8 z+d2M%k1t9GlkqRP&Bq@<>+2^<2c!P%89Z-%7Wsp7TYdXQ>0s2)yo)%$$8}!C{})5M zlJOtFd-q%50}Eg9O9!Lz9ojx}2K^pny?Fmc>0s2Kop5eB*FDhcjXi)U9gO-JH^csm z~p5bNCIvugXz_4E{GJD{xoj40E zCpl~6PnMLPnmzdSa{2(W24@cXJ0VI3quFPF3A-I|JyrmIJr->j@OZ@x)>0f$eSh{cRre6^(Xc>bstW?!C1($CdX zl%Dc)_38W;Z3gZBWA+rKgYoub*U0m@3#E^5Z$#-yKl0{k$NZ;u`}{@eU^G7S=6NK2 z%wLqA@-uIqN7BdDLzJHKGjE|wVhE=H<0mL-zg~_H2-4qZ+GFkhO7U(k1XEZ!b*zj z(|vEe?d)^>M{36CLMU>7b*Z#=ox{oM0$&LL4d+xv;q>rZZV z{|R^=h99)O7xsRl^v3^%>;bp=Roc~MClWW`0%ZI&HGoQ2K0;4!Fc=OUwPL1SKZWS6=V^ zqI59nU-6{(kG;|RMd@JF&ozhjGoo&`_Y$Qi>PH{zM6z!5i_%l|qmOm6>!5!0vwo!X zRQ>2txqK{pe@?Na?BianG^*L5v}A1p9yPJw)kXwEpxB-|79s zFL{4K>3636LpON;&@a5dp!6Hk{$+grLOYgy&-)8XzbftT&U=6NE8bsF`h48a`ImJf zSvRgfqV!b#=wtnis2}~TpHX_Ee)O?^M%0f!*3T$CQ9t@vKO^c#AM0n7o~R#vte+9} zqmT77N>9}f^UvDL;3ppeF@F`5ep#aa@J(>uC9&V5zo7JeY5(NS-aq*p?=L9*=Cpqu z-W)Ohx>vlvp!E8iquTt>am)OT$e-hu`5UDt@~4ma8<9VK%-<+Ikw1OR--!I_WBx|z ziTvqf{zl|aAM-a#Pvp;W%lwVVoAVFzH%d?BPapF)B5(SbzfpQ3fBKle5qZTc!#wYJXLZw=wQ-6$N3Ka`J237lnzGyd}e1H zlJWV>E=o_uHy`5Lvp?e7vwtAthvU)s>^B>>q21)ye7`9ueOtW!^ljYl{TrY4{({o? z$NjuNjBiAI-ap1SN>9Y6kMWI&PaoqOrKjR!-n956;&T2j$oT$vw0=Bp@kzv`zaZoL z<5557Eygz@KIbjQH%d?BPaoqO5uZNBH%hPPKU#Z!!k%;dQM40WyB&4QN=gT-?LW`Y zzfQF0AI>-Mw*#evQNO)=eh{8k*!P_*$^A<>9`)P1W9~n(_pyEFLnUqh3B9rZth7J8 zJ3bcpSLeT=iqen8+s}8t*#Z2JzeN6{6-uvvd-zke{)kxoUxRbU%AfNZN9-C4yB2>9{v}cSrNP>f@4=pO zZ~yH$fz+E{qWG6lQ@<+Pv1?~KmtNOkJtp@I)(+NV&~~sMgSI34HolEqU)JNw-HWdW v|LS$_2ZPsR)9Jz5!Fp`mF<3j;KL%|F`$w;KU`c9Y8hZWT>lOIFtiXQ(77yGn From 875eb94a34af63104ac436a9c864b3b367a0e411 Mon Sep 17 00:00:00 2001 From: Matt Guthaus Date: Mon, 23 Apr 2018 12:17:16 -0700 Subject: [PATCH 68/70] Move bank select below row decoder, col mux, or col decoder. --- compiler/modules/bank.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/compiler/modules/bank.py b/compiler/modules/bank.py index a7a1b138..e0e33a14 100644 --- a/compiler/modules/bank.py +++ b/compiler/modules/bank.py @@ -421,8 +421,11 @@ class bank(design.design): return x_off = -(self.row_decoder.width + self.central_bus_width + self.wordline_driver.width) - # extra space to allow vias - y_off = self.min_y_offset + 2*self.supply_rail_pitch + self.m1_space + if self.col_addr_size > 0: + y_off = min(self.col_decoder_inst.by(), self.col_mux_array_inst.by()) + else: + y_off = self.row_decoder_inst.by() + y_off -= (self.bank_select.height + drc["well_to_well"]) self.bank_select_pos = vector(x_off,y_off) self.bank_select_inst = self.add_inst(name="bank_select", mod=self.bank_select, @@ -466,11 +469,7 @@ class bank(design.design): def route_bank_select(self): """ Route the bank select logic. """ for input_name in self.input_control_signals+["bank_sel"]: - in_pos = self.bank_select_inst.get_pin(input_name).lc() - self.add_layout_pin_segment_center(text=input_name, - layer="metal3", - start=vector(self.left_gnd_x_offset,in_pos.y), - end=in_pos) + self.copy_layout_pin(self.bank_select_inst, input_name) for gated_name in self.control_signals: # Connect the inverter output to the central bus From 7b5791b0e996920920201ded06bc7940aaab05ae Mon Sep 17 00:00:00 2001 From: Matt Guthaus Date: Wed, 9 May 2018 08:29:23 -0700 Subject: [PATCH 69/70] Change tolerance of tests to a big value. Update tests. --- compiler/tests/23_lib_sram_prune_test.py | 2 +- compiler/tests/23_lib_sram_test.py | 2 +- .../sram_2_16_1_freepdk45_TT_1p0V_25C.lib | 62 ++++++++--------- ...am_2_16_1_freepdk45_TT_1p0V_25C_pruned.lib | 66 +++++++++---------- .../sram_2_16_1_scn3me_subm_TT_5p0V_25C.lib | 64 +++++++++--------- ..._2_16_1_scn3me_subm_TT_5p0V_25C_pruned.lib | 64 +++++++++--------- 6 files changed, 130 insertions(+), 130 deletions(-) diff --git a/compiler/tests/23_lib_sram_prune_test.py b/compiler/tests/23_lib_sram_prune_test.py index c8b7218f..d2b54b1f 100644 --- a/compiler/tests/23_lib_sram_prune_test.py +++ b/compiler/tests/23_lib_sram_prune_test.py @@ -51,7 +51,7 @@ class lib_test(openram_test): newname = filename.replace(".lib","_pruned.lib") libname = "{0}/{1}".format(OPTS.openram_temp,filename) golden = "{0}/golden/{1}".format(os.path.dirname(os.path.realpath(__file__)),newname) - self.isapproxdiff(libname,golden,0.15) + self.isapproxdiff(libname,golden,0.40) OPTS.analytical_delay = True reload(characterizer) diff --git a/compiler/tests/23_lib_sram_test.py b/compiler/tests/23_lib_sram_test.py index 74568940..5d3aceeb 100644 --- a/compiler/tests/23_lib_sram_test.py +++ b/compiler/tests/23_lib_sram_test.py @@ -50,7 +50,7 @@ class lib_test(openram_test): for filename in lib_files: libname = "{0}/{1}".format(OPTS.openram_temp,filename) golden = "{0}/golden/{1}".format(os.path.dirname(os.path.realpath(__file__)),filename) - self.isapproxdiff(libname,golden,0.15) + self.isapproxdiff(libname,golden,0.40) OPTS.analytical_delay = True OPTS.trim_netlist = True diff --git a/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C.lib b/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C.lib index a4e95abc..d65b5ab0 100644 --- a/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C.lib +++ b/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C.lib @@ -82,7 +82,7 @@ cell (sram_2_16_1_freepdk45){ leakage_power () { when : "CSb"; - value : 0.00088149731; + value : 0.0008128352; } cell_leakage_power : 0; bus(DATA){ @@ -103,9 +103,9 @@ cell (sram_2_16_1_freepdk45){ timing_type : setup_rising; related_pin : "clk"; rise_constraint(CONSTRAINT_TABLE) { - values("0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021"); + values("0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027"); } fall_constraint(CONSTRAINT_TABLE) { values("0.009, 0.009, 0.015",\ @@ -137,19 +137,19 @@ cell (sram_2_16_1_freepdk45){ "0.061, 0.062, 0.069"); } cell_fall(CELL_TABLE) { - values("0.429, 0.43, 0.439",\ - "0.429, 0.431, 0.439",\ - "0.435, 0.436, 0.446"); + values("0.067, 0.068, 0.076",\ + "0.067, 0.068, 0.077",\ + "0.073, 0.074, 0.082"); } rise_transition(CELL_TABLE) { values("0.013, 0.015, 0.026",\ "0.013, 0.015, 0.026",\ - "0.013, 0.015, 0.026"); + "0.014, 0.015, 0.026"); } fall_transition(CELL_TABLE) { - values("0.029, 0.031, 0.044",\ - "0.029, 0.031, 0.044",\ - "0.029, 0.031, 0.044"); + values("0.023, 0.024, 0.037",\ + "0.023, 0.024, 0.037",\ + "0.024, 0.024, 0.037"); } } } @@ -165,9 +165,9 @@ cell (sram_2_16_1_freepdk45){ timing_type : setup_rising; related_pin : "clk"; rise_constraint(CONSTRAINT_TABLE) { - values("0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021"); + values("0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027"); } fall_constraint(CONSTRAINT_TABLE) { values("0.009, 0.009, 0.015",\ @@ -199,9 +199,9 @@ cell (sram_2_16_1_freepdk45){ timing_type : setup_rising; related_pin : "clk"; rise_constraint(CONSTRAINT_TABLE) { - values("0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021"); + values("0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027"); } fall_constraint(CONSTRAINT_TABLE) { values("0.009, 0.009, 0.015",\ @@ -232,9 +232,9 @@ cell (sram_2_16_1_freepdk45){ timing_type : setup_rising; related_pin : "clk"; rise_constraint(CONSTRAINT_TABLE) { - values("0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021"); + values("0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027"); } fall_constraint(CONSTRAINT_TABLE) { values("0.009, 0.009, 0.015",\ @@ -265,9 +265,9 @@ cell (sram_2_16_1_freepdk45){ timing_type : setup_rising; related_pin : "clk"; rise_constraint(CONSTRAINT_TABLE) { - values("0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021"); + values("0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027"); } fall_constraint(CONSTRAINT_TABLE) { values("0.009, 0.009, 0.015",\ @@ -298,19 +298,19 @@ cell (sram_2_16_1_freepdk45){ internal_power(){ when : "!CSb & clk & !WEb"; rise_power(scalar){ - values("0.0173748762222"); + values("0.0175059861111"); } fall_power(scalar){ - values("0.0173748762222"); + values("0.0175059861111"); } } internal_power(){ when : "!CSb & !clk & WEb"; rise_power(scalar){ - values("0.0261209913889"); + values("0.0218644166667"); } fall_power(scalar){ - values("0.0261209913889"); + values("0.0218644166667"); } } internal_power(){ @@ -326,20 +326,20 @@ cell (sram_2_16_1_freepdk45){ timing_type :"min_pulse_width"; related_pin : clk; rise_constraint(scalar) { - values("0.4295"); + values("0.117"); } fall_constraint(scalar) { - values("0.4295"); + values("0.117"); } } timing(){ timing_type :"minimum_period"; related_pin : clk; rise_constraint(scalar) { - values("0.859"); + values("0.234"); } fall_constraint(scalar) { - values("0.859"); + values("0.234"); } } } diff --git a/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C_pruned.lib b/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C_pruned.lib index 382ce62f..c856cf58 100644 --- a/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C_pruned.lib +++ b/compiler/tests/golden/sram_2_16_1_freepdk45_TT_1p0V_25C_pruned.lib @@ -82,7 +82,7 @@ cell (sram_2_16_1_freepdk45){ leakage_power () { when : "CSb"; - value : 0.00088149731; + value : 0.0008128352; } cell_leakage_power : 0; bus(DATA){ @@ -103,9 +103,9 @@ cell (sram_2_16_1_freepdk45){ timing_type : setup_rising; related_pin : "clk"; rise_constraint(CONSTRAINT_TABLE) { - values("0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021"); + values("0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027"); } fall_constraint(CONSTRAINT_TABLE) { values("0.009, 0.009, 0.015",\ @@ -133,23 +133,23 @@ cell (sram_2_16_1_freepdk45){ timing_type : falling_edge; cell_rise(CELL_TABLE) { values("0.054, 0.055, 0.061",\ - "0.055, 0.055, 0.062",\ - "0.06, 0.061, 0.067"); + "0.055, 0.056, 0.062",\ + "0.06, 0.061, 0.068"); } cell_fall(CELL_TABLE) { - values("0.425, 0.426, 0.436",\ - "0.426, 0.427, 0.436",\ - "0.432, 0.433, 0.442"); + values("0.066, 0.067, 0.075",\ + "0.067, 0.068, 0.076",\ + "0.072, 0.073, 0.082"); } rise_transition(CELL_TABLE) { values("0.013, 0.014, 0.026",\ - "0.013, 0.014, 0.026",\ + "0.013, 0.015, 0.026",\ "0.013, 0.015, 0.026"); } fall_transition(CELL_TABLE) { - values("0.027, 0.029, 0.043",\ - "0.027, 0.029, 0.043",\ - "0.027, 0.029, 0.043"); + values("0.023, 0.024, 0.037",\ + "0.023, 0.024, 0.037",\ + "0.024, 0.024, 0.037"); } } } @@ -165,9 +165,9 @@ cell (sram_2_16_1_freepdk45){ timing_type : setup_rising; related_pin : "clk"; rise_constraint(CONSTRAINT_TABLE) { - values("0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021"); + values("0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027"); } fall_constraint(CONSTRAINT_TABLE) { values("0.009, 0.009, 0.015",\ @@ -199,9 +199,9 @@ cell (sram_2_16_1_freepdk45){ timing_type : setup_rising; related_pin : "clk"; rise_constraint(CONSTRAINT_TABLE) { - values("0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021"); + values("0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027"); } fall_constraint(CONSTRAINT_TABLE) { values("0.009, 0.009, 0.015",\ @@ -232,9 +232,9 @@ cell (sram_2_16_1_freepdk45){ timing_type : setup_rising; related_pin : "clk"; rise_constraint(CONSTRAINT_TABLE) { - values("0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021"); + values("0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027"); } fall_constraint(CONSTRAINT_TABLE) { values("0.009, 0.009, 0.015",\ @@ -265,9 +265,9 @@ cell (sram_2_16_1_freepdk45){ timing_type : setup_rising; related_pin : "clk"; rise_constraint(CONSTRAINT_TABLE) { - values("0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021",\ - "0.009, 0.015, 0.021"); + values("0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027",\ + "0.009, 0.015, 0.027"); } fall_constraint(CONSTRAINT_TABLE) { values("0.009, 0.009, 0.015",\ @@ -298,19 +298,19 @@ cell (sram_2_16_1_freepdk45){ internal_power(){ when : "!CSb & clk & !WEb"; rise_power(scalar){ - values("0.0158174252672"); + values("0.0159801855389"); } fall_power(scalar){ - values("0.0158174252672"); + values("0.0159801855389"); } } internal_power(){ when : "!CSb & !clk & WEb"; rise_power(scalar){ - values("0.0181396362394"); + values("0.0171325605389"); } fall_power(scalar){ - values("0.0181396362394"); + values("0.0171325605389"); } } internal_power(){ @@ -326,20 +326,20 @@ cell (sram_2_16_1_freepdk45){ timing_type :"min_pulse_width"; related_pin : clk; rise_constraint(scalar) { - values("0.4295"); + values("0.1125"); } fall_constraint(scalar) { - values("0.4295"); + values("0.1125"); } } timing(){ timing_type :"minimum_period"; related_pin : clk; rise_constraint(scalar) { - values("0.859"); + values("0.225"); } fall_constraint(scalar) { - values("0.859"); + values("0.225"); } } } diff --git a/compiler/tests/golden/sram_2_16_1_scn3me_subm_TT_5p0V_25C.lib b/compiler/tests/golden/sram_2_16_1_scn3me_subm_TT_5p0V_25C.lib index e6adf918..81133459 100644 --- a/compiler/tests/golden/sram_2_16_1_scn3me_subm_TT_5p0V_25C.lib +++ b/compiler/tests/golden/sram_2_16_1_scn3me_subm_TT_5p0V_25C.lib @@ -82,7 +82,7 @@ cell (sram_2_16_1_scn3me_subm){ leakage_power () { when : "CSb"; - value : 0.0011563287; + value : 0.0004764706; } cell_leakage_power : 0; bus(DATA){ @@ -108,9 +108,9 @@ cell (sram_2_16_1_scn3me_subm){ "0.076, 0.076, 0.149"); } fall_constraint(CONSTRAINT_TABLE) { - values("0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027"); + values("0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027"); } } timing(){ @@ -132,24 +132,24 @@ cell (sram_2_16_1_scn3me_subm){ related_pin : "clk"; timing_type : falling_edge; cell_rise(CELL_TABLE) { - values("0.473, 0.519, 0.888",\ - "0.476, 0.522, 0.891",\ - "0.516, 0.56, 0.928"); + values("0.474, 0.52, 0.888",\ + "0.477, 0.522, 0.892",\ + "0.517, 0.561, 0.929"); } cell_fall(CELL_TABLE) { - values("0.582, 0.655, 1.256",\ - "0.585, 0.658, 1.259",\ - "0.625, 0.697, 1.295"); + values("0.582, 0.658, 1.26",\ + "0.586, 0.661, 1.262",\ + "0.626, 0.7, 1.298"); } rise_transition(CELL_TABLE) { - values("0.154, 0.233, 1.086",\ - "0.155, 0.234, 1.086",\ - "0.158, 0.237, 1.086"); + values("0.155, 0.233, 1.087",\ + "0.156, 0.235, 1.086",\ + "0.16, 0.239, 1.086"); } fall_transition(CELL_TABLE) { - values("0.278, 0.359, 1.499",\ - "0.278, 0.361, 1.499",\ - "0.28, 0.367, 1.5"); + values("0.277, 0.356, 1.502",\ + "0.278, 0.358, 1.501",\ + "0.279, 0.363, 1.5"); } } } @@ -170,9 +170,9 @@ cell (sram_2_16_1_scn3me_subm){ "0.076, 0.076, 0.149"); } fall_constraint(CONSTRAINT_TABLE) { - values("0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027"); + values("0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027"); } } timing(){ @@ -204,9 +204,9 @@ cell (sram_2_16_1_scn3me_subm){ "0.076, 0.076, 0.149"); } fall_constraint(CONSTRAINT_TABLE) { - values("0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027"); + values("0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027"); } } timing(){ @@ -237,9 +237,9 @@ cell (sram_2_16_1_scn3me_subm){ "0.076, 0.076, 0.149"); } fall_constraint(CONSTRAINT_TABLE) { - values("0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027"); + values("0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027"); } } timing(){ @@ -270,9 +270,9 @@ cell (sram_2_16_1_scn3me_subm){ "0.076, 0.076, 0.149"); } fall_constraint(CONSTRAINT_TABLE) { - values("0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027"); + values("0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027"); } } timing(){ @@ -298,19 +298,19 @@ cell (sram_2_16_1_scn3me_subm){ internal_power(){ when : "!CSb & clk & !WEb"; rise_power(scalar){ - values("4.91866674167"); + values("4.92665"); } fall_power(scalar){ - values("4.91866674167"); + values("4.92665"); } } internal_power(){ when : "!CSb & !clk & WEb"; rise_power(scalar){ - values("5.72315586111"); + values("5.74515833333"); } fall_power(scalar){ - values("5.72315586111"); + values("5.74515833333"); } } internal_power(){ diff --git a/compiler/tests/golden/sram_2_16_1_scn3me_subm_TT_5p0V_25C_pruned.lib b/compiler/tests/golden/sram_2_16_1_scn3me_subm_TT_5p0V_25C_pruned.lib index db6e203b..b37a777f 100644 --- a/compiler/tests/golden/sram_2_16_1_scn3me_subm_TT_5p0V_25C_pruned.lib +++ b/compiler/tests/golden/sram_2_16_1_scn3me_subm_TT_5p0V_25C_pruned.lib @@ -82,7 +82,7 @@ cell (sram_2_16_1_scn3me_subm){ leakage_power () { when : "CSb"; - value : 0.0011563287; + value : 0.0004764706; } cell_leakage_power : 0; bus(DATA){ @@ -108,9 +108,9 @@ cell (sram_2_16_1_scn3me_subm){ "0.076, 0.076, 0.149"); } fall_constraint(CONSTRAINT_TABLE) { - values("0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027"); + values("0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027"); } } timing(){ @@ -132,24 +132,24 @@ cell (sram_2_16_1_scn3me_subm){ related_pin : "clk"; timing_type : falling_edge; cell_rise(CELL_TABLE) { - values("0.458, 0.503, 0.87",\ - "0.461, 0.505, 0.873",\ - "0.5, 0.544, 0.911"); + values("0.458, 0.504, 0.871",\ + "0.461, 0.506, 0.874",\ + "0.5, 0.544, 0.912"); } cell_fall(CELL_TABLE) { - values("0.573, 0.645, 1.246",\ - "0.576, 0.648, 1.249",\ - "0.616, 0.687, 1.286"); + values("0.573, 0.649, 1.251",\ + "0.577, 0.652, 1.254",\ + "0.618, 0.69, 1.29"); } rise_transition(CELL_TABLE) { - values("0.153, 0.232, 1.084",\ - "0.153, 0.233, 1.084",\ - "0.156, 0.236, 1.084"); + values("0.153, 0.233, 1.085",\ + "0.154, 0.234, 1.084",\ + "0.158, 0.237, 1.084"); } fall_transition(CELL_TABLE) { - values("0.277, 0.36, 1.499",\ - "0.277, 0.362, 1.499",\ - "0.278, 0.37, 1.5"); + values("0.276, 0.356, 1.5",\ + "0.277, 0.357, 1.5",\ + "0.278, 0.363, 1.5"); } } } @@ -170,9 +170,9 @@ cell (sram_2_16_1_scn3me_subm){ "0.076, 0.076, 0.149"); } fall_constraint(CONSTRAINT_TABLE) { - values("0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027"); + values("0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027"); } } timing(){ @@ -204,9 +204,9 @@ cell (sram_2_16_1_scn3me_subm){ "0.076, 0.076, 0.149"); } fall_constraint(CONSTRAINT_TABLE) { - values("0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027"); + values("0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027"); } } timing(){ @@ -237,9 +237,9 @@ cell (sram_2_16_1_scn3me_subm){ "0.076, 0.076, 0.149"); } fall_constraint(CONSTRAINT_TABLE) { - values("0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027"); + values("0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027"); } } timing(){ @@ -270,9 +270,9 @@ cell (sram_2_16_1_scn3me_subm){ "0.076, 0.076, 0.149"); } fall_constraint(CONSTRAINT_TABLE) { - values("0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027",\ - "0.039, 0.039, 0.027"); + values("0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027",\ + "0.033, 0.039, 0.027"); } } timing(){ @@ -298,19 +298,19 @@ cell (sram_2_16_1_scn3me_subm){ internal_power(){ when : "!CSb & clk & !WEb"; rise_power(scalar){ - values("4.39065104738"); + values("4.42361814306"); } fall_power(scalar){ - values("4.39065104738"); + values("4.42361814306"); } } internal_power(){ when : "!CSb & !clk & WEb"; rise_power(scalar){ - values("5.00353945572"); + values("4.97118480973"); } fall_power(scalar){ - values("5.00353945572"); + values("4.97118480973"); } } internal_power(){ From 0e35937da55be11b4144001bd195705a35a4e199 Mon Sep 17 00:00:00 2001 From: Matt Guthaus Date: Fri, 11 May 2018 09:15:29 -0700 Subject: [PATCH 70/70] Commit local changes. Forgot what the status is. --- compiler/globals.py | 11 ++- compiler/modules/bitcell_array.py | 6 +- compiler/modules/replica_bitline.py | 18 +++- compiler/sram.py | 137 ++++++---------------------- 4 files changed, 59 insertions(+), 113 deletions(-) diff --git a/compiler/globals.py b/compiler/globals.py index 0ea0a7b5..39a3f28a 100644 --- a/compiler/globals.py +++ b/compiler/globals.py @@ -208,7 +208,16 @@ def cleanup_paths(): debug.info(0,"Preserving temp directory: {}".format(OPTS.openram_temp)) return if os.path.exists(OPTS.openram_temp): - shutil.rmtree(OPTS.openram_temp, ignore_errors=True) + # This annoyingly means you have to re-cd into the directory each debug iteration + #shutil.rmtree(OPTS.openram_temp, ignore_errors=True) + contents = [os.path.join(OPTS.openram_temp, i) for i in os.listdir(OPTS.openram_temp)] + for i in contents: + if os.path.isfile(i) or os.path.islink(i): + os.remove(i) + else: + shutil.rmtree(i) + + def setup_paths(): """ Set up the non-tech related paths. """ diff --git a/compiler/modules/bitcell_array.py b/compiler/modules/bitcell_array.py index 5c6e04a5..4f2a06c3 100644 --- a/compiler/modules/bitcell_array.py +++ b/compiler/modules/bitcell_array.py @@ -33,8 +33,10 @@ class bitcell_array(design.design): self.add_pins() self.create_layout() self.add_layout_pins() - - self.offset_all_coordinates() + + # We don't offset this because we need to align + # the replica bitcell in the control logic + #self.offset_all_coordinates() self.DRC_LVS() diff --git a/compiler/modules/replica_bitline.py b/compiler/modules/replica_bitline.py index 63762d43..004eae0b 100644 --- a/compiler/modules/replica_bitline.py +++ b/compiler/modules/replica_bitline.py @@ -24,9 +24,6 @@ class replica_bitline(design.design): g = reload(__import__(OPTS.replica_bitcell)) self.mod_replica_bitcell = getattr(g, OPTS.replica_bitcell) - c = reload(__import__(OPTS.bitcell)) - self.mod_bitcell = getattr(c, OPTS.bitcell) - for pin in ["en", "out", "vdd", "gnd"]: self.add_pin(pin) self.bitcell_loads = bitcell_loads @@ -137,6 +134,21 @@ class replica_bitline(design.design): self.route_gnd() self.route_access_tx() + def route_vdd_gnd(self): + """ Route all the vdd and gnd pins to the top level """ + def route_vdd_gnd(self): + """ Propagate all vdd/gnd pins up to this level for all modules """ + + # These are the instances that every bank has + top_instances = [self.rbl_inst, + self.rbl_inv_inst, + self.rbc_inst, + self.dc_inst] + + for inst in top_instances: + self.copy_layout_pin(inst, "vdd") + self.copy_layout_pin(inst, "gnd") + def route_access_tx(self): # GATE ROUTE diff --git a/compiler/sram.py b/compiler/sram.py index 439d281a..52631cad 100644 --- a/compiler/sram.py +++ b/compiler/sram.py @@ -517,8 +517,6 @@ class sram(design.design): self.add_via_center(("metal2","via2","metal3"),rail_pos) - self.route_bank_supply_rails(left_banks=[0], bottom_banks=[0,1]) - def route_double_msb_address(self): """ Route two MSB address bits and the bank decoder for 4-bank SRAM """ @@ -738,66 +736,33 @@ class sram(design.design): - def route_bank_supply_rails(self, left_banks, bottom_banks): - """ Create rails at bottom. Connect veritcal rails to top and bottom. """ + def route_vdd_gnd(self): + """ Propagate all vdd/gnd pins up to this level for all modules """ - for i in left_banks: - vdd_pins = self.bank_inst[i].get_pins("vdd") - for vdd_pin in vdd_pins: - if vdd_pin.layer != "metal1": - continue - self.add_layout_pin(text="vdd", - layer=vdd_pin.layer, - offset=vdd_pin.ll(), - height=vdd_pin.height(), - width=self.width) + # These are the instances that every bank has + top_instances = [self.bitcell_array_inst, + self.precharge_array_inst, + self.sense_amp_array_inst, + self.write_driver_array_inst, + self.tri_gate_array_inst, + self.row_decoder_inst, + self.wordline_driver_inst] + # Add these if we use the part... + if self.col_addr_size > 0: + top_instances.append(self.col_decoder_inst) + top_instances.append(self.col_mux_array_inst) + + if self.num_banks > 1: + top_instances.append(self.bank_select_inst) - gnd_pins = self.bank_inst[i].get_pins("gnd") - for gnd_pin in gnd_pins: - if gnd_pin.layer != "metal1": - continue - self.add_layout_pin(text="gnd", - layer=gnd_pin.layer, - offset=gnd_pin.ll(), - height=gnd_pin.height(), - width=self.width) - - - - # route bank vertical rails to bottom - for i in bottom_banks: - vdd_pins = self.bank_inst[i].get_pins("vdd") - for vdd_pin in vdd_pins: - if vdd_pin.layer != "metal2": - continue - # Route from bottom to top - self.add_rect(layer=vdd_pin.layer, - offset=vdd_pin.ll(), - height=self.horz_control_bus_positions["vdd"].y, - width=vdd_pin.width()) - # Add vias at top - rail_pos = vector(vdd_pin.cx(),self.horz_control_bus_positions["vdd"].y) - self.add_via_center(layers=("metal1","via1","metal2"), - offset=rail_pos, - rotate=90, - size=[1,3]) - - gnd_pins = self.bank_inst[i].get_pins("gnd") - for gnd_pin in gnd_pins: - if gnd_pin.layer != "metal2": - continue - # Route from bottom to top - self.add_rect(layer=gnd_pin.layer, - offset=gnd_pin.ll(), - height=self.horz_control_bus_positions["gnd"].y, - width=gnd_pin.width()) - # Add vias at top - rail_pos = vector(gnd_pin.cx(),self.horz_control_bus_positions["gnd"].y) - self.add_via_center(layers=("metal1","via1","metal2"), - offset=rail_pos, - rotate=90, - size=[1,3]) - + + for inst in top_instances: + # Column mux has no vdd + if self.col_addr_size==0 or (self.col_addr_size>0 and inst != self.col_mux_array_inst): + self.copy_layout_pin(inst, "vdd") + # Precharge has no gnd + if inst != self.precharge_array_inst: + self.copy_layout_pin(inst, "gnd") def create_multi_bank_modules(self): @@ -875,7 +840,9 @@ class sram(design.design): temp = [] for i in range(self.word_size): - temp.append("DATA[{0}]".format(i)) + temp.append("DOUT[{0}]".format(i)) + for i in range(self.word_size): + temp.append("DIN[{0}]".format(i)) for i in range(self.bank_addr_size): temp.append("A[{0}]".format(i)) if(self.num_banks > 1): @@ -977,8 +944,8 @@ class sram(design.design): """ for i in range(self.word_size): - self.copy_layout_pin(self.bank_inst, "DATA[{}]".format(i)) - + self.copy_layout_pin(self.bank_inst, "DOUT[{}]".format(i)) + for i in range(self.addr_size): self.copy_layout_pin(self.addr_dff_inst, "din[{}]".format(i),"ADDR[{}]".format(i)) @@ -1045,13 +1012,6 @@ class sram(design.design): rotate=90) - # Expand the ring around the bank to include flops and control logic - bbox_lr = vector(self.control_logic_inst.lx(), self.bank_inst.by() + 2*self.supply_rail_pitch) - bbox_ur = self.bank_inst.ur() - vector(2*self.supply_rail_pitch, 2*self.supply_rail_pitch) - self.add_power_ring([bbox_lr, bbox_ur]) - self.route_single_bank_vdd() - self.route_single_bank_gnd() - # Connect the output of the flops to the bank pins for i in range(self.addr_size): flop_name = "dout[{}]".format(i) @@ -1083,43 +1043,6 @@ class sram(design.design): self.add_wire(("metal1","via1","metal2"),[flop_pin.uc(), mid1_pos, mid2_pos, ctrl_pin.bc()]) - def route_single_bank_vdd(self): - """ Route vdd for the control and dff array """ - - # Route the vdd rails to the LEFT - modules = [ self.control_logic_inst, self.addr_dff_inst] - for inst in modules: - for vdd_pin in inst.get_pins("vdd"): - if vdd_pin.layer != "metal1": - continue - vdd_pos = vdd_pin.rc() - left_rail_pos = vector(self.left_vdd_x_center, vdd_pos.y) - self.add_path("metal1", [left_rail_pos, vdd_pos]) - self.add_via_center(layers=("metal1", "via1", "metal2"), - offset=left_rail_pos, - size = (1,self.supply_vias), - rotate=90) - - - - def route_single_bank_gnd(self): - """ Route gnd for the control and dff array """ - - # Route the gnd rails to the LEFT - modules = [ self.control_logic_inst, self.addr_dff_inst] - for inst in modules: - for gnd_pin in inst.get_pins("gnd"): - if gnd_pin.layer != "metal1": - continue - gnd_pos = gnd_pin.rc() - left_rail_pos = vector(self.left_gnd_x_center, gnd_pos.y) - self.add_path("metal1", [left_rail_pos, gnd_pos]) - self.add_via_center(layers=("metal1", "via1", "metal2"), - offset=left_rail_pos, - size = (1,self.supply_vias), - rotate=90) - - def sp_write(self, sp_name): # Write the entire spice of the object to the file