# Copyright (c) 2012 Massachusetts Institute of Technology
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# 
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

# WARNING: Most commercial fabs will not be happy if you release their exact
# process information! If you derive these numbers through SPICE models,
# the process design kit, or any other confidential material, please round-off
# the values and leave the process name unidentifiable by fab (i.e. call it
# Bulk90LVT instead of TSMC90LVT) if you release parameters publicly. This
# rule may not apply for open processes, but you may want to check.

# All units are in SI, (volts, meters, kelvin, farads, ohms, amps, etc.)

# This file contains the model for a bulk 22nm LVT process
Name = Bulk22LVT

# Supply voltage used in the circuit and for characterizations (V)
Vdd = 0.8
# Temperature (K)
Temperature = 340

# =============================================================================
# Parameters for transistors
# =============================================================================

# Contacted gate pitch (m)
Gate->PitchContacted = 0.120e-6

# Min gate width (m)
Gate->MinWidth = 0.100e-6

# Gate cap per unit width (F/m)
Gate->CapPerWidth = 0.900e-9
# Source/Drain cap per unit width (F/m)
Drain->CapPerWidth = 0.620e-9

# Parameters characterization temperature (K)
Nmos->CharacterizedTemperature = 300.0
Pmos->CharacterizedTemperature = 300.0

#------------------------------------------------------------------------------
# I_Eff definition in Na, IEDM 2002
#       I_EFF = (I(VG = 0.5, VD = 1.0) + I(VG = 1.0, VD = 0.5))/2
#       R_EFF = VDD / I_EFF * 1 / (2 ln(2))
# This is generally accurate for when input and output transition times
# are similar, which is a reasonable case after timing optimization
#------------------------------------------------------------------------------
# Effective resistance (Ohm-m)
Nmos->EffResWidth = 0.700e-3
Pmos->EffResWidth = 0.930e-3

#------------------------------------------------------------------------------
# The ratio of extra effective resistance with each additional stacked
# transistor
#       EffResStackRatio = (R_EFF_NAND2 - R_EFF_INV) / R_EFF_INV)
# For example, inverter has an normalized effective drive resistance of 1.0.
# A NAND2 (2-stack) will have an effective drive of 1.0 + 0.7, a NAND3 (3-stack)
# will have an effective drive of 1.0 + 2 * 0.7. Use NORs for Pmos. This fit
# works relatively well up to 4 stacks. This value will change depending on the
# VDD used. 
#------------------------------------------------------------------------------
# Effective resistance stack ratio
Nmos->EffResStackRatio = 0.800
Pmos->EffResStackRatio = 0.680

#------------------------------------------------------------------------------
# I_OFF defined as |I_DS| for |V_DS| = V_DD and |V_GS| = 0.0
#       Minimum off current is used in technologies where I_OFF stops scaling
#       with transistor width below some threshold
#------------------------------------------------------------------------------
# Off current per width (A/m)
Nmos->OffCurrent = 100.0e-3
Pmos->OffCurrent = 100.0e-3
# Minimum off current (A)
Nmos->MinOffCurrent = 60e-9
Pmos->MinOffCurrent = 60e-9

# Subthreshold swing (V/dec)        
Nmos->SubthresholdSwing = 0.100
Pmos->SubthresholdSwing = 0.100
# DIBL factor (V/V)
Nmos->DIBL = 0.150
Pmos->DIBL = 0.150
# Subthreshold temperature swing (K/dec)
Nmos->SubthresholdTempSwing = 100.0
Pmos->SubthresholdTempSwing = 100.0
#------------------------------------------------------------------------------

# =============================================================================
# Parameters for interconnect
# =============================================================================

Wire->AvailableLayers = [Metal1,Local,Intermediate,Semiglobal,Global]

# Metal 1 Wire (used for std cell routing only)
# Min width (m)
Wire->Metal1->MinWidth = 32e-9
# Min spacing (m)
Wire->Metal1->MinSpacing = 32e-9
# Resistivity (Ohm-m)
Wire->Metal1->Resistivity = 5.00e-8
# Metal thickness (m)
Wire->Metal1->MetalThickness = 60.0e-9
# Dielectric thickness (m)
Wire->Metal1->DielectricThickness = 60.0e-9
# Dielectric constant
Wire->Metal1->DielectricConstant = 3.00

# Local wire, 1.0X of the M1 pitch
# Min width (m)
Wire->Local->MinWidth = 32e-9
# Min spacing (m)
Wire->Local->MinSpacing = 32e-9
# Resistivity (Ohm-m)
Wire->Local->Resistivity = 5.00e-8
# Metal thickness (m)
Wire->Local->MetalThickness = 60.0e-9
# Dielectric thickness (m)
Wire->Local->DielectricThickness = 60.0e-9
# Dielectric constant
Wire->Local->DielectricConstant = 3.00

# Intermediate wire, 2.0X the M1 pitch
# Min width (m)
Wire->Intermediate->MinWidth = 55e-9
# Min spacing (m)
Wire->Intermediate->MinSpacing = 55e-9
# Resistivity (Ohm-m)
Wire->Intermediate->Resistivity = 4.00e-8
# Metal thickness (m)
Wire->Intermediate->MetalThickness = 100.0e-9
# Dielectric thickness (m)
Wire->Intermediate->DielectricThickness = 100.0e-9
# Dielectric constant
Wire->Intermediate->DielectricConstant = 2.8

# Semiglobal wire, 4.0X the M1 pitch
# Min width (m)
Wire->Semiglobal->MinWidth = 110e-9
# Min spacing (m)
Wire->Semiglobal->MinSpacing = 110e-9
# Resistivity (Ohm-m)
Wire->Semiglobal->Resistivity = 2.60e-8
# Metal thickness (m)
Wire->Semiglobal->MetalThickness = 200e-9
# Dielectric thickness (m)
Wire->Semiglobal->DielectricThickness = 170e-9
# Dielectric constant
Wire->Semiglobal->DielectricConstant = 2.80        

# Global wire, 6.0X the M1 pitch
# Min width (m)
Wire->Global->MinWidth = 160e-9
# Min spacing (m)
Wire->Global->MinSpacing = 160e-9
# Resistivity (Ohm-m)
Wire->Global->Resistivity = 2.30e-8
# Metal thickness (m)
Wire->Global->MetalThickness = 280e-9
# Dielectric thickness (m)
Wire->Global->DielectricThickness = 250e-9
# Dielectric constant
Wire->Global->DielectricConstant = 2.60

# =============================================================================
# Parameters for Standard Cells
# =============================================================================

# The height of the standard cell is usually a multiple of the vertical
# M1 pitch (tracks). By definition, an X1 size cell has transistors
# that fit exactly in the given cell height without folding, or leaving
# any wasted vertical area

# Reasonable values for the number of M1 tracks that we have seen are 8-14
StdCell->Tracks = 11
# Height overhead due to supply rails, well spacing, etc. Note that this will grow
# if the height of the standard cell decreases!
StdCell->HeightOverheadFactor = 1.400

# Sets the available sizes of each standard cell. Keep in mind that
# 1.0 is the biggest cell without any transistor folding
StdCell->AvailableSizes = [1.0, 1.4, 2.0, 3.0, 4.0, 6.0, 8.0, 10.0, 12.0, 16.0]

