passing gf180 parameterized gate tests

This commit is contained in:
Jesse Cirimelli-Low 2023-01-20 14:34:27 -08:00 committed by SWalker
parent d18a4f8c7c
commit a904874978
2 changed files with 80 additions and 118 deletions

View File

@ -130,14 +130,14 @@ RUN apt-get install --no-install-recommends -y iverilog
### Magic ### ### Magic ###
#ARG MAGIC_COMMIT=db4fa65bfc096e63954b37b188ea27b90ab31839 #ARG MAGIC_COMMIT=db4fa65bfc096e63954b37b188ea27b90ab31839
#ARG MAGIC_COMMIT=8.3.274 #ARG MAGIC_COMMIT=8.3.274
ARG MAGIC_COMMIT=8.3.311 ARG MAGIC_COMMIT=8.3.363
WORKDIR /root WORKDIR /root
#RUN git clone https://github.com/RTimothyEdwards/magic.git magic #RUN git clone https://github.com/RTimothyEdwards/magic.git magic
RUN git clone git://opencircuitdesign.com/magic magic RUN git clone git://opencircuitdesign.com/magic magic
WORKDIR /root/magic WORKDIR /root/magic
RUN git checkout ${MAGIC_COMMIT} RUN git checkout ${MAGIC_COMMIT}
COPY mrg.patch /root/magic #COPY mrg.patch /root/magic
RUN git apply mrg.patch #RUN git apply mrg.patch
RUN ./configure RUN ./configure
RUN make RUN make
RUN make install RUN make install

View File

@ -31,9 +31,10 @@ tech_modules = d.module_type()
# Custom cell properties # Custom cell properties
################################################### ###################################################
cell_properties = d.cell_properties() cell_properties = d.cell_properties()
cell_properties.ptx.model_is_subckt = True
################################################### ###################################################
# Custom cell properties # Custom layer properties
################################################### ###################################################
layer_properties = d.layer_properties() layer_properties = d.layer_properties()
@ -186,11 +187,11 @@ drc.add_layer("poly",
drc["poly_extend_active"] = 0.22 drc["poly_extend_active"] = 0.22
drc["poly_to_contact"] = 0 drc["poly_to_contact"] = 0
# poly.7 Minimum enclosure of active around gate
#drc["active_enclose_gate"] = 0.075 #drc["active_enclose_gate"] = 0.075
drc["poly_to_active"] = 0.1 drc["poly_to_active"] = 0.1
# poly.2 Minimum spacing of field poly
#drc["poly_to_field_poly"] = 0.210 #drc["poly_to_field_poly"] = 0.210
drc.add_layer("active", drc.add_layer("active",
@ -211,148 +212,112 @@ drc.add_enclosure("pwell",
layer="active", layer="active",
enclosure=0.43, enclosure=0.43,
extension=0.6) extension=0.6)
# nsd/psd.5a
#drc.add_enclosure("implant", drc.add_enclosure("implant",
# layer="active", layer="active",
# enclosure=0.125) enclosure=0.125)
# Same as active enclosure? # Same as active enclosure?
#drc["implant_to_contact"] = 0.070 #drc["implant_to_contact"] = 0.070
# nsd/psd.1 nsd/psd.2
#drc.add_layer("implant", drc.add_layer("implant",
# width=0.380, width=0.4,
# spacing=0.380, spacing=0.4,
# area=0.265) area=0.35)
drc.add_layer("contact", drc.add_layer("contact",
width=0.22, width=0.22,
spacing=0.25) spacing=0.25)
# licon.5c (0.06 extension), (licon.7 for extension)
#drc.add_enclosure("active",
# layer="contact",
# enclosure=0.040,
# extension=0.060)
# licon.7
#drc["tap_extend_contact"] = 0.120
# licon.8 Minimum enclosure of poly around contact drc.add_enclosure("active",
#drc.add_enclosure("poly", layer="contact",
# layer="contact", enclosure=0.01,
# enclosure=0.08, extension=0.01)
# extension=0.08) drc.add_enclosure("poly",
# licon.11a layer="contact",
#drc["active_contact_to_gate"] = 0.050 enclosure=0.07,
# npc.4 > licon.14 0.19 > licon.11a extension=0.07)
#drc["poly_contact_to_gate"] = 0.270
# licon.15 drc["active_contact_to_gate"] = 0.145
drc["poly_contact_to_gate"] = 0.165
#drc["npc_enclose_poly"] = 0.1 #drc["npc_enclose_poly"] = 0.1
# li.1, li.3
#drc.add_layer("li",
# width=0.170,
# spacing=0.170)
# licon.5
#drc.add_enclosure("li",
# layer="contact",
# enclosure=0,
# extension=0.080)
#drc.add_enclosure("li",
# layer="mcon",
# enclosure=0,
# extension=0.080)
# mcon.1, mcon.2
#drc.add_layer("mcon",
# width=0.170,
# spacing=0.210)
drc.add_layer("m1", drc.add_layer("m1",
width=0.23, width=0.23,
spacing=0.23, spacing=0.23,
area=0.1444) area=0.1444)
# m1.4 Minimum enclosure of metal1
# m1.5 Minimum enclosure around contact on two opposite sides
#drc.add_enclosure("m1",
# layer="mcon",
# enclosure=0.030,
# extension=0.060)
# via.4a Minimum enclosure around via1
# via.5a Minimum enclosure around via1 on two opposite sides
#drc.add_enclosure("m1",
# layer="via1",
# enclosure=0.055,
# extension=0.085)
# via.1a Minimum width of via1 drc.add_enclosure("m1",
# via.2 Minimum spacing of via1 layer="contact",
#drc.add_layer("via1", enclosure=0.06,
# width=0.150, extension=0.06)
# spacing=0.170)
drc.add_enclosure("m1",
layer="via1",
enclosure=0.06,
extension=0.06)
drc.add_layer("via1",
width=0.26,
spacing=0.26)
drc.add_layer("m2", drc.add_layer("m2",
width=0.28, width=0.28,
spacing=0.28, spacing=0.28,
area=0.1444) area=0.1444)
# m2.4 Minimum enclosure around via1
# m2.5 Minimum enclosure around via1 on two opposite sides
#drc.add_enclosure("m2",
# layer="via1",
# enclosure=0.055,
# extension=0.085)
# via2.4 Minimum enclosure around via2
# via2.5 Minimum enclosure around via2 on two opposite sides
#drc.add_enclosure("m2",
# layer="via2",
# enclosure=0.040,
# extension=0.085)
# via2.1a Minimum width of Via2 drc.add_enclosure("m2",
# via2.2 Minimum spacing of Via2 layer="via1",
#drc.add_layer("via2", enclosure=0.06,
# width=0.200, extension=0.06)
# spacing=0.200)
drc.add_enclosure("m2",
layer="via2",
enclosure=0.06,
extension=0.06)
drc.add_layer("via2",
width=0.26,
spacing=0.26)
drc.add_layer("m3", drc.add_layer("m3",
width=0.28, width=0.28,
spacing=0.28, spacing=0.28,
area=0.1444) area=0.1444)
# m3.4 Minimum enclosure around via2
#drc.add_enclosure("m3",
# layer="via2",
# enclosure=0.065)
# via3.4 Minimum enclosure around via3
# via3.5 Minimum enclosure around via3 on two opposite sides
#drc.add_enclosure("m3",
# layer="via3",
# enclosure=0.060,
# extension=0.090)
# via3.1 Minimum width of Via3 drc.add_enclosure("m3",
# via3.2 Minimum spacing of Via3 layer="via2",
#drc.add_layer("via3", enclosure=0.06)
# width=0.200,
# spacing=0.200)
drc.add_enclosure("m3",
layer="via3",
enclosure=0.06,
extension=0.06)
drc.add_layer("via3",
width=0.26,
spacing=0.26)
drc.add_layer("m4", drc.add_layer("m4",
width=0.28, width=0.28,
spacing=0.28, spacing=0.28,
area=0.1444) area=0.1444)
# m4.3 Minimum enclosure around via3
#drc.add_enclosure("m4",
# layer="via3",
# enclosure=0.065)
#drc.add_enclosure("m4", drc.add_enclosure("m4",
# layer="via4", layer="via3",
# enclosure=0.060) enclosure=0.06)
drc.add_enclosure("m4",
layer="via4",
enclosure=0.06)
# via4.1 Minimum width of Via4 drc.add_layer("via5",
# via4.2 Minimum spacing of Via4 width=0.26,
#drc.add_layer("via4", spacing=0.26)
# width=0.800,
# spacing=0.800)
# m5.1 Minimum width of metal5 # m5.1 Minimum width of metal5
# m5.2 Minimum spacing of metal5 # m5.2 Minimum spacing of metal5
@ -376,14 +341,11 @@ drc.add_layer("m4",
# spice info # spice info
spice = {} spice = {}
spice["nmos"] = "sky130_fd_pr__nfet_01v8" spice["nmos"] = "nfet_03v3"
spice["pmos"] = "sky130_fd_pr__pfet_01v8" spice["pmos"] = "pfet_03v3"
spice["power"]="vccd1" spice["power"]="vccd1"
spice["ground"]="vssd1" spice["ground"]="vssd1"
# whether or not the device model is actually a subckt
spice["device_prefix"] = "X"
spice["fet_libraries"] = {"TT": [[os.environ.get("SPICE_MODEL_DIR") + "/sky130.lib.spice", "tt"]]} spice["fet_libraries"] = {"TT": [[os.environ.get("SPICE_MODEL_DIR") + "/sky130.lib.spice", "tt"]]}
# spice stimulus related variables # spice stimulus related variables