mirror of https://github.com/VLSIDA/OpenRAM.git
rename gf180 to gf180mcu
This commit is contained in:
parent
06058e1b87
commit
a18d62c430
|
|
@ -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
|
||||
|
|
@ -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}
|
||||
|
|
@ -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}
|
||||
|
|
@ -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 *
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2022 GlobalFoundries PDK Authors
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<klayout-macro>
|
||||
<description/>
|
||||
<version/>
|
||||
<category>pymacros</category>
|
||||
<prolog/>
|
||||
<epilog/>
|
||||
<doc/>
|
||||
<autorun>true</autorun>
|
||||
<autorun-early>false</autorun-early>
|
||||
<shortcut/>
|
||||
<show-in-menu>false</show-in-menu>
|
||||
<group-name/>
|
||||
<menu-path/>
|
||||
<interpreter>python</interpreter>
|
||||
<dsl-interpreter-name/>
|
||||
<text>
|
||||
|
||||
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)
|
||||
|
||||
</text>
|
||||
</klayout-macro>
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,233 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2022 GlobalFoundries PDK Authors
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<technology>
|
||||
<name>gf180mcu</name>
|
||||
<description>GLOBALFOUNDRIES 0.18UM 3.3V/(5V)6V MCU TECHNOLOGY</description>
|
||||
<group/>
|
||||
<dbu>0.001</dbu>
|
||||
<base-path/>
|
||||
<original-base-path>$PDK_ROOT/$PDK/libs.tech/klayout</original-base-path>
|
||||
<layer-properties_file>gf180mcu.lyp</layer-properties_file>
|
||||
<add-other-layers>true</add-other-layers>
|
||||
<reader-options>
|
||||
<gds2>
|
||||
<box-mode>1</box-mode>
|
||||
<allow-big-records>true</allow-big-records>
|
||||
<allow-multi-xy-records>true</allow-multi-xy-records>
|
||||
</gds2>
|
||||
<common>
|
||||
<create-other-layers>true</create-other-layers>
|
||||
<layer-map>layer_map()</layer-map>
|
||||
<enable-properties>true</enable-properties>
|
||||
<enable-text-objects>true</enable-text-objects>
|
||||
</common>
|
||||
<lefdef>
|
||||
<read-all-layers>true</read-all-layers>
|
||||
<layer-map>layer_map()</layer-map>
|
||||
<dbu>0.001</dbu>
|
||||
<produce-net-names>true</produce-net-names>
|
||||
<net-property-name>#1</net-property-name>
|
||||
<produce-inst-names>true</produce-inst-names>
|
||||
<inst-property-name>#1</inst-property-name>
|
||||
<produce-pin-names>false</produce-pin-names>
|
||||
<pin-property-name>#1</pin-property-name>
|
||||
<produce-cell-outlines>true</produce-cell-outlines>
|
||||
<cell-outline-layer>OUTLINE</cell-outline-layer>
|
||||
<produce-placement-blockages>true</produce-placement-blockages>
|
||||
<placement-blockage-layer>PLACEMENT_BLK</placement-blockage-layer>
|
||||
<produce-regions>true</produce-regions>
|
||||
<region-layer>REGIONS</region-layer>
|
||||
<produce-via-geometry>true</produce-via-geometry>
|
||||
<via_geometry-suffix-string/>
|
||||
<via_geometry-datatype-string>0</via_geometry-datatype-string>
|
||||
<produce-pins>true</produce-pins>
|
||||
<pins-suffix-string>.PIN</pins-suffix-string>
|
||||
<pins-datatype-string>2</pins-datatype-string>
|
||||
<produce-lef-pins>true</produce-lef-pins>
|
||||
<lef_pins-suffix-string>.PIN</lef_pins-suffix-string>
|
||||
<lef_pins-datatype-string>2</lef_pins-datatype-string>
|
||||
<produce-fills>true</produce-fills>
|
||||
<fills-suffix-string>.FILL</fills-suffix-string>
|
||||
<fills-datatype-string>5</fills-datatype-string>
|
||||
<produce-obstructions>true</produce-obstructions>
|
||||
<obstructions-suffix>.OBS</obstructions-suffix>
|
||||
<obstructions-datatype>3</obstructions-datatype>
|
||||
<produce-blockages>true</produce-blockages>
|
||||
<blockages-suffix>.BLK</blockages-suffix>
|
||||
<blockages-datatype>4</blockages-datatype>
|
||||
<produce-labels>true</produce-labels>
|
||||
<labels-suffix>.LABEL</labels-suffix>
|
||||
<labels-datatype>1</labels-datatype>
|
||||
<produce-lef-labels>true</produce-lef-labels>
|
||||
<lef-labels-suffix>.LABEL</lef-labels-suffix>
|
||||
<lef-labels-datatype>1</lef-labels-datatype>
|
||||
<produce-routing>true</produce-routing>
|
||||
<routing-suffix-string/>
|
||||
<routing-datatype-string>0</routing-datatype-string>
|
||||
<produce-special-routing>true</produce-special-routing>
|
||||
<special-routing-suffix-string/>
|
||||
<special-routing-datatype-string>0</special-routing-datatype-string>
|
||||
<via-cellname-prefix>VIA_</via-cellname-prefix>
|
||||
<read-lef-with-def>true</read-lef-with-def>
|
||||
<macro-resolution-mode>default</macro-resolution-mode>
|
||||
<separate-groups>false</separate-groups>
|
||||
<map-file/>
|
||||
</lefdef>
|
||||
<mebes>
|
||||
<invert>false</invert>
|
||||
<subresolution>true</subresolution>
|
||||
<produce-boundary>true</produce-boundary>
|
||||
<num-stripes-per-cell>64</num-stripes-per-cell>
|
||||
<num-shapes-per-cell>0</num-shapes-per-cell>
|
||||
<data-layer>1</data-layer>
|
||||
<data-datatype>0</data-datatype>
|
||||
<data-name>DATA</data-name>
|
||||
<boundary-layer>0</boundary-layer>
|
||||
<boundary-datatype>0</boundary-datatype>
|
||||
<boundary-name>BORDER</boundary-name>
|
||||
<layer-map>layer_map()</layer-map>
|
||||
<create-other-layers>true</create-other-layers>
|
||||
</mebes>
|
||||
<dxf>
|
||||
<dbu>0.001</dbu>
|
||||
<unit>1</unit>
|
||||
<text-scaling>100</text-scaling>
|
||||
<circle-points>100</circle-points>
|
||||
<circle-accuracy>0</circle-accuracy>
|
||||
<contour-accuracy>0</contour-accuracy>
|
||||
<polyline-mode>0</polyline-mode>
|
||||
<render-texts-as-polygons>false</render-texts-as-polygons>
|
||||
<keep-other-cells>false</keep-other-cells>
|
||||
<keep-layer-names>false</keep-layer-names>
|
||||
<create-other-layers>true</create-other-layers>
|
||||
<layer-map>layer_map()</layer-map>
|
||||
</dxf>
|
||||
<cif>
|
||||
<wire-mode>0</wire-mode>
|
||||
<dbu>0.001</dbu>
|
||||
<layer-map>layer_map()</layer-map>
|
||||
<create-other-layers>true</create-other-layers>
|
||||
<keep-layer-names>false</keep-layer-names>
|
||||
</cif>
|
||||
<mag>
|
||||
<lambda>1</lambda>
|
||||
<dbu>0.001</dbu>
|
||||
<layer-map>layer_map()</layer-map>
|
||||
<create-other-layers>true</create-other-layers>
|
||||
<keep-layer-names>false</keep-layer-names>
|
||||
<merge>true</merge>
|
||||
<lib-paths>
|
||||
</lib-paths>
|
||||
</mag>
|
||||
</reader-options>
|
||||
<writer-options>
|
||||
<gds2>
|
||||
<write-timestamps>true</write-timestamps>
|
||||
<write-cell-properties>false</write-cell-properties>
|
||||
<write-file-properties>false</write-file-properties>
|
||||
<no-zero-length-paths>false</no-zero-length-paths>
|
||||
<multi-xy-records>false</multi-xy-records>
|
||||
<resolve-skew-arrays>false</resolve-skew-arrays>
|
||||
<max-vertex-count>8000</max-vertex-count>
|
||||
<max-cellname-length>32000</max-cellname-length>
|
||||
<libname>LIB</libname>
|
||||
</gds2>
|
||||
<oasis>
|
||||
<compression-level>2</compression-level>
|
||||
<write-cblocks>false</write-cblocks>
|
||||
<strict-mode>false</strict-mode>
|
||||
<write-std-properties>1</write-std-properties>
|
||||
<subst-char>*</subst-char>
|
||||
<permissive>false</permissive>
|
||||
</oasis>
|
||||
<cif>
|
||||
<polygon-mode>0</polygon-mode>
|
||||
</cif>
|
||||
<cif>
|
||||
<dummy-calls>false</dummy-calls>
|
||||
<blank-separator>false</blank-separator>
|
||||
</cif>
|
||||
<mag>
|
||||
<lambda>0</lambda>
|
||||
<tech/>
|
||||
<write-timestamp>true</write-timestamp>
|
||||
</mag>
|
||||
</writer-options>
|
||||
<d25>
|
||||
<src># 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
|
||||
|
||||
</src>
|
||||
</d25>
|
||||
<connectivity>
|
||||
<connection>30/0,33/0,Metal1</connection>
|
||||
<connection>Metal1,35/0,Metal2</connection>
|
||||
<connection>Metal2,38/0,Metal3</connection>
|
||||
<connection>Metal3,40/0,Metal4</connection>
|
||||
<connection>Metal4,41/0,Metal5</connection>
|
||||
<connection>Metal5,82/0,53/0</connection>
|
||||
|
||||
<symbols>Metal1='34/0+34/10'</symbols>
|
||||
<symbols>Metal2='36/0+36/10'</symbols>
|
||||
<symbols>Metal3='42/0+42/10'</symbols>
|
||||
<symbols>Metal4='46/0+46/10'</symbols>
|
||||
<symbols>Metal5='81/0+81/10'</symbols>
|
||||
</connectivity>
|
||||
</technology>
|
||||
|
|
@ -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"
|
||||
|
||||
Loading…
Reference in New Issue