From a18d62c4306646012bcbe95b322b4674970817c3 Mon Sep 17 00:00:00 2001 From: Jesse Cirimelli-Low Date: Mon, 16 Jan 2023 11:14:44 -0800 Subject: [PATCH] rename gf180 to gf180mcu --- technology/{gf180 => gf180mcu}/__init__.py | 8 +- technology/gf180mcu/mag_lib/.magicrc | 69 + technology/gf180mcu/tech/.magicrc | 69 + technology/gf180mcu/tech/__init__.py | 12 + technology/gf180mcu/tech/gf180mcu.lym | 49 + technology/gf180mcu/tech/gf180mcu.lyp | 2008 +++++++++++++++++++ technology/gf180mcu/tech/gf180mcu.lyt | 233 +++ technology/{gf180 => gf180mcu}/tech/tech.py | 298 ++- 8 files changed, 2590 insertions(+), 156 deletions(-) rename technology/{gf180 => gf180mcu}/__init__.py (86%) create mode 100644 technology/gf180mcu/mag_lib/.magicrc create mode 100644 technology/gf180mcu/tech/.magicrc create mode 100644 technology/gf180mcu/tech/__init__.py create mode 100644 technology/gf180mcu/tech/gf180mcu.lym create mode 100644 technology/gf180mcu/tech/gf180mcu.lyp create mode 100644 technology/gf180mcu/tech/gf180mcu.lyt rename technology/{gf180 => gf180mcu}/tech/tech.py (68%) diff --git a/technology/gf180/__init__.py b/technology/gf180mcu/__init__.py similarity index 86% rename from technology/gf180/__init__.py rename to technology/gf180mcu/__init__.py index 45e04451..10a3899a 100644 --- a/technology/gf180/__init__.py +++ b/technology/gf180mcu/__init__.py @@ -13,7 +13,7 @@ This type of setup script should be placed in the setup_scripts directory in the import sys import os -TECHNOLOGY = "gf180" +TECHNOLOGY = "gf180mcu" os.environ["MGC_TMPDIR"] = "/tmp" @@ -22,19 +22,19 @@ os.environ["MGC_TMPDIR"] = "/tmp" # OpenPDK needed for magicrc, tech file and spice models of transistors if 'PDK_ROOT' in os.environ: - open_pdks = os.path.join(os.environ['PDK_ROOT'], 'gf180', 'libs.tech') + open_pdks = os.path.join(os.environ['PDK_ROOT'], 'gf180mcuA', 'libs.tech') else: raise SystemError("Unable to find open_pdks tech file. Set PDK_ROOT.") # The ngspice models work with Xyce too now spice_model_dir = os.path.join(open_pdks, "ngspice") -gf180_lib_ngspice = os.path.join(open_pdks, "ngspice", "gf180.lib.spice") +gf180_lib_ngspice = os.path.join(open_pdks, "ngspice", "sm141064.ngspice") if not os.path.exists(gf180_lib_ngspice): raise SystemError("Did not find {} under {}".format(gf180_lib_ngspice, open_pdks)) os.environ["SPICE_MODEL_DIR"] = spice_model_dir open_pdks = os.path.abspath(open_pdks) -gf180_magicrc = os.path.join(open_pdks, 'magic', "gf180A.magicrc") +gf180_magicrc = os.path.join(open_pdks, 'magic', "gf180mcuA.magicrc") if not os.path.exists(gf180_magicrc): raise SystemError("Did not find {} under {}".format(gf180_magicrc, open_pdks)) os.environ["OPENRAM_MAGICRC"] = gf180_magicrc diff --git a/technology/gf180mcu/mag_lib/.magicrc b/technology/gf180mcu/mag_lib/.magicrc new file mode 100644 index 00000000..1fa2e18d --- /dev/null +++ b/technology/gf180mcu/mag_lib/.magicrc @@ -0,0 +1,69 @@ +### +### Source file TECHNAME.magicrc +### Process this file with the m4 processor +### +puts stdout "Sourcing design .magicrc for technology TECHNAME ..." + +# Put internal grid on 0.005 pitch. This is important to match vendor file +# input (as opposed to SCMOS-style layout. The default lambda grid is 0.05um). + +set scalefac [tech lambda] +if {[lindex $scalefac 1] < 10} { + scalegrid 1 10 +} + +# drc off +drc euclidean on +# Change this to a fixed number for repeatable behavior with GDS writes +# e.g., "random seed 12345" +catch {random seed} + +# Allow override of PDK path from environment variable PDK_ROOT +# "file nativename" guards against a local PDK_ROOT with "~" in the name +if {[catch {set PDK_ROOT [file nativename $env(PDK_ROOT)]}]} { + set PDK_ROOT STAGING_PATH +} + +# loading technology +tech load $PDK_ROOT/TECHNAME/MAGIC_CURRENT/TECHNAME.tech + +# load device generator +source $PDK_ROOT/TECHNAME/MAGIC_CURRENT/TECHNAME.tcl + +# load bind keys +# source $PDK_ROOT/TECHNAME/MAGIC_CURRENT/TECHNAME-BindKeys + +# set units to lambda grid +snap lambda + +# set gf180mcu standard power, ground, and substrate names +set VDD VDD +set GND VSS +set SUB VSUBS + +# Allow override of type of magic library views used, "mag" or "maglef", +# from environment variable MAGTYPE + +if {[catch {set MAGTYPE $env(MAGTYPE)}]} { + set MAGTYPE mag +} + +# add path to reference cells +if {[file isdir ${PDK_ROOT}/TECHNAME/libs.ref/${MAGTYPE}]} { + addpath ${PDK_ROOT}/TECHNAME/libs.ref/${MAGTYPE}/gf180mcu_fd_pr + addpath ${PDK_ROOT}/TECHNAME/libs.ref/${MAGTYPE}/gf180mcu_mcu7t5v0 + addpath ${PDK_ROOT}/TECHNAME/libs.ref/${MAGTYPE}/gf180mcu_mcu9t5v0 + addpath ${PDK_ROOT}/TECHNAME/libs.ref/${MAGTYPE}/gf180mcu_fd_io + addpath ${PDK_ROOT}/TECHNAME/libs.ref/${MAGTYPE}/gf180mcu_fd_ip_sram +} else { + addpath ${PDK_ROOT}/TECHNAME/libs.ref/gf180mcu_fd_pr/${MAGTYPE} + addpath ${PDK_ROOT}/TECHNAME/libs.ref/gf180mcu_fd_sc_mcu7t5v0/${MAGTYPE} + addpath ${PDK_ROOT}/TECHNAME/libs.ref/gf180mcu_fd_sc_mcu9t5v0/${MAGTYPE} + addpath ${PDK_ROOT}/TECHNAME/libs.ref/gf180mcu_fd_io/${MAGTYPE} + addpath ${PDK_ROOT}/TECHNAME/libs.ref/gf180mcu_fd_ip_sram/${MAGTYPE} +} + +# add path to IP from catalog. This procedure defined in the PDK script. +catch {magic::query_mylib_ip} +# add path to local IP from user design space. Defined in the PDK script. +catch {magic::query_my_projects} diff --git a/technology/gf180mcu/tech/.magicrc b/technology/gf180mcu/tech/.magicrc new file mode 100644 index 00000000..1fa2e18d --- /dev/null +++ b/technology/gf180mcu/tech/.magicrc @@ -0,0 +1,69 @@ +### +### Source file TECHNAME.magicrc +### Process this file with the m4 processor +### +puts stdout "Sourcing design .magicrc for technology TECHNAME ..." + +# Put internal grid on 0.005 pitch. This is important to match vendor file +# input (as opposed to SCMOS-style layout. The default lambda grid is 0.05um). + +set scalefac [tech lambda] +if {[lindex $scalefac 1] < 10} { + scalegrid 1 10 +} + +# drc off +drc euclidean on +# Change this to a fixed number for repeatable behavior with GDS writes +# e.g., "random seed 12345" +catch {random seed} + +# Allow override of PDK path from environment variable PDK_ROOT +# "file nativename" guards against a local PDK_ROOT with "~" in the name +if {[catch {set PDK_ROOT [file nativename $env(PDK_ROOT)]}]} { + set PDK_ROOT STAGING_PATH +} + +# loading technology +tech load $PDK_ROOT/TECHNAME/MAGIC_CURRENT/TECHNAME.tech + +# load device generator +source $PDK_ROOT/TECHNAME/MAGIC_CURRENT/TECHNAME.tcl + +# load bind keys +# source $PDK_ROOT/TECHNAME/MAGIC_CURRENT/TECHNAME-BindKeys + +# set units to lambda grid +snap lambda + +# set gf180mcu standard power, ground, and substrate names +set VDD VDD +set GND VSS +set SUB VSUBS + +# Allow override of type of magic library views used, "mag" or "maglef", +# from environment variable MAGTYPE + +if {[catch {set MAGTYPE $env(MAGTYPE)}]} { + set MAGTYPE mag +} + +# add path to reference cells +if {[file isdir ${PDK_ROOT}/TECHNAME/libs.ref/${MAGTYPE}]} { + addpath ${PDK_ROOT}/TECHNAME/libs.ref/${MAGTYPE}/gf180mcu_fd_pr + addpath ${PDK_ROOT}/TECHNAME/libs.ref/${MAGTYPE}/gf180mcu_mcu7t5v0 + addpath ${PDK_ROOT}/TECHNAME/libs.ref/${MAGTYPE}/gf180mcu_mcu9t5v0 + addpath ${PDK_ROOT}/TECHNAME/libs.ref/${MAGTYPE}/gf180mcu_fd_io + addpath ${PDK_ROOT}/TECHNAME/libs.ref/${MAGTYPE}/gf180mcu_fd_ip_sram +} else { + addpath ${PDK_ROOT}/TECHNAME/libs.ref/gf180mcu_fd_pr/${MAGTYPE} + addpath ${PDK_ROOT}/TECHNAME/libs.ref/gf180mcu_fd_sc_mcu7t5v0/${MAGTYPE} + addpath ${PDK_ROOT}/TECHNAME/libs.ref/gf180mcu_fd_sc_mcu9t5v0/${MAGTYPE} + addpath ${PDK_ROOT}/TECHNAME/libs.ref/gf180mcu_fd_io/${MAGTYPE} + addpath ${PDK_ROOT}/TECHNAME/libs.ref/gf180mcu_fd_ip_sram/${MAGTYPE} +} + +# add path to IP from catalog. This procedure defined in the PDK script. +catch {magic::query_mylib_ip} +# add path to local IP from user design space. Defined in the PDK script. +catch {magic::query_my_projects} diff --git a/technology/gf180mcu/tech/__init__.py b/technology/gf180mcu/tech/__init__.py new file mode 100644 index 00000000..c6bd5798 --- /dev/null +++ b/technology/gf180mcu/tech/__init__.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +# See LICENSE for licensing information. +# +# Copyright (c) 2016-2022 Regents of the University of California +# All rights reserved. +# + +""" +Import tech specific modules. +""" + +from .tech import * diff --git a/technology/gf180mcu/tech/gf180mcu.lym b/technology/gf180mcu/tech/gf180mcu.lym new file mode 100644 index 00000000..c819e2ea --- /dev/null +++ b/technology/gf180mcu/tech/gf180mcu.lym @@ -0,0 +1,49 @@ + + + + + + pymacros + + + + true + false + + false + + + python + + + +import sys +import os + +technology_macros_path = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, technology_macros_path) + +from cells import gf180mcu + +# Instantiate and register the library +gf180mcu() + +print("## gf180mcu PDK Pcells loaded.") +print(sys.path) + + + diff --git a/technology/gf180mcu/tech/gf180mcu.lyp b/technology/gf180mcu/tech/gf180mcu.lyp new file mode 100644 index 00000000..1b996571 --- /dev/null +++ b/technology/gf180mcu/tech/gf180mcu.lyp @@ -0,0 +1,2008 @@ + + + + + #55ce57 + #55ce57 + 0 + 0 + I3 + + true + false + false + 1 + false + false + 0 + + 1/222@1 + + + #661a48 + #661a48 + 0 + 0 + I3 + + true + false + false + 1 + false + false + 0 + + pass_mk 2/222@1 + + + #7c6078 + #7c6078 + 0 + 0 + I3 + + true + false + false + 1 + false + false + 0 + + fail_mk 3/222@1 + + + #f26f6c + #f26f6c + 0 + 0 + I3 + + true + false + false + 1 + false + false + 0 + + polygon_mk 4/222@1 + + + #324416 + #324416 + 0 + 0 + I3 + + true + false + false + 1 + false + false + 0 + + 5/222@1 + + + #3acb88 + #3acb88 + 0 + 0 + I3 + + true + false + false + 1 + false + false + 0 + + violation_mk 6/222@1 + + + #5a68c2 + #5a68c2 + 0 + 0 + I3 + + true + false + false + 1 + false + false + 0 + + rule_txt_mk 11/222@1 + + + #718e2d + #718e2d + 0 + 0 + I3 + + true + false + false + 1 + false + false + 0 + + 12/222@1 + + + #3f3f3c + #3f3f3c + 0 + 0 + I3 + + true + false + false + 1 + false + false + 0 + + case_txt_mk 13/222@1 + + + #3f12e4 + #3f12e4 + 0 + 0 + I3 + + true + false + false + 1 + false + false + 0 + + 14/222@1 + + + #f9bd46 + #f9bd46 + 0 + 0 + I3 + + true + false + false + 1 + false + false + 0 + + 15/222@1 + + + #bd74bd + #bd74bd + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + COMP 22/0@1 + + + #88cb1d + #88cb1d + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + DNWELL 12/0@1 + + + #f9946b + #f9946b + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Nwell 21/0@1 + + + #3a2888 + #3a2888 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + LVPWELL 204/0@1 + + + #c16f5c + #c16f5c + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Dualgate 55/0@1 + + + #2e9521 + #2e9521 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Poly2 30/0@1 + + + #bf3efb + #bf3efb + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Nplus 32/0@1 + + + #34c590 + #34c590 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Pplus 31/0@1 + + + #67392f + #67392f + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + SAB 49/0@1 + + + #d9ef03 + #d9ef03 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + ESD 24/0@1 + + + #c86634 + #c86634 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Contact 33/0@1 + + + #eddd07 + #eddd07 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal1 34/0@1 + + + #f5e7f1 + #f5e7f1 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Via1 35/0@1 + + + #ccf338 + #ccf338 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal2 36/0@1 + + + #e1d8ca + #e1d8ca + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Via2 38/0@1 + + + #97b91b + #97b91b + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal3 42/0@1 + + + #53e2e8 + #53e2e8 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Via3 40/0@1 + + + #80317c + #80317c + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal4 46/0@1 + + + #a7b1d1 + #a7b1d1 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Via4 41/0@1 + + + #cdc16b + #cdc16b + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal5 81/0@1 + + + #827e5b + #827e5b + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Via5 82/0@1 + + + #b1dd9c + #b1dd9c + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + MetalTop 53/0@1 + + + #72342b + #72342b + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Pad 37/0@1 + + + #1437ff + #1437ff + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Resistor 62/0@1 + + + #82b18c + #82b18c + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + FHRES 227/0@1 + + + #b9a4fd + #b9a4fd + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + FuseTop 75/0@1 + + + #87ad41 + #87ad41 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + FuseWindow_D 96/1@1 + + + #ec7ceb + #ec7ceb + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + POLYFUSE 220/0@1 + + + #e29901 + #e29901 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + MVSD 210/0@1 + + + #63a2db + #63a2db + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + MVPSD 11/39@1 + + + #91d339 + #91d339 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + NAT 5/0@1 + + + #f84e38 + #f84e38 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + COMP_Dummy 22/4@1 + + + #2d4da8 + #2d4da8 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Poly2_Dummy 30/4@1 + + + #c01202 + #c01202 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal1_Dummy 34/4@1 + + + #2f93c0 + #2f93c0 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Metal2_Dummy 36/4@1 + + + #867300 + #867300 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal3_Dummy 42/4@1 + + + #e86c70 + #e86c70 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Metal4_Dummy 46/4@1 + + + #26676b + #26676b + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal5_Dummy 81/4@1 + + + #60fe08 + #60fe08 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + MetalTop_Dummy 53/4@1 + + + #4665c7 + #4665c7 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + COMP_Label 22/10@1 + + + #fb1879 + #fb1879 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Poly2_Label 30/10@1 + + + #880f5b + #880f5b + 0 + 0 + I9 + + true + false + false + 1 + false + false + 0 + + Metal1_Label 34/10@1 + + + #ff80b7 + #ff80b7 + 0 + 0 + I5 + + true + false + false + 1 + false + false + 0 + + Metal2_Label 36/10@1 + + + #ad9348 + #ad9348 + 0 + 0 + I9 + + true + false + false + 1 + false + false + 0 + + Metal3_Label 42/10@1 + + + #876bbe + #876bbe + 0 + 0 + I5 + + true + false + false + 1 + false + false + 0 + + Metal4_Label 46/10@1 + + + #43e12f + #43e12f + 0 + 0 + I9 + + true + false + false + 1 + false + false + 0 + + Metal5_Label 81/10@1 + + + #a6ec0e + #a6ec0e + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + MetalTop_Label 53/10@1 + + + #271fe3 + #271fe3 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal1_Slot 34/3@1 + + + #d56ff8 + #d56ff8 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Metal2_Slot 36/3@1 + + + #d8c178 + #d8c178 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal3_Slot 42/3@1 + + + #6c36fb + #6c36fb + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Metal4_Slot 46/3@1 + + + #225c09 + #225c09 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal5_Slot 81/3@1 + + + #03f979 + #03f979 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + MetalTop_Slot 53/3@1 + + + #6c9be2 + #6c9be2 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + UBMPPeri 183/0@1 + + + #0174b8 + #0174b8 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + UBMPArray 184/0@1 + + + #5bdc70 + #5bdc70 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + UBMEPlate 185/0@1 + + + #94d628 + #94d628 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Schottky_diode 241/0@1 + + + #5660ce + #5660ce + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + ZENER 178/0@1 + + + #4a0c51 + #4a0c51 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + RES_MK 110/5@1 + + + #84fd79 + #84fd79 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + OPC_drc 124/5@1 + + + #49ee98 + #49ee98 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + NDMY 111/5@1 + + + #0c7e5b + #0c7e5b + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + PMNDMY 152/5@1 + + + #49b403 + #49b403 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + V5_XTOR 112/1@1 + + + #2522b7 + #2522b7 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + CAP_MK 117/5@1 + + + #0c5e62 + #0c5e62 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + MOS_CAP_MK 166/5@1 + + + #99ac7e + #99ac7e + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + IND_MK 151/5@1 + + + #9f0f89 + #9f0f89 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + DIODE_MK 115/5@1 + + + #04507b + #04507b + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + DRC_BJT 127/5@1 + + + #0e7575 + #0e7575 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + LVS_BJT 118/5@1 + + + #f6b1ef + #f6b1ef + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + MIM_L_MK 117/10@1 + + + #10c9d8 + #10c9d8 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Latchup_MK 137/5@1 + + + #79d94d + #79d94d + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + GUARD_RING_MK 167/5@1 + + + #2aa0fb + #2aa0fb + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + OTP_MK 173/5@1 + + + #7b407b + #7b407b + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + MTPMARK 122/5@1 + + + #f894c4 + #f894c4 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + NEO_EE_MK 88/17@1 + + + #d69c01 + #d69c01 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + SramCore 108/5@1 + + + #c80a86 + #c80a86 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + LVS_RF 100/5@1 + + + #fa898a + #fa898a + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + LVS_Drain 100/7@1 + + + #5a305a + #5a305a + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + IND_MK 151/5@1 + + + #c2bf6d + #c2bf6d + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + HVPOLYRS 123/5@1 + + + #9f3b8a + #9f3b8a + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + LVS_IO 119/5@1 + + + #5aac8a + #5aac8a + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + PROBE_MK 13/17@1 + + + #5de533 + #5de533 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + ESD_MK 24/5@1 + + + #b654a3 + #b654a3 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + LVS_Source 100/8@1 + + + #9beaaf + #9beaaf + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + WELL_DIODE_MK 153/51@1 + + + #b0eb32 + #b0eb32 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + LDMOS_XTOR 226/0@1 + + + #2507df + #2507df + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + PLFUSE 125/5@1 + + + #7791b3 + #7791b3 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + EFUSE_MK 80/5@1 + + + #ac9801 + #ac9801 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + MCELL_FEOL_MK 11/17@1 + + + #ae438e + #ae438e + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + YMTP_MK 86/17@1 + + + #5779b7 + #5779b7 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + DEV_WF_MK 128/17@1 + + + #8e3415 + #8e3415 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal1_BLK 34/5@1 + + + #47649f + #47649f + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Metal2_BLK 36/5@1 + + + #3bf37a + #3bf37a + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal3_BLK 42/5@1 + + + #678619 + #678619 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Metal4_BLK 46/5@1 + + + #44fa82 + #44fa82 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal5_BLK 81/5@1 + + + #614b6a + #614b6a + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + MetalT_BLK 53/5@1 + + + #d9f817 + #d9f817 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + PR_bndry 0/0@1 + + + #0bdfb7 + #0bdfb7 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + MDIODE 116/5@1 + + + #658af3 + #658af3 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal1_Res 110/11@1 + + + #e9465c + #e9465c + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Metal2_Res 110/12@1 + + + #ba3263 + #ba3263 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal3_Res 110/13@1 + + + #ddeef3 + #ddeef3 + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Metal4_Res 110/14@1 + + + #004676 + #004676 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Metal5_Res 110/15@1 + + + #e4b00d + #e4b00d + 0 + 0 + I5 + + true + true + false + 1 + false + false + 0 + + Metal6_Res 110/16@1 + + + #edeb06 + #edeb06 + 0 + 0 + I9 + + true + true + false + 1 + false + false + 0 + + Border 63/0@1 + + + diff --git a/technology/gf180mcu/tech/gf180mcu.lyt b/technology/gf180mcu/tech/gf180mcu.lyt new file mode 100644 index 00000000..c5959dcd --- /dev/null +++ b/technology/gf180mcu/tech/gf180mcu.lyt @@ -0,0 +1,233 @@ + + + + gf180mcu + GLOBALFOUNDRIES 0.18UM 3.3V/(5V)6V MCU TECHNOLOGY + + 0.001 + + $PDK_ROOT/$PDK/libs.tech/klayout + gf180mcu.lyp + true + + + 1 + true + true + + + true + layer_map() + true + true + + + true + layer_map() + 0.001 + true + #1 + true + #1 + false + #1 + true + OUTLINE + true + PLACEMENT_BLK + true + REGIONS + true + + 0 + true + .PIN + 2 + true + .PIN + 2 + true + .FILL + 5 + true + .OBS + 3 + true + .BLK + 4 + true + .LABEL + 1 + true + .LABEL + 1 + true + + 0 + true + + 0 + VIA_ + true + default + false + + + + false + true + true + 64 + 0 + 1 + 0 + DATA + 0 + 0 + BORDER + layer_map() + true + + + 0.001 + 1 + 100 + 100 + 0 + 0 + 0 + false + false + false + true + layer_map() + + + 0 + 0.001 + layer_map() + true + false + + + 1 + 0.001 + layer_map() + true + false + true + + + + + + + true + false + false + false + false + false + 8000 + 32000 + LIB + + + 2 + false + false + 1 + * + false + + + 0 + + + false + false + + + 0 + + true + + + + # Provide z stack information here +# +# Each line is one layer. The specification consists of a layer specification, a colon and arguments. +# The arguments are named (like "x=...") or in serial. Parameters are separated by comma or blanks. +# Named arguments are: +# +# zstart The lower z position of the extruded layer in µm +# zstop The upper z position of the extruded layer in µm +# height The height of the extruded layer in µm +# +# 'height', 'zstart' and 'zstop' can be used in any combination. If no value is given for 'zstart', +# the upper level of the previous layer will be used. +# +# If a single unnamed parameter is given, it corresponds to 'height'. Two parameters correspond to +# 'zstart' and 'zstop'. +# +# Examples: +# 1: 0.5 1.5 # extrude layer 1/0 from 0.5 to 1.5 vertically +# 1/0: 0.5 1.5 # same with explicit datatype +# 1: zstop=1.5, zstart=0.5 # same with named parameters +# 1: height=1.0, zstop=1.5 # same with z stop minus height +# 1: 1.0 zstop=1.5 # same with height as unnamed parameter +# +# VARIABLES +# +# You can declare variables with: +# var name = value +# +# You can use variables inside numeric expressions. +# Example: +# var hmetal = 0.48 +# 7/0: 0.5 0.5+hmetal*2 # 2x thick metal +# +# You cannot use variables inside layer specifications currently. +# +# CONDITIONALS +# +# You can enable or disable branches of the table using 'if', 'else', 'elseif' and 'end': +# Example: +# var thick_m1 = true +# if thickm1 +# 1: 0.5 1.5 +# else +# 1: 0.5 1.2 +# end + + + + + 30/0,33/0,Metal1 + Metal1,35/0,Metal2 + Metal2,38/0,Metal3 + Metal3,40/0,Metal4 + Metal4,41/0,Metal5 + Metal5,82/0,53/0 + + Metal1='34/0+34/10' + Metal2='36/0+36/10' + Metal3='42/0+42/10' + Metal4='46/0+46/10' + Metal5='81/0+81/10' + + diff --git a/technology/gf180/tech/tech.py b/technology/gf180mcu/tech/tech.py similarity index 68% rename from technology/gf180/tech/tech.py rename to technology/gf180mcu/tech/tech.py index 9c946aee..66e9d3a0 100644 --- a/technology/gf180/tech/tech.py +++ b/technology/gf180mcu/tech/tech.py @@ -132,6 +132,7 @@ layer_names = {} layer_names["active"] = "active" layer_names["pwell"] = "pwell" layer_names["nwell"] = "nwell" +layer_names["dnwell"] = "dnwell" layer_names["nimplant"]= "nimplant" layer_names["pimplant"]= "pimplant" layer_names["poly"] = "poly" @@ -153,225 +154,218 @@ layer_names["boundary"]= "boundary" # technology parameter parameter={} -# difftap.2b + parameter["min_tx_size"] = 0.250 parameter["beta"] = 3 -parameter["6T_inv_nmos_size"] = 0.205 -parameter["6T_inv_pmos_size"] = 0.09 -parameter["6T_access_size"] = 0.135 - +parameter["6T_inv_nmos_size"] = 0.6 +parameter["6T_inv_pmos_size"] = 0.95 +parameter["6T_access_size"] = 0.6 drc = d.design_rules("gf180") # grid size drc["grid"] = 0.005 -# minwidth_tx with contact (no dog bone transistors) -# difftap.2b -drc["minwidth_tx"] = 0.360 -drc["minlength_channel"] = 0.150 +drc["minwidth_tx"] = 0.28 +#drc["minlength_channel"] = 0.150 + +drc["pwell_to_nwell"] = 0 # assuming same potential -drc["pwell_to_nwell"] = 0 -# nwell.1 Minimum width of nwell/pwell drc.add_layer("nwell", - width=0.840, - spacing=1.270) + width=0.86, + spacing=0.6) + +drc.add_layer("pwell", + width=0.74, # 0.6 for 1.5v + spacing=0.86) # equal potential 1.7 otherwise -# poly.1a Minimum width of poly -# poly.2 Minimum spacing of poly AND active drc.add_layer("poly", - width=0.150, - spacing=0.210) + width=0.18, + spacing=0.24) # poly.8 -drc["poly_extend_active"] = 0.13 +#drc["poly_extend_active"] = 0.13 # Not a rule -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 # poly.4 Minimum spacing of field poly to active -drc["poly_to_active"] = 0.075 +#drc["poly_to_active"] = 0.075 # poly.2 Minimum spacing of field poly -drc["poly_to_field_poly"] = 0.210 +#drc["poly_to_field_poly"] = 0.210 -# difftap.1 Minimum width of active -# difftap.3 Minimum spacing of active drc.add_layer("active", - width=0.150, - spacing=0.270) -# difftap.8 + width=0.22, + spacing=0.280) + +drc.add_enclosure("dnwell", + layer="pwell", + enclosure=2.5, + extension=2.5) + drc.add_enclosure("nwell", layer="active", - enclosure=0.18, - extension=0.18) + enclosure=0.43, + extension=0.6) -# nsd/psd.5a -drc.add_enclosure("implant", +drc.add_enclosure("pwell", layer="active", - enclosure=0.125) + enclosure=0.43, + extension=0.6) +# nsd/psd.5a +#drc.add_enclosure("implant", +# layer="active", +# enclosure=0.125) # 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", - width=0.380, - spacing=0.380, - area=0.265) +#drc.add_layer("implant", +# width=0.380, +# spacing=0.380, +# area=0.265) # licon.1, licon.2 -drc.add_layer("contact", - width=0.170, - spacing=0.170) +#drc.add_layer("contact", +# width=0.170, +# spacing=0.170) # licon.5c (0.06 extension), (licon.7 for extension) -drc.add_enclosure("active", - layer="contact", - enclosure=0.040, - extension=0.060) +#drc.add_enclosure("active", +# layer="contact", +# enclosure=0.040, +# extension=0.060) # licon.7 -drc["tap_extend_contact"] = 0.120 +#drc["tap_extend_contact"] = 0.120 # licon.8 Minimum enclosure of poly around contact -drc.add_enclosure("poly", - layer="contact", - enclosure=0.08, - extension=0.08) +#drc.add_enclosure("poly", +# layer="contact", +# enclosure=0.08, +# extension=0.08) # licon.11a -drc["active_contact_to_gate"] = 0.050 +#drc["active_contact_to_gate"] = 0.050 # npc.4 > licon.14 0.19 > licon.11a -drc["poly_contact_to_gate"] = 0.270 +#drc["poly_contact_to_gate"] = 0.270 # licon.15 -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) +#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="contact", +# enclosure=0, +# extension=0.080) -drc.add_enclosure("li", - layer="mcon", - 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("mcon", +# width=0.170, +# spacing=0.210) -# m1.1 Minimum width of metal1 -# m1.2 Minimum spacing of metal1 -# m1.6 Minimum area of metal1 drc.add_layer("m1", - width=0.140, - spacing=0.140, - area=0.083) + width=0.23, + spacing=0.23, + 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) +#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) +#drc.add_enclosure("m1", +# layer="via1", +# enclosure=0.055, +# extension=0.085) # via.1a Minimum width of via1 # via.2 Minimum spacing of via1 -drc.add_layer("via1", - width=0.150, - spacing=0.170) +#drc.add_layer("via1", +# width=0.150, +# spacing=0.170) -# m2.1 Minimum width of intermediate metal -# m2.2 Minimum spacing of intermediate metal -# m2.6 Minimum area of metal2 drc.add_layer("m2", - width=0.140, - spacing=0.140, - area=0.0676) + width=0.28, + spacing=0.28, + 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) +#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) +#drc.add_enclosure("m2", +# layer="via2", +# enclosure=0.040, +# extension=0.085) # via2.1a Minimum width of Via2 # via2.2 Minimum spacing of Via2 -drc.add_layer("via2", - width=0.200, - spacing=0.200) +#drc.add_layer("via2", +# width=0.200, +# spacing=0.200) -# m3.1 Minimum width of metal3 -# m3.2 Minimum spacing of metal3 -# m3.6 Minimum area of metal3 drc.add_layer("m3", - width=0.300, - spacing=0.300, - area=0.240) + width=0.28, + spacing=0.28, + area=0.1444) # m3.4 Minimum enclosure around via2 -drc.add_enclosure("m3", - layer="via2", - enclosure=0.065) +#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) +#drc.add_enclosure("m3", +# layer="via3", +# enclosure=0.060, +# extension=0.090) # via3.1 Minimum width of Via3 # via3.2 Minimum spacing of Via3 -drc.add_layer("via3", - width=0.200, - spacing=0.200) +#drc.add_layer("via3", +# width=0.200, +# spacing=0.200) -# m4.1 Minimum width of metal4 -# m4.2 Minimum spacing of metal4 -# m4.7 Minimum area of metal4 drc.add_layer("m4", - width=0.300, - spacing=0.300, - area=0.240) + width=0.28, + spacing=0.28, + area=0.1444) # m4.3 Minimum enclosure around via3 -drc.add_enclosure("m4", - layer="via3", - enclosure=0.065) -# FIXME: Wrong rule m4.3 Minimum enclosure around via3 -drc.add_enclosure("m4", - layer="via4", - enclosure=0.060) +#drc.add_enclosure("m4", +# layer="via3", +# enclosure=0.065) + +#drc.add_enclosure("m4", +# layer="via4", +# enclosure=0.060) # via4.1 Minimum width of Via4 # via4.2 Minimum spacing of Via4 -drc.add_layer("via4", - width=0.800, - spacing=0.800) +#drc.add_layer("via4", +# width=0.800, +# spacing=0.800) -# FIXME: Wrong rules # m5.1 Minimum width of metal5 # m5.2 Minimum spacing of metal5 # m5.7 Minimum area of metal5 -drc.add_layer("m5", - width=1.600, - spacing=1.600, - area=4.000) +#drc.add_layer("m5", +# width=1.600, +# spacing=1.600, +# area=4.000) # m5.3 Minimum enclosure around via4 -drc.add_enclosure("m5", - layer="via4", - enclosure=0.310) +#drc.add_enclosure("m5", +# layer="via4", +# enclosure=0.310) @@ -439,16 +433,16 @@ parameter["bitcell_drain_cap"] = 0.1 # In Femto-Farad, approximation of d # Technology Tool Preferences ################################################### -if use_calibre: - drc_name = "calibre" - lvs_name = "calibre" - pex_name = "calibre" -elif use_klayout: - drc_name = "klayout" - lvs_name = "klayout" - pex_name = "klayout" -else: - drc_name = "magic" - lvs_name = "netgen" - pex_name = "magic" +#if use_calibre: +# drc_name = "calibre" +# lvs_name = "calibre" +# pex_name = "calibre" +#if use_klayout: +# drc_name = "klayout" +# lvs_name = "klayout" +# pex_name = "klayout" +#else: +drc_name = "magic" +lvs_name = "netgen" +pex_name = "magic"